全体図
Deploymentは、Nodeをまたぎ、さらにReplicasetを包み込んでいる緑色の点線のイメージ。
Deploymentとは
PodのDeploy時に新しいReplicaSetを作成し、旧ReplicaSet管理下の旧Podを一つずつ減らしながら、新ReplicaSet下の新Podを増やし、段階的に置き換えて無停止更新します。また、ロールバックも同様の仕組みで無停止で行います。
実運用ではReplicasetやPod単体で管理することはほとんどなく、このDeploymentでデプロイを管理します。
Deploymentの位置づけ
この図の様に、ReplicasetはPodのラッパーであり、さらにそれらを包み込み世代管理をしているのがDeploymentである。
Deploymentを試す
Deployment作成
kubectl create deployment --image gcr.io/google-samples/hello-app:1.0 helloworld
DeploymentのUpdate
kubectl set image deploy helloworld helloworld=gcr.io/google-samples/hello-app:2.0
dockerImageをセットすることで簡単にUpdateすることができる。
Deploymentのロールアウト
kubectl rollout undo deploy helloworld
undoは一つ前の世代へpodをロールバックさせます。
まとめ
無停止更新やロールバック以外の機能(自動復旧やレプリカ増減)などはReplicasetで説明したので割愛します。
今回はコマンドで作成しましたが、実際にはdry-runすることでYamlファイルを吐き出し、それらを必要に応じて編集するながれをとります。
これはなぜかと言うと、yamlなどのファイルとして残しておけばgithubなどでソース管理することで履歴がのこり、変更Historyを追うことができます。
もしもコマンドだけで行うと、コマンド実行者にしか具体的なことはわからなくなってしまい、何か障害が起きた時にdebugging がしにくくなります。
このあたりも、昨今「infrastructure as code」と騒がれている理由の一つだと思います。
インフラの見える化と、情報共有は無駄な時間を削減する良い選択肢です。