Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kubernetesコントローラのプログラミングモデル

 Kubernetesコントローラのプログラミングモデル

Kubernetesにおいてシステムのあるべき状態を保つためのコントローラというプログラムのプログラミングモデルについて説明するスライドです。

Satoru Takeuchi
PRO

August 27, 2022
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. kubernetesコントローラの プログラミングモデル Satoru Takeuchi twitter: satoru_takeuchi kanazawa.rb#120 LT大会ネタ その2

  2. Kubernetesとは • 分散アプリ実行基盤 • 管理者はマニフェストと呼ばれるYAMLを書いて以下コマンド実行 ◦ kubectl apply app.yaml ◦

    マニフェストは分散KVS etcdの中に「リソース」として永続化される • K8sはマニフェストの状態になるようにアプリを維持 ◦ リソース監視&クラスタの状態変化をするプログラムをコントローラと呼ぶ 2 node node アプリ アプリ アプリ アプリ Kubernetes etcd(分散kvs) リソース リソース 監視 あるべき状態にする Kubernetesクラスタ
  3. アプリに対応するリソース • Podリソース: アプリに対応するPodを管理 ◦ アプリを構成する1個以上のコンテナを記述する • ReplicaSetリソース: アプリの冗長度を管理 ◦

    アプリの冗長度を表現する replicasフィールドがある ◦ “replicas: 3”なら3冗長を保つ 3
  4. ReplicaSetのマニフェストをapplyすると… • ReplicaSetリソースができる 4 node node Kubernetes etcd ReplicaSet リソース

    replicas: 2 つくる Kubernetesクラスタ
  5. ReplicaSetリソースができると… replicasフィールドの数だけのPodリソースができる 5 node node Kubernetes etcd ReplicaSet リソース replicas:

    2 Kubernetesクラスタ Pod リソース Pod リソース つくる
  6. Podリソースができると… node上にPodができる! 6 node node Kubernetes etcd ReplicaSet リソース replicas:

    2 見る つくる Kubernetesクラスタ Pod リソース Pod リソース Pod Pod
  7. コントローラのプログラミングモデル • 一回起動してからreconcilerという処理が頭から終わりまで走りきる ◦ 「起動したらイベントの種類に応じて処理をする」ではない • 一連の処理をreconciliation loopと呼ぶ ◦ 鍵は「冪等性」

    • 例: Markdown viewコントローラ ◦ 資料: つくって学ぶKubebuilder ▪ https://zoetrope.github.io/kubebuilder-training/ ◦ markdown viewコントローラのアーキテクチャ ▪ https://zoetrope.github.io/kubebuilder-training/introduction/sample.html ◦ reconciliation loopの実装 ▪ https://github.com/zoetrope/kubebuilder-training/blob/main/codes/40_reconcile/controller s/markdownview_controller.go#L63-L104
  8. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_SERVICE: サービスを作る CREATE_DEPLOY: deploymentを作る(あとはk8sがpodを作ってくれる) CREATE_CM: configmapを作る } }
  9. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_SERVICE: サービスを作る CREATE_DEPLOY: deploymentを作る(あとはk8sがpodを作ってくれる) CREATE_CM: configmapを作る } } configmapがないという通 知がくる
  10. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_SERVICE: サービスを作る CREATE_DEPLOY: deploymentを作る(あとはk8sがpodを作ってくれる) CREATE_CM: configmapを作る } } deploymentがないという 通知がくる
  11. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_SERVICE: サービスを作る CREATE_DEPLOY: deploymentを作る(あとはk8sがpodを作ってくれる) CREATE_CM: configmapを作る } } サービスがないという通 知がくる
  12. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_SERVICE: サービスを作る CREATE_DEPLOY: deploymentを作る(あとはk8sがpodを作ってくれる) CREATE_CM: configmapを作る } } こうではない
  13. Markdown viewコントローラ(本物) • reconciliation loopの実装 ◦ https://github.com/zoetrope/kubebuilder-training/blob/main/codes/40_reconcile/controllers/mar kdownview_controller.go#L63-L104 • なんらかのイベントで起き上がるとreconciliation

    loopを呼ぶ ◦ MarkdownViewリソースを見てあるべき姿を知る ◦ markdownのファイル名が入った ConfigMapリソースを… ▪ あるべき姿を記述&更新すべきなら更新 ◦ アプリを動かすための Deploymentリソースを… ▪ あるべき姿を記述&更新すべきなら更新 ◦ アプリ使用者へのendpointとなるServiceリソースを… ▪ あるべき姿を記述&更新すべきなら更新 • 前から順番に全部あるべき姿にする • 冪等性を保つように作られている
  14. まとめ • Kubernetesはシステムをユーザが決めた「あるべき姿」に保つ • あるべき姿を記述するためにリソースという概念がある • クラスタの現状とあるべき姿のギャップを埋める処理をするプログラムを「コントロー ラと呼ぶ」 • コントローラはあるべき姿を保つために冪等性を保持するよう動く