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

    View Slide

  2. Kubernetesとは
    ● 分散コンテナアプリ実行基盤
    ● 管理者はマニフェストと呼ばれるYAMLを書いて以下コマンド実行
    ○ kubectl apply app.yaml
    ○ マニフェストは分散KVS etcdの中に「リソース」として永続化される
    ● K8sはetcd内のリソースたちが定義する状態になるようにアプリを維持
    2
    node node
    アプリ アプリ アプリ アプリ
    Kubernetes
    etcd(分散kvs)
    リソース リソース
    監視
    あるべき状態にする
    Kubernetesクラスタ

    View Slide

  3. アプリに対応するリソース
    ● Podリソース: アプリに対応するPodを管理
    ○ アプリを構成する1個以上のコンテナを記述する
    ● ReplicaSetリソース: アプリの冗長度を管理
    ○ アプリの冗長度を表現する replicasフィールドがある
    ○ “replicas: 3”なら3冗長を保つ
    ● Deploymentリソース
    ○ アプリのバージョン管理
    ○ 状態変化を記憶している
    ○ たとえば過去のバージョンにロールバックできる
    3

    View Slide

  4. コントローラ
    ● リソース監視&クラスタの状態変化をするプログラムをコントローラと呼ぶ
    ● 1つのリソースごとにコントローラが存在する
    ● 一つのバイナリ内に複数のコントローラを含むことも
    ○ Deployment, ReplicaSetなどのコントローラは controller-managerという一つのプログラムにまと
    まっている
    ● カスタムリソースはカスタムコントローラが担当
    4
    node node
    アプリ アプリ アプリ アプリ
    Kubernetes
    etcd(分散kvs)
    リソース リソース
    監視
    あるべき状態にする
    Kubernetesクラスタ
    コントローラ
    コントローラ
    コントローラ

    View Slide

  5. アプリのDeploymentのマニフェストをapplyすると…
    ● Deploymentリソースができる
    5
    node node
    Kubernetes
    etcd
    Deployment
    リソース
    replicas: 2
    つくる
    Kubernetesクラスタ

    View Slide

  6. Deploymentリソースができると…
    ● ReplicaSetリソースができる
    6
    node node
    Kubernetes
    etcd
    ReplicaSet
    リソース
    replicas: 2
    見る
    Kubernetesクラスタ
    Deployment
    コントローラ
    Deployment
    リソース
    replicas: 2
    つくる

    View Slide

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

    View Slide

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

    View Slide

  9. コントローラのプログラミングモデル
    ● やること
    ○ 自分の担当するリソースを監視
    ○ 担当リソースに変更があれば動き出す
    ○ あるべき姿にするための処理をする
    ● 例: Markdown viewコントローラ
    ○ ユーザが定義したMarkdownをレンダリングしたものをブラウザで見られる
    ○ レンダリングにはmdBookを使う
    ■ https://github.com/rust-lang/mdBook
    ○ 資料: つくって学ぶKubebuilder
    ■ https://zoetrope.github.io/kubebuilder-training/
    9

    View Slide

  10. 前提知識
    ● これまで紹介していなかったリソース
    ○ ConfigMap: Podにデータを読み込ませるのに使う
    ○ Service: Kubernetesアプリをユーザから使わせるのに使う
    ■ たとえばendpointが入っている
    ● ユーザ独自リソースも作れる
    ○ カスタムリソース: 独自に作ったリソース
    ○ カスタムコントローラ : カスタムリソースを担当するコントローラ
    10

    View Slide

  11. Markdown viewアプリのあるべき姿
    ここに書かれたendpointに
    ブラウザからアクセスすると
    レンダリング済markdownが
    見られる
    Markdownのデータが入る
    11

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. コントローラのプログラミングモデル
    ● 一回起動してからreconcilerという処理が頭から終わりまで走りきる
    ○ 「起動したらイベントの種類に応じて処理をする」ではない
    ● 一連の処理をreconciliation loopと呼ぶ
    ○ 鍵は「冪等性」
    18

    View Slide

  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

    View Slide

  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

    View Slide

  21. まとめ
    ● Kubernetesはシステムをユーザが決めた「あるべき姿」に保つ
    ● あるべき姿を記述するためにリソースという概念がある
    ● クラスタの現状とあるべき姿のギャップを埋める処理をするプログラムを「コントロー
    ラと呼ぶ」
    ● コントローラはあるべき姿を保つために冪等性を保持するよう動く
    21

    View Slide