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

Controllerを作ってみよう
~ Kubernetes Controllerハンズオン ~

bells17
January 30, 2024

Controllerを作ってみよう
~ Kubernetes Controllerハンズオン ~

bells17

January 30, 2024
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. Controllerを作ってみよう

    ~ Kubernetes Controllerハン
    ズ
    オン ~
    Kubernetes Wakaran Tokyo #
    2
    (
    2 0 2 3
    /
    0 1
    /
    3 0
    )


    @bells
    1 7

    View full-size slide

  2. ▶ @bells
    1
    7


    ▶ Software Engineer@
    3
    -shake inc.


    ▶ kubernetes & kubernetes-csi member


    ▶ Kubernetes Internal Organizer


    ▶ #kubenews


    ▶ X(Twitter): @bells
    1
    7
    _


    ▶ GitHub: @bells
    1
    7

    View full-size slide

  3. 今⽇のハンズオンについて
    ▶ KubernetesのSDK ”client-go” を使⽤して簡単なKubernetes Controllerを⾃作します


    ▶ kubebuilderなどを使⽤せず、client-goを直接使⽤することでコントローラーについての
    イメージを掴むことを主な⽬的としてハンズオンをやっていきたいと思います

    (コントローラーを書くだけならkubebuilderを使った⽅が楽だけど⾊々とラップされてる
    のでコントローラーの動作イメージを掴むことを主⽬的にする場合 client-go を直接使った
    ⽅が良いかなということで今回は client-go を使⽤するパターンを採⽤してます)


    ▶ kindを使⽤して構築したKubernetesクラスター上に⾃作したコントローラーをデプロイ

    して動作を確認できるようにしましょう


    ▶ client-go はGo⾔語で実装されているため、Go⾔語の実⾏環境も必要です

    View full-size slide

  4. 作成するコントローラー
    ▶ Deploymentに`sample-controller: “True”`アノテーションを設定するだけのシンプルな
    コントローラーです


    ▶ Kubernetesのコントローラー実装を読むために必要な内容を最低限掴むことが⽬的なので
    ハンズオンではシンプルなコントローラーを実装してみましょう


    ▶ 参考実装はこちら: https://github.com/bells
    1 7
    /k
    8
    s-controller-example


    + ↑のリポジトリを使⽤する場合vscode+devcontainerがセットアップされていればすぐ
    に動かして試すことができます


    + こちらを参考にしてもOKです https://github.com/kubernetes/sample-controller


    View full-size slide

  5. ⾃作する前にコントローラーの基礎知識について

    View full-size slide

  6. https://github.com/kubernetes/website/blob/fb
    6 3 6 4
    da
    0
    afd
    1 9
    e
    8
    a
    9 5 1 5
    aaae
    2
    de
    9
    bc
    7 4
    a
    0
    a
    6
    abd/static/images/docs/components-of-kubernetes.png
    まずはKubernetesのアーキテクチャ全体像から

    View full-size slide

  7. コントローラーのイメージはこんなん

    View full-size slide

  8. コントローラーとOperator
    ▶ コントローラー: Kubernetesのリソースなどを元に宣⾔された状態を実現する仕組み


    ▶ Operator: コントローラーとCRDなどを組み合わせて独⾃の機能を宣⾔的APIで実現する

    ⽅法


    みたいな感じかなと個⼈的に解釈してます


    (明確な定義が書いてあるの知ってる⼈いたら教えて)

    View full-size slide

  9. https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg
    client-go を使ったコントローラーのアーキテクチャ

    View full-size slide

  10. https://github.com/kubernetes/website/blob/fb
    6 3 6 4
    da
    0
    afd
    1 9
    e
    8
    a
    9 5 1 5
    aaae
    2
    de
    9
    bc
    7 4
    a
    0
    a
    6
    abd/static/images/docs/components-of-kubernetes.png
    kube-api-server以外のConponentは


    Controllerを中⼼として機能を実現している

    View full-size slide

  11. manifestをKubernetesに適⽤することで


    宣⾔されたmanifestの通りにコンテナが作成される

    View full-size slide

  12. API Serverがリソースの作成などのエンドポイントを提供
    今回作成したDeploymentやServiceの場合は図の”API Server”によって処理が⾏われる

    View full-size slide

  13. controller-managerが⼤量のコントローラーを実⾏制御

    View full-size slide

  14. スケジューラーもコントローラーのように


    各Podのスケジューリングを実⾏
    https://kubernetes.io/images/docs/scheduling-framework-extensions.png

    View full-size slide

  15. Kubeletも内部でコントローラー(的なものを)を駆使してPodを実⾏

    View full-size slide

  16. https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg
    client-go を使ったコントローラーのアーキテクチャ

    View full-size slide

  17. client-goの主要ライブラリ
    ▶ Re
    fl
    ector: 指定リソースをList & Watchでデータ取得&取得後の変更監視

    ~ Delta FIFO Queue にデータを渡す


    ▶ Informer: Delta FIFO Queue から取り出したデータを Indexer にキャッシュ

    & 登録されたイベントハンドラーを呼び出し


    ▶ Indexer: キャッシュされたデータの管理(ローカルキャッシュ)


    ▶ Workqueue: イベントハンドラーからデータをキューイングするためのキュー

    コントローラーの調整ループを管理するために使⽤

    View full-size slide

  18. 基本的な知識は以上

    View full-size slide

  19. ということでコントローラーを作っていきましょう

    View full-size slide

  20. 作成するコントローラー
    ▶ Deploymentに`sample-controller: “True”`アノテーションを設定するだけのシンプルな
    コントローラーです


    ▶ コントローラーのイメージを掴むために必要な内容を⾃分で書いてみることが⽬的なので
    ハンズオンではシンプルなコントローラーを実装してみましょう


    ▶ 参考実装はこちら: https://github.com/bells
    1 7
    /k
    8
    s-controller-example


    ▶ こちらを参考にしてもOKです: https://github.com/kubernetes/sample-controller


    ▶ 「⾃分で実装するのが難しそう」という⽅は↑を眺めてみるのでもOK

    View full-size slide

  21. 終わって時間が余った⽅は
    ▶ Deploymentに加えて、ReplicaSetとPodにも`sample-controller: “True”`アノテーション
    を設定できるようにしてみてください


    ▶ Kubernetes本体で実装されているコントローラー実装を読んでみてください


    + clusterrole-aggregation-controller


    ▶ コントローラー実装にあたって使⽤していた client-go のライブラリ実装を

    読んでみてください


    + Re
    fl
    ector


    + Informer


    + Indexer


    + Delta FIFO Queue


    + Workqueue

    View full-size slide

  22. ハンズオン ~ 20:25まで

    View full-size slide

  23. どうだったでしょうか?

    View full-size slide

  24. Kubernetesのコントローラーが書ける & 読めると
    ▶ Operatorを⾃作したりとKubernetesをプラットフォーム基盤として拡張する


    ▶ Kubernetesのコードを読むのにも役⽴つ


    ▶ 宣⾔的APIの実態をコードレベルで理解することで考え⽅として普段の開発でも活きる


    などなどそれなりに⾊々と良いことがあるかもしれません

    View full-size slide

  25. NEXT ACTIONS
    ▶ kubebuilderでOperator作成を試してみる


    ▶ Kubernetesのコントローラーの実装を読んでみる


    ▶ client-goやkubebuilderで実装されたOperatorのOSSにコントリビューションしてみる


    ▶ Kubernetesにコントリビューションをしてみる


    このあたりにチャレンジしてみても良いかも!

    View full-size slide

  26. Thanks / Question?
    ▶ @bells
    1 7

    ▶ Slide: https://speakerdeck.com/bells
    1 7

    ▶ @bells
    1 7
    _

    View full-size slide