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

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

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

以下動画のテキストです。
https://youtu.be/0okzTgJ7-vs

Satoru Takeuchi
PRO

August 30, 2022
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

  1. kubernetesのコントローラの プログラミングモデル Satoru Takeuchi twitter: satoru_takeuchi 1

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

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

    アプリの冗長度を表現する replicasフィールドがある ◦ “replicas: 3”なら3冗長を保つ • Deploymentリソース ◦ アプリのバージョン管理 ◦ 状態変化を記憶している ◦ たとえば過去のバージョンにロールバックできる 3
  4. コントローラ • リソース監視&クラスタの状態変化をするプログラムをコントローラと呼ぶ • 1つのリソースごとにコントローラが存在する • 一つのバイナリ内に複数のコントローラを含むことも ◦ Deployment, ReplicaSetなどのコントローラは

    controller-managerという一つのプログラムにまと まっている • カスタムリソースはカスタムコントローラが担当 4 node node アプリ アプリ アプリ アプリ Kubernetes etcd(分散kvs) リソース リソース 監視 あるべき状態にする Kubernetesクラスタ コントローラ コントローラ コントローラ
  5. アプリのDeploymentのマニフェストをapplyすると… • Deploymentリソースができる 5 node node Kubernetes etcd Deployment リソース

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

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

    2 Kubernetesクラスタ Pod リソース Pod リソース つくる ReplicaSet コントローラ 見る Deployment リソース replicas: 2
  8. Podリソースができると… • node上にPodができる! ◦ Podリソースの監視とnode割り当てはkube-schedulerという別のプログラムが担当 8 node node Kubernetes etcd

    ReplicaSet リソース replicas: 2 見る つくる Kubernetesクラスタ Pod リソース Pod リソース Pod Pod Deployment リソース replicas: 2
  9. コントローラのプログラミングモデル • やること ◦ 自分の担当するリソースを監視 ◦ 担当リソースに変更があれば動き出す ◦ あるべき姿にするための処理をする •

    例: Markdown viewコントローラ ◦ ユーザが定義したMarkdownをレンダリングしたものをブラウザで見られる ◦ レンダリングにはmdBookを使う ▪ https://github.com/rust-lang/mdBook ◦ 資料: つくって学ぶKubebuilder ▪ https://zoetrope.github.io/kubebuilder-training/ 9
  10. 前提知識 • これまで紹介していなかったリソース ◦ ConfigMap: Podにデータを読み込ませるのに使う ◦ Service: Kubernetesアプリをユーザから使わせるのに使う ▪

    たとえばendpointが入っている • ユーザ独自リソースも作れる ◦ カスタムリソース: 独自に作ったリソース ◦ カスタムコントローラ : カスタムリソースを担当するコントローラ 10
  11. Markdown viewアプリのあるべき姿 ここに書かれたendpointに ブラウザからアクセスすると レンダリング済markdownが 見られる Markdownのデータが入る 11

  12. Markdown viewコントローラのアーキテクチャ • https://zoetrope.github.io/kubebuilder-training/introduction/sample.html 1 2 3 4 apiVersion: view.zoetrope.github.io/v1

    kind: MarkdownView metadata: name: markdownview-sample spec: markdowns: SUMMARY.md: | # Summary - [Page1](page1.md) page1.md: | # Page 1 一ページ目のコンテンツです。 replicas: 2 viewerImage: "peaceiris/mdbook:latest" 12
  13. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } 13
  14. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } ConfigMapがないというevent発生 14
  15. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } Deploymentがないというevent発生 15
  16. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } Serviceがないというevent発生 16
  17. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } こうではない 17
  18. コントローラのプログラミングモデル • 一回起動してからreconcilerという処理が頭から終わりまで走りきる ◦ 「起動したらイベントの種類に応じて処理をする」ではない • 一連の処理をreconciliation loopと呼ぶ ◦ 鍵は「冪等性」

    18
  19. 本物のreconciliation loopの簡略版 func (r *MarkdownViewReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result,

    error) { … var mdView viewv1.MarkdownView r.Get(ctx, req.NamespacedName, &mdView) … r.reconcileConfigMap(ctx, mdView) … r.reconcileDeployment(ctx, mdView) … r.reconcileService(ctx, mdView) … } https://github.com/zoetrope/kubebuilder-training/blob/main/codes/40_reconcile/controllers/markdownview_controller.go#L63-L104 19
  20. ConfigMapのreconciliation loop(の省略版) func (r *MarkdownViewReconciler) reconcileConfigMap(ctx context.Context, mdView viewv1.MarkdownView) error

    { … ctrl.CreateOrUpdate(ctx, r.Client, cm, func() error { if cm.Data == nil { cm.Data = make(map[string]string) } for name, content := range mdView.Spec.Markdowns { cm.Data[name] = content } return nil }) … } https://github.com/zoetrope/kubebuilder-training/blob/24bb3d86c5459dbc086f241069003a39a0d8c1af/codes/40_reconcile/controllers/markdownview_controller.go#L109-L134 20
  21. まとめ • Kubernetesはシステムをユーザが決めた「あるべき姿」に保つ • あるべき姿を記述するためにリソースという概念がある • クラスタの現状とあるべき姿のギャップを埋める処理をするプログラムを「コントロー ラと呼ぶ」 • コントローラはあるべき姿を保つために冪等性を保持するよう動く

    21