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. マスター タイトルの書式設定  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
  2. マスター タイトルの書式設定 何が出来るのか 4  Capability Level  将来はk8sの運用問題解決=Operatorを作る、だと個人的に思っている 

    ソフトウェアSREを作る時代が来る?  Auto PilotなOperatorを作れば、運用は不要? 参考)https://sdk.operatorframework.io/docs/advanced-topics/operator-capabilities/operator-capabilities/
  3. マスター タイトルの書式設定 どのような仕組みなのか 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/
  4. マスター タイトルの書式設定 どうやって作るのか? 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時点
  5. マスター タイトルの書式設定 Auto Pilotへの道のり 9  実際は平坦ではなく、登り 1 2 3

    4 5 分析、自動対応 ログ取得、アラート ログ取得、アラート バックアップ リストア (バックアップ) (リストア) (バックアップ) (リストア) アップグレード (アップグレード) (アップグレード) (アップグレード) インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック
  6. マスター タイトルの書式設定 Operator(helm)実装の流れ 12  1. Operator開発  プロジェクト作成 

    Helm-chart定義  RBAC定義  2. Operator設定、ビルド、デプロイ  CRD作成  Operatorのビルド  Operatorのデプロイ  3. Operator利用  CRの作成
  7. マスター タイトルの書式設定 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.利用
  8. マスター タイトルの書式設定 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.利用
  9. マスター タイトルの書式設定 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で監視するカスタムリソース名を指定する。一般的にはアプリやシステム名を記載する。
  10. マスター タイトルの書式設定 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
  11. マスター タイトルの書式設定 1. Operator開発 – helm-chart定義 18  Helm-chartを定義する 

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

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

    verbsやresourcesについては、セキ ュリティのベストプラクティス的に は最小権限にすべきである。  verbsは、作 成しようと している Operatorが本当にその振る舞いが必 要かどうかを検討する。  Resourcesについても、不要なオブ ジェクトはなるべく定義しないよう にする。 最小権限 Resources verbs
  14. マスター タイトルの書式設定 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.利用
  15. マスター タイトルの書式設定 2. Operatorの設定 – CRD作成 23  CRDを作成する 

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

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

    IMG=$IMGコマンドを用いてk8sクラスタにOperatorをデプロイす る。  ※kustomizeコマンドでコントローラ関連のmanifestをIMG変数で書き換え、生成し たのちにapplyという動作
  18. マスター タイトルの書式設定 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.利用
  19. マスター タイトルの書式設定 3. Operatorの利用 – CR作成 28  CRを作成する。 

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

    CRDは作られているか?  CustomController に 関 わ る リ ソ ー ス ( Service、Deployment、Pod等)は正常な ステータスか?  CRは作成されているか?  CustomControllerのpodのログで Resonciliation loopは成功しているか?
  21. マスター タイトルの書式設定 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がうまく動作しない場合
  22. マスター タイトルの書式設定 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
  23. マスター タイトルの書式設定 まとめ - 教訓(※helm operator) 34  Operatorを作る前に、Operatorを動作させる予定のk8sクラスタのバー ジョンにおいて、k8s

    manifest単体が正常動作するかを確認しましょう  古いmanifestがあってもhelm operatorはすぐ作れません  k8sのライフサイクルは早いため、k8s manifestはすぐ動かなくなる  RBACは、必要な権限を確認し、定義しましょう  Operator SDKは色々なものを抽象化してくれる優れものですが、内部動 作は理解した上で利用しましょう  何がテンプレとして出来るのか、そのまま使うのはどのファイルで、設計や定義す べきファイルはどれなのか  make xxxxコマンドでどのようなことが行われるのか  CRDとCR、及びCRとCustomControllerは、それぞれどういう繋がりがあるのか
  24. マスター タイトルの書式設定 まとめ - 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.利用
  25. マスター タイトルの書式設定 まとめ - 一般的なアンチパターンなど 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
  26. マスター タイトルの書式設定 1 2 3 4 5 分析、自動対応 ログ取得、アラート ログ取得、アラート

    バックアップ リストア (バックアップ) (リストア) (バックアップ) (リストア) アップグレード (アップグレード) (アップグレード) (アップグレード) インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック インストール アンインストール ヘルスチェック まとめ - 今後チャレンジしていきたい領域 37 済