#あらすじ
k8sをさわっていると、いろんな名詞、機能名がでてきて、気を抜くと機能の一部のこといってるのか、概要を表しているのか、もしくは通称で呼んでいて実は同じこといってたりといろいろ混乱する時がある。コントローラーも名前だけ聞くと何かをコントロールしてくれるんだろう、とはわかるけど、何をどうコントロールしてくれるのか、いくつも種類があるのか、どんな感じで使うといいのか、もしくは使えないのか等々わかっていないことが多い。
とりあえず今回は使う頻度の多いアプリデプロイ時に使うコントローラーについてまとめてみようと思います。
#そもそもコントローラとは
k8sの公式サイト(https://kubernetes.io/ja/docs/concepts/architecture/controller/) では
コントローラー = コントロールループ
つまり、ずっと動きっぱなしで、常にシステムの状態を監視していて、できる限り理想の状態にいるように調整してくれるものらしい。
(注) 実際の調整を行う時は大抵API Serverへリクエストを投げるとのこと。
#アプリをデプロイするときによく使う3つのコントローラー
・Deployments
・Statefulsets
・Daemonsets
これら以外にもReplicationContollerというのもあり、文字通りReplica Setsをコントロールするものだけど、その後出たDeploymentsの中でReplica Setsの設定もできてしまうので、そちらを使う方が今は主流らしい。
ちなみに
DeploymentsコントローラーはReplicaSetsの上層コントローラーで、ReplicaSetsはPodの上層コントローラー。つまりDeploymentsコントローラーだけあればReplicaSetsもPodsの設定も全てできてしまうということ。
ちなみに2
ここでとりあげているコントローラーはWorkload Resourcesのメンバーでもあって、上記以外にJobやCronJobも入ります。
参考: https://kubernetes.io/docs/concepts/workloads/controllers/
ちょっとズレるけど全てのresourceをリストアップするコマンド
$ kubectl api-resources
#Deployments
- statelessなPodを作成。保存しておきたいデータはmountされたvolumeにいれる。ただし、そのデータは全てのreplica sets間で共有される
- update時はrolling updateといって、先に新規Podが問題なく作られたのを確認した上で古いpodが削除される
- それぞれのpodはhash番号がつけられる
- historyにある以前のstable versionに戻せる
historyを表示kubectl rollout history deployment/app
versionを指定してrollbackkubectl rollout undo deployment/app --to-revision=2
参考: https://learnk8s.io/kubernetes-rollbacks
#Statefulsets
- statefulなpodを作成
- replica podは順番に作成され、0から順番に番号がつけられる
- それぞれのPodは自分専用のPersistent Volumeをもつ。(他と共有しない)
- ロールバックができない
#Daemonsets
- 全てのNode上に存在し、例えば監視やログのために使われる
- ロールバックができない
- kube-controller-managerはDaemonsetsの1例
- Taints and Tolerations - NodeがTaintとして設定している内容とPodのもつTolerationの内容が一致したらそのNodeにそのPodをのせることが可能となる(必須ではない)。逆にいうと、あるNodeにのせたくない時はTolerationをそのNodeに合わせないようにする。
参考: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
#まとめ
コントローラーといっても他にもendpoints controller, namespace controller, and serviceaccounts controller等々(ちなみにこれらはkube-controller-managerの中にデフォルトで入っている)、多数ありそれぞれが担う役割もはっきりしているようなので、今後少しづつまとめながら理解を深めていければと思ってます。
JobとCronJobの違いもどっかでまとめたい。
#参考にさせてもらった資料
Pods, Deployments and Replica Sets: Kubernetes Resources Explained (https://www.cloudsavvyit.com/10107/pods-deployments-and-replica-sets-kubernetes-resources-explained/)
When to use Deployments vs Daemonsets vs Statefulsets (https://someweb.github.io/devops/deployments-daemonsets-statefulset/)
https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/