tjinjin's blog

インフラ要素多めの個人メモ

読書メモ:kubernetes本読んだ

About

先日購入したので読みました。手を動かしながらできるのでおすすめです。

入門 Kubernetes

入門 Kubernetes

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を削除しようとしたらめっちゃ時間かかった。

まとめ

最初の導入としていい本でした。これで多少話にはついていけそう。後はドキュメントや事例などを見つつ、いろいろ試しつつ学んでいきます。