読書メモ:kubernetes本読んだ
About
先日購入したので読みました。手を動かしながらできるのでおすすめです。
- 作者: Kelsey Hightower,Brendan Burns,Joe Beda,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/03/22
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
kubenetes環境
GKE上に構築しました。
$ kubectl version --short Client Version: v1.10.1 Server Version: v1.9.6-gke.1
メモ
メモしてたので一応置いておきます。
6
- kubectl run はdeploymentを作るコマンドっぽい。podsをdeleteしても復活してきた。
7
- k8sはservice毎に仮想IPを振ることでロードバランスする
- コンテナのresolv.confを見てみると
search default.svc.cluster.local svc.cluster.local cluster.local c.dark-lexicon-176801.internal google.internal
となっている。なので、Service名だけでの名前解決ができる。 - deploymentsはオンラインでeditorを使って変更できるっぽい。すごい。
- ClusterIP/NodePort
- Endpointsがいまいちピンとこない。
- ServiceオブジェクトはSDの仕組みに特化したものっぽい
8 ReplicaSet
- ReplicaSetはPodのテンプレートみたいなやつ
- ReplicaSetをdeploymentが管理しているっぽい
- コンテナが何らかの状態でヘルスチェックに失敗した時、新しいpodを起動しつつ、おかしなやつを切り離す動きをする(Labelを変更して切り離す)。Podが残っているのでデバッグしやすい
- scaleコマンドで一時的にスケールアウト可能だが、ReplicaSetの設定も変更しないと永続的な変更にならない。
- 水平Podオートスケーリング(HPA)にはheapsterが必要
- スケーリングの設定はReplicaSetにはなくて、heapseterが持っている
9 DaemonSet
- 各ノードに1台だけ立てたいようなものを管理する(fluendとかdatadogとか)
- ECSでいうところの制約条件をLabelで制御できるっぽい
- p112のget podsの部分はfluentdはkube-systemのnsなので出力されない
10 Job
- batch処理用の仕組み
- ジョブの完了を検知しないといけない
- jobのrestartPolicyをNeverにするとPodでエラーが起きたときにそのPodをkillし新しいPodを立ち上げようとする。リソースを食いまくるので注意。(spec.backofLimitが1.8で設定されたようなので、default6回で止まる)
11 ConfigMap/Secret
- ConfigMapは小さなファイルシステムを作るオブジェクト
- ConfigMapはマウントしたり、環境変数として定義したりして使う。コンテナのコマンドライン引数にも展開できる(便利そう
- Secretは機密情報を保存するためのもの
- ConfigMapと同じような使い方っぽい?
- 設定の更新をすると動いているコンテナに対し設定は更新される。(プロセスの読み直しが起こるわけではない)コンテナも起動し直した方がいいかも。
12 Deployment
- 新しいバージョンをリリースするための仕組み。Pod/ReplicaSetは変更されないコンテナを扱うためのもの。
- DeploymentはReplicaSetを管理している。Labelを使って関係性を表現している。
- ReplicaSetを直接scalingしてもDeploymentsが修正しようとしてしまう。
- rollout中に問題があったときに一時停止したり、ロールバックしたりできる。
- マニフェストの管理とかちゃんとしないと大変そう
- deployment戦略としてはrolling updateが推奨。アプリ側で後方互換を考えた作りにしてくれないと厳しい。このあたりはアプリケーションを作る人のスキルなのかな。
- rollingupdateのmaxUnavailableとmaxSurgeはECSと同じ感じっぽい
- DeploymentコントローラはReadiness probeの結果でPodのステータスを判断するらしい
13 ストレージ
- 外部のストレージをkubenetesのオブジェクトとしてimportできるらしい。adapterみたいなやつ?
- Serviceと定義してCNAMEをexternalNameに指定するのがよさそう。IP指定は大変そう
- 信頼性のあるPodで永続的なDBとかを動かすのはどうなんだろうな
- PersistentVolumeでVolumeを作り、そこにつなぐためのオブジェクト?をPersistentVolumeClaimで作る感じ?
- GKEだとpvのところでWarningになってclaimに失敗した
- バージョンの問題かはよくわからなかったけど、SCを自分で作ってPV->PVCとstorageClassNameを指定したらうまくいった
- Dynamic volume provisioningが利用できるとSC -> PVCが行けるっぽい?
- StatefulSet: 複製されたPodのグループ。ホスト名とかが一意
- consulとかでクラスタ組むときに使えそう
- StatefulSetは単純にpvcを使えない。templateを利用する
- Statefulsetを削除しようとしたらめっちゃ時間かかった。
まとめ
最初の導入としていい本でした。これで多少話にはついていけそう。後はドキュメントや事例などを見つつ、いろいろ試しつつ学んでいきます。