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

how-to-make-the-helm-operator

matsuo
March 12, 2021

 how-to-make-the-helm-operator

matsuo

March 12, 2021
Tweet

More Decks by matsuo

Other Decks in Technology

Transcript

  1. マスター タイトルの書式設定
    Operator SDKを用いた
    具体的なOperatorの作り方について
    CNDO2021

    View full-size slide

  2. マスター タイトルの書式設定
    自己紹介
    1
     松尾 史彦
     インフラエンジニア
     株式会社オージス総研

    View full-size slide

  3. マスター タイトルの書式設定
    Operatorとは
    2

    View full-size slide

  4. マスター タイトルの書式設定
     Kubernetesアプリケーションを運用知見とともに、パッケージ化、デプロイ、
    管理する手段
     Operators Are Software SREs
    Operatorとは
    3
    参考)https://kccnceu19.sched.com/event/MRyx/sponsored-keynote-expanding-the-kubernetes-
    operator-community-rob-szumski-principal-product-manager-for-openshift-red-hat
    参考)O’Reilly Kubernetes Operators
    Operator

    View full-size slide

  5. マスター タイトルの書式設定
    何が出来るのか
    4
     Capability Level
     将来はk8sの運用問題解決=Operatorを作る、だと個人的に思っている
     ソフトウェアSREを作る時代が来る?
     Auto PilotなOperatorを作れば、運用は不要?
    参考)https://sdk.operatorframework.io/docs/advanced-topics/operator-capabilities/operator-capabilities/

    View full-size slide

  6. マスター タイトルの書式設定
    どのような仕組みなのか
    5
    • k8sの標準Controllerの例
    • ノードやPodがダウンした場合の通知と対応(node controller、replication controller)
    • ServiceとPodの紐づけを行う(endpoint controller)、… → この宣言的な仕組みを拡張して作る
    Pod C
    Pod C
    replica=2
    Pod C
    Pod C
    継続的に
    監視/対応
    Podダウン検知、
    Pod作成
    Pod希望
    数の把握
    Podダウン
    参考)https://kubernetes.io/ja/docs/concepts/overview/components/

    View full-size slide

  7. マスター タイトルの書式設定
    どうやって作るのか
    6

    View full-size slide

  8. マスター タイトルの書式設定
    どうやって作るのか?
    7
     Kubernetes-sigs/kubebuilder(star 3.6k)
     CLIによりテンプレートの作成
     Goでの開発オンリー
     Operator-framework/operator-sdk(star 4.4k)←今回はこれ
     3つのプラグイン(Helm、Ansible、golang)
     基本的にkubebuilderと同じ作り
     OLM連携やscorecardが独自の機能としてある
     CNCF Incubating Project
     Kudobuilder/kudo (star 0.8k)
     Metacontroller/metacontroller (star 0.1k)
    参考)https://kubernetes.io/ja/docs/concepts/extend-kubernetes/operator/#writing-operator
    ※Star数は2021/2/24時点

    View full-size slide

  9. マスター タイトルの書式設定
    どうやって作るのか?
    8
     Operator-sdkのドキュメントが不十分な場合は、kubebuilderのドキュメントも
    参考に見てみる
     どちらもアップストリームのコントローラランタイムやツールを利用しており、
    作りが似ているため、序盤の全体の理解や、不明な点の推測に役立つ
    https://book.kubebuilder.io/
    https://sdk.operatorframework.io/docs/

    View full-size slide

  10. マスター タイトルの書式設定
    Auto Pilotへの道のり
    9
     実際は平坦ではなく、登り
    1 2 3 4 5
    分析、自動対応
    ログ取得、アラート ログ取得、アラート
    バックアップ
    リストア
    (バックアップ)
    (リストア)
    (バックアップ)
    (リストア)
    アップグレード (アップグレード) (アップグレード) (アップグレード)
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック

    View full-size slide

  11. マスター タイトルの書式設定
    Operator-SDKについて
    10
     Operator SDKのプラグインごとの、capability level到達可能度合い
     今回はhelmプラグインでBasic Installを実装
    参考)https://sdk.operatorframework.io/docs/advanced-topics/operator-capabilities/operator-capabilities/

    View full-size slide

  12. マスター タイトルの書式設定
    Operator(helm)実装の流れ
    11

    View full-size slide

  13. マスター タイトルの書式設定
    Operator(helm)実装の流れ
    12
     1. Operator開発
     プロジェクト作成
     Helm-chart定義
     RBAC定義
     2. Operator設定、ビルド、デプロイ
     CRD作成
     Operatorのビルド
     Operatorのデプロイ
     3. Operator利用
     CRの作成

    View full-size slide

  14. マスター タイトルの書式設定
    Operator(helm)実装の流れ
    13
    Operator開発
    k8s API
    k8s オブジェクト
    Deployment
    CRD
    (Custom Resource
    Definition)
    Helm Pod
    (※CustomController)
    CRの内容
    を常時監視
    CR
    (Custom Resource)
    新CRDのAPI経
    由でCRを作成
    API(CRD)
    作成
    API経由で
    CR作成
    Operator-sdkでテ
    ンプレ作成、開発
    CRD.yaml
    コンテナ
    ビルド
    デプロイ
    1.開発 2.設定
    K8s標準オブジェクト
    RBAC
    k8s管理者
    Operator
    利用者
    Operator
    開発者
    CRをvalueとしてhelmで
    k8s標準オブジェクトを
    install(コントロール)
    CR.yaml
    CRDファイル
    連携
    helm-chart/
    templates/*.yaml
    values.yaml
    Dockerfile
    Helm用Manifest
    ・Deployment
    ・RBAC
    ※主な設計
    要素部分

    3.利用

    View full-size slide

  15. マスター タイトルの書式設定
    1. Operator開発
    14

    View full-size slide

  16. マスター タイトルの書式設定
    1. Operator開発
    15
    Operator開発
    k8s API
    k8s オブジェクト
    Deployment
    CRD
    (Custom Resource
    Definition)
    Helm Pod
    (※CustomController)
    CRの内容
    を常時監視
    CR
    (Custom Resource)
    新CRDのAPI経
    由でCRを作成
    API(CRD)
    作成
    API経由で
    CR作成
    Operator-sdkでテ
    ンプレ作成、開発
    CRD.yaml
    コンテナ
    ビルド
    デプロイ
    1.開発 2.設定
    K8s標準オブジェクト
    RBAC
    k8s管理者
    Operator
    利用者
    Operator
    開発者
    CRをvalueとしてhelmで
    k8s標準オブジェクトを
    install(コントロール)
    CR.yaml
    CRDファイル
    連携
    helm-chart/
    Dockerfile
    Helm用Manifest
    ・Deployment
    ・RBAC
    ※主な設計
    要素部分

    3.利用

    View full-size slide

  17. マスター タイトルの書式設定
    1. Operator開発 – プロジェクト作成
    16
     プロジェクトを作成する
     前提としてoperator-sdkのバージョンはv1.2.0(2021/2/27時点の最新はv1.4.2)
     プロジェクト作成時のoperator-sdkのオプションを検討する。
    $ operator-sdk init --plugins=xx --domain=xx --group=xx --version=xx --kind=xx
    --plugins helmを必ず指定する。
    --domain 作成するCRDのトップレベルドメイン部分を指定する(group."domain")、com等で良いと思われる。
    --group 作成するCRDのドメイン部分を指定する("group".domain)、会社名等で良いと思われる。
    --version 開発中はv1alpha等を指定する。OperatorをGAするタイミングで適切に変更する。
    --kind Operatorで監視するカスタムリソース名を指定する。一般的にはアプリやシステム名を記載する。

    View full-size slide

  18. マスター タイトルの書式設定
    1. Operator開発 – プロジェクト作成
    17
     作成されるもの
    $ tree -L 2
    .
    ├── bin
    │ └── kustomize
    ├── config
    │ ├── crd ※ CRDのManifest
    │ ├── default
    │ ├── manager ※ CustomControllerのManifest等
    │ ├── prometheus
    │ ├── rbac ※ CustomControllerのRBAC用Manifest
    │ ├── samples ※ CRのManifest
    │ └── scorecard ※ OperatorBundleテスト設定ファイル等
    ├── Dockerfile ※ CustomControllerのDockerfile
    ├── helm-charts ※ CustomControllerがhelm install –fするディレクトリ
    │ └── xxxx
    ├── Makefile ※ makeコマンドの動作設定ファイル
    ├── PROJECT
    └── watches.yaml

    View full-size slide

  19. マスター タイトルの書式設定
    1. Operator開発 – helm-chart定義
    18
     Helm-chartを定義する
     helm公式などを参照しながら作
    成する。
     AWSのCFnなどに慣れている方
    であればキャッチアップは比較的
    容易、values.yamlはデフォルト
    値を定義するもの。
     既存のManifestがあれば、とり
    あえずそのまま使うことも可能。
     helm公式は日本語があまり充実
    していないので英語で見ることを
    推奨。
    https://helm.sh/

    View full-size slide

  20. マスター タイトルの書式設定
    1. Operator開発 – RBAC定義
    19
     RBACを定義する
     先ほど定義したhelm-chartが適用で
    きるよう、CustomControllerに権限
    を付与する必要がある。
     Kubectl api-resourcesコマンドを用
    いて今回定義したhelm-chart内の
    k8sオブジェクトがどのAPIGROUP
    に属しているか確認し、role.yamlに
    追記する。

    View full-size slide

  21. マスター タイトルの書式設定
    1. Operator開発 – RBAC定義
    20
     Role.yamlについて
     verbsやresourcesについては、セキ
    ュリティのベストプラクティス的に
    は最小権限にすべきである。
     verbsは、作 成しようと している
    Operatorが本当にその振る舞いが必
    要かどうかを検討する。
     Resourcesについても、不要なオブ
    ジェクトはなるべく定義しないよう
    にする。
    最小権限
    Resources
    verbs

    View full-size slide

  22. マスター タイトルの書式設定
    2. Operatorの設定、ビルド、デ
    プロイ
    21

    View full-size slide

  23. マスター タイトルの書式設定
    2. Operatorの設定、ビルド、デプロイ
    22
    Operator開発
    k8s API
    k8s オブジェクト
    Deployment
    CRD
    (Custom Resource
    Definition)
    Helm Pod
    (※CustomController)
    CRの内容
    を常時監視
    CR
    (Custom Resource)
    新CRDのAPI経
    由でCRを作成
    API(CRD)
    作成
    API経由で
    CR作成
    Operator-sdkでテ
    ンプレ作成、開発
    CRD.yaml
    コンテナ
    ビルド
    デプロイ
    1.開発 2.設定
    K8s標準オブジェクト
    RBAC
    k8s管理者
    Operator
    利用者
    Operator
    開発者
    CRをvalueとしてhelmで
    k8s標準オブジェクトを
    install(コントロール)
    CR.yaml
    CRDファイル
    連携
    helm-chart/
    templates/*.yaml
    values.yaml
    Dockerfile
    Helm用Manifest
    ・Deployment
    ・RBAC
    ※主な設計
    要素部分

    3.利用

    View full-size slide

  24. マスター タイトルの書式設定
    2. Operatorの設定 – CRD作成
    23
     CRDを作成する
     make installコマンドでCRDを作成する。
     ※kustomizeコマンドでcrdのManifestが生成され、applyされる動きとなる。

    View full-size slide

  25. マスター タイトルの書式設定
    2. Operatorのビルド
    24
     Operatorをビルドする。
     コンテナリポジトリの準備
     IMG=リポジトリ:タグ
     make docker-build docker-push
    IMG=$IMG
     ※IMG変数でタグ付けしてコン
    テナビルドを行った後に、IMG
    変数へPushという動作

    View full-size slide

  26. マスター タイトルの書式設定
    2. Operatorのデプロイ
    25
     Operatorをデプロイする。
     make deploy IMG=$IMGコマンドを用いてk8sクラスタにOperatorをデプロイす
    る。
     ※kustomizeコマンドでコントローラ関連のmanifestをIMG変数で書き換え、生成し
    たのちにapplyという動作

    View full-size slide

  27. マスター タイトルの書式設定
    3. Operatorの利用
    26

    View full-size slide

  28. マスター タイトルの書式設定
    3. Operatorの利用
    27
    Operator開発
    k8s API
    k8s オブジェクト
    Deployment
    CRD
    (Custom Resource
    Definition)
    Helm Pod
    (※CustomController)
    CRの内容
    を常時監視
    CR
    (Custom Resource)
    新CRDのAPI経
    由でCRを作成
    API(CRD)
    作成
    API経由で
    CR作成
    Operator-sdkでテ
    ンプレ作成、開発
    CRD.yaml
    コンテナ
    ビルド
    デプロイ
    1.開発 2.設定
    K8s標準オブジェクト
    RBAC
    k8s管理者
    Operator
    利用者
    Operator
    開発者
    CRをvalueとしてhelmで
    k8s標準オブジェクトを
    install(コントロール)
    CR.yaml
    CRDファイル
    連携
    helm-chart/
    templates/*.yaml
    values.yaml
    Dockerfile
    Helm用Manifest
    ・Deployment
    ・RBAC
    ※主な設計
    要素部分

    3.利用

    View full-size slide

  29. マスター タイトルの書式設定
    3. Operatorの利用 – CR作成
    28
     CRを作成する。
     CRは二つの役割を持っている。
     CRを作成することで、CustomControllerがそれを検知し、実際のk8sオブジェクト
    が作られるトリガーとしての役割
     作成されるk8sオブジェクトのデフォルト値を定義する役割
     デフォルト値の動きについて
     CRのspec以降の値は、helm-chartを定義する際に作成したvalues.yamlを、さらに上
    書きするよう動作する。
     Spec以降の記載がない場合は、values.yamlの値が使用される。
     以上を踏まえ、テンプレのCRのManifestを元に内容検討し、applyする。

    View full-size slide

  30. マスター タイトルの書式設定
    3. Operatorの利用 – トラブルシューティング
    29
     CustomControllerがうまく動作しない場合
     CRDは作られているか?
     CustomController に 関 わ る リ ソ ー ス (
    Service、Deployment、Pod等)は正常な
    ステータスか?
     CRは作成されているか?
     CustomControllerのpodのログで
    Resonciliation loopは成功しているか?

    View full-size slide

  31. マスター タイトルの書式設定
    3. Operatorの利用 – トラブルシューティング
    30
     CustomControllerのpodのログでResonciliation loopは成功しているか?
    $ kubectl logs pod/test-controller-manager-5cbb545d79-4ltqc -n test-system manager
    {"level":"error","ts":16066524354"logger":"controller","msg":"Reconciler error","controller":"test-controller","name":"test-sample","namespace":"default",
    error:"failed to install release:rendered manifests contain a resource that already exists.
    Unable to continue with install:could not get information about the resource:
    configmaps ¥"my-config¥" is forbidden: User ¥"system:serviceaccount:test-system:default¥" cannot get resource ¥"configmaps¥" in API
    group ¥"¥" in the namespace ¥"default¥"",
    CustomControllerにおける、
    Configmapへのget権限が足りてない
     CustomControllerがうまく動作しない場合

    View full-size slide

  32. マスター タイトルの書式設定
    3. Operatorの利用 – トラブルシューティング
    31
     Helmコマンド単体でinstallを行い、正常終了するか?
     そもそもmanifest類はhelm抜きで単体で動作できていたのか?
     CustomControllerがうまく動作しない場合
    $ kubectl apply -f .
    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1
    ClusterRole
    clusterrole.rbac.authorization.k8s.io/fluentd-role created
    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1
    ClusterRoleBinding
    clusterrolebinding.rbac.authorization.k8s.io/fluentd-role-binding created
    unable to recognize "web-app.yaml": no matches for kind "Deployment" in version "extensions/v1beta1"
    unable to recognize "logging.yaml": no matches for kind "DaemonSet" in version "extensions/v1beta1"
    参照)https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20/
    v1.20のGroupとVersion

    View full-size slide

  33. マスター タイトルの書式設定
    まとめ
    32

    View full-size slide

  34. マスター タイトルの書式設定
    ポジティブなまとめ
    33
     Operator SDKを使えば、KubernetesのAPIやCRDの詳細な理解をしていなくて
    も、作成されるテンプレートを元にOperatorを作ることが可能
     helmプラグインにおいては、既存のk8s manifestがあればそれをベースにより簡
    単にOperatorを作ることが出来る

    View full-size slide

  35. マスター タイトルの書式設定
    まとめ - 教訓(※helm operator)
    34
     Operatorを作る前に、Operatorを動作させる予定のk8sクラスタのバー
    ジョンにおいて、k8s manifest単体が正常動作するかを確認しましょう
     古いmanifestがあってもhelm operatorはすぐ作れません
     k8sのライフサイクルは早いため、k8s manifestはすぐ動かなくなる
     RBACは、必要な権限を確認し、定義しましょう
     Operator SDKは色々なものを抽象化してくれる優れものですが、内部動
    作は理解した上で利用しましょう
     何がテンプレとして出来るのか、そのまま使うのはどのファイルで、設計や定義す
    べきファイルはどれなのか
     make xxxxコマンドでどのようなことが行われるのか
     CRDとCR、及びCRとCustomControllerは、それぞれどういう繋がりがあるのか

    View full-size slide

  36. マスター タイトルの書式設定
    まとめ - Operator実装の流れ(helm)(再掲)
    35
    Operator開発
    k8s API
    k8s オブジェクト
    Deployment
    CRD
    (Custom Resource
    Definition)
    Helm Pod
    (※CustomController)
    CRの内容
    を常時監視
    CR
    (Custom Resource)
    新CRDのAPI経
    由でCRを作成
    API(CRD)
    作成
    API経由で
    CR作成
    Operator-sdkでテ
    ンプレ作成、開発
    CRD.yaml
    コンテナ
    ビルド
    デプロイ
    1.開発 2.設定
    K8s標準オブジェクト
    RBAC
    k8s管理者
    Operator
    利用者
    Operator
    開発者
    CRをvalueとしてhelmで
    k8s標準オブジェクトを
    install(コントロール)
    CR.yaml
    CRDファイル
    連携
    helm-chart/
    templates/*.yaml
    values.yaml
    Dockerfile
    Helm用Manifest
    ・Deployment
    ・RBAC
    ※主な設計
    要素部分

    3.利用

    View full-size slide

  37. マスター タイトルの書式設定
    まとめ - 一般的なアンチパターンなど
    36
     そもそも本当にOperatorを作らないといけませんか?
     時間を節約できなければ、自動化する意味はない
     セキュリティの負担が重いことを考慮する
     宣言的に状態管理したいだけなら、GitOpsで事足りる場合もある
     やるなら小さく始める
    参考)
    Stop Writing Operators
    https://kccncna20.sched.com/event/ekAR/stop-writing-operators-joe-thompson-hashicorp
    Anti Patterns For Kubernetes Operators
    https://devconfcz2019.sched.com/event/JciH/anti-patterns-for-kubernetes-operators

    View full-size slide

  38. マスター タイトルの書式設定
    1 2 3 4 5
    分析、自動対応
    ログ取得、アラート ログ取得、アラート
    バックアップ
    リストア
    (バックアップ)
    (リストア)
    (バックアップ)
    (リストア)
    アップグレード (アップグレード) (アップグレード) (アップグレード)
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    インストール
    アンインストール
    ヘルスチェック
    まとめ - 今後チャレンジしていきたい領域
    37

    View full-size slide

  39. マスター タイトルの書式設定
    ご清聴ありがとうございました
    38

    View full-size slide