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

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

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

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

Satoru Takeuchi

August 30, 2022
Tweet

More Decks by Satoru Takeuchi

Other Decks in Technology

Transcript

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

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

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

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

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

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

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

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

    たとえばendpointが入っている • ユーザ独自リソースも作れる ◦ カスタムリソース: 独自に作ったリソース ◦ カスタムコントローラ : カスタムリソースを担当するコントローラ 10
  9. 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
  10. Markdown viewコントローラ(想像しがちなもの) while (event := wait()) { case event {

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

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

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

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

    CREATE_CONFIGMAP: ConfigMapリソースを作る CREATE_DEPLOYMENT: Deploymentリソースを作る(あとはk8sがpodを作ってくれる) CREATE_SERVICE: SERVICEリソースを作る } } こうではない 17
  15. 本物の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
  16. 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