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

Kubernetes Operator 超入門/Kubernetes_Operator_Introduction

Kubernetes Operator 超入門/Kubernetes_Operator_Introduction

OCHaCafe Season5 #1の資料です.

140494d272a4d89883a94fdfdb29dea2?s=128

oracle4engineer
PRO

January 19, 2022
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Kubernetes Operator 超⼊⾨ Oracle Cloud Hangout Cafe 5 #1 Takuya

    Niita Oracle Corporation Japan Jan 19, 2022 OperatorでKubernetesの可能性を無限⼤に!!
  2. 2 Copyright © 2022, Oracle and/or its affiliates. 1. Kubernetesの拡張性

    2. Kubernetes Operatorパターン 3. Kubernetes Operator開発 4. Operator SDKを利⽤した開発プロセス 5. デモ 6. まとめ アジェンダ Oracle Database Operatorも!!
  3. • 仁井⽥ 拓也 • ⽇本オラクル株式会社 • ソリューション・アーキテクト本部 • 前職は某SIer •

    Oracle歴:2年半 • Cloud Native歴: 2年半 • ジブリ⼤好き • OCHaCafeは7回⽬の登壇(R:6回/P:1回) ⾃⼰紹介 Copyright © 2022, Oracle and/or its affiliates. 3 @takuya_0301
  4. Kubernetesの拡張性 Takuya Niita Oracle Corporation Japan Jan 19, 2022 Copyright

    © 2022, Oracle and/or its affiliates. 4 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  5. Copyright © 2022, Oracle and/or its affiliates. 5 様々なOSSと組み合わせることにより、柔軟に機能拡張可能 今では、Kubernetesの⾼い拡張性により、様々なユースケースが実現可能

    => なぜ、Kubernetesはここまで柔軟に拡張できるのか? Kubernetesが持つ⾼い拡張性 コンテナ運⽤をさらに効率化・⾼度化 • 詳細なメトリック監視と可視化: - Prometheus + Grafana • コンテナのログの転送収集: - Fluentd / Fluent Bit • ネットワークトラフィックの制御: - Istio + Envoy Kubernetesの適⽤領域の拡⼤ • 機械学習プラットフォーム: - Kubeflow • 分散ストレージ - Rook • 分散型データベース - Vitess
  6. Kubernetesの拡張性を実現する仕組み Copyright © 2022, Oracle and/or its affiliates. 6 手法

    概要 ユースケース例 Admission Webhook Kubernetesリソースの操作をトリガーに • チェック(Validation) • 変更(Mutation) を⾏う仕組み • Manifestの各フィールドの デフォルト設定 • Open Policy Agent/GateKeeper Operatorパターン (Custom Resource Definition) 独⾃のリソースを定義とKubernetes API の拡張により、ユーザに変わってリ ソースの操作を⾏う仕組み • Istio • Knative • 各種Operator API Aggregation kube-api-server以外にapi-serverを実装し、 custom api-serverとして拡張する仕組み • Service Catalog • Metrics Server 拡張性低 拡張性⾼
  7. (参考) Admission Webhook Copyright © 2022, Oracle and/or its affiliates.

    7 Authentication Authorization API HTTP handler Mutating Admission Object Schema Validation Validating Admission Persisted to etcd API Request Webhook Webhook Webhook Webhook Mutating Webhook Validating Webhook Ex)Pod作成時にフィールドの デフォルト値を設定 Ex)imageタグが”latest”もしくは省略 されていたら、Pod作成を拒否 Admission Webhook
  8. (参考) API Aggregation Copyright © 2022, Oracle and/or its affiliates.

    8 https://kubernetes.io/docs/tasks/extend-kubernetes/configure-aggregation-layer/ API Aggregation • kube-apiserverに新しい種類のオブジェクトを 認識させる仕組み(kube-apiserverを拡張) • kube-apiserverのフラグでAggregation Layerを有 効に設定することが必要 • 拡張APIの登録 • 拡張APIサーバをPodとして実⾏ • APIServiceオブジェクトを登録 • Aggregation Layerが任意のAPIエンドポイン トへのアクセスをAPIServiceにプロキシ • CRDよりも詳細なAPIを定義することが可能 • apiserver-builderというSDKを利⽤して実装可能
  9. Kubernetesの拡張性 API Serverの拡張性 (参考)Kubernetesの拡張性の全体イメージ Copyright © 2022, Oracle and/or its

    affiliates. 9 apiextensions-apiserver (CRDを登録するサーバ) Service Catalog Mutating Webhook Metrics Server Validating Webhook Custom API Server Admission Webhook API Aggregator Resource Handler API Request kube-apiserver https://www.slideshare.net/oracle4engineer/ ochacafe25-kubernetes https://speakerdeck.com/oracle4engineer/ kubernetes-autoscale-deep-dive ! etcd Custom Controller(Operator) Custom Resource Operatorパターン Reconcile
  10. Kubernetesの拡張性を実現する仕組み Copyright © 2022, Oracle and/or its affiliates. 10 手法

    概要 ユースケース例 Admission Webhook Kubernetesリソースの操作をトリガーに • チェック(Validation) • 変更(Mutation) を⾏う仕組み • Manifestの各フィールドの デフォルト設定 • Open Policy Agent/GateKeeper Operatorパターン (Custom Resource Definition) 独⾃のリソースを定義とKubernetes API の拡張により、ユーザに変わってリ ソースの操作を⾏う仕組み • Istio • Knative • 各種Operator API Aggregation kube-api-server以外にapi-serverを実装し、 custom api-serverとして拡張する仕組み • Service Catalog • Metrics Server 拡張性低 拡張性⾼ 本⽇のテーマ
  11. Kubernetes Operatorパターン Takuya Niita Oracle Corporation Japan Jan 19, 2022

    Copyright © 2022, Oracle and/or its affiliates. 11 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  12. Kubernetes Operator • 公式ドキュメントでは「Operatorパターン」と 定義 • https://kubernetes.io/ja/docs/concepts/extend -kubernetes/operator/ • “Kubernetes⾃体のソースコードを修正するこ

    と無く、クラスターの振る舞いを拡張” • ユーザ独⾃のワークロードのデプロイや運⽤ の⾃動化を⾏うことが可能 • 例えば・・・ • アプリケーションの状態のバックアップを 取得、リストア • クラスターの回復⼒をテストするために、 全て、または⼀部分の障害をシミュレート Kubernetes Operatorとは? Copyright © 2022, Oracle and/or its affiliates. 12 $ kubectl get ochacafe $ kubectl get ochacafe/ochacafe-sample $ kubectl edit ochacafe/ochacafe-sample Pod、DeploymentなどのKubernetesに標準 実装されているリソース以外のリソースを 「定義」 「扱う」 ことが可能に CRD/CR Operator(Custom Controller)
  13. Custom Resource Definition(CRD) • ユーザー独⾃のリソース定義 Custom Resource(CR) • CRDを元にしたリソース Custom

    Resource Definition(CRD)とCustom Resource(CR) Copyright © 2022, Oracle and/or its affiliates. 13 ⽂字列(string) ⽂字列(string) オブジェクト(object) • size:整数値(integer)/必須(required) • image:⽂字列(string)/必須(required) APIエンドポイント例:/api/ochacafe.oracle.com/v1alpha1/namespace/default/ochacafe/ochacafe-sample
  14. Validation • CRDはOpenAPI v3.0 Validation Schemaを採⽤ • CRを作成した際にCRD定義に準拠していないフィールドはバリデーションエラーに • v1.16(apiVersion:apiextentions.k8s.io/v1)からGA

    • GA後はStructural SchemaでCRDを定義することが強制(必須) • GA前はStructural Schemaで定義することはオプションだった Custom Resource Definitionのサブ機能 – Validation – Copyright © 2022, Oracle and/or its affiliates. 14 error: error validating " ochacafe.yaml": error validating data: ValidationError(Ochacafe.spec.size): invalid type for com.oracle.ochacafe.v1alpha1. Ochacafe.spec.size: got "string", expected "integer"; apply
  15. Additional Printer Columns • “kubectl get”コマンドの出⼒結果として表⽰したい情報を定義することができる機能 • デフォルトは”name”と”age”のみ Custom Resource

    Definitionのサブ機能 – Additional Printer Columns – Copyright © 2022, Oracle and/or its affiliates. 15 CRDの定義 $ kubectl get ochacafe ochacafe-sample NAME STATUS SIZE AGE ochacafe-sample node1 1 1m
  16. Custom Controller(Operator) • Kubernetes API の機能を拡張したアプリケーション固有のコントローラー • CR(CRD)と連携しながら、Custom Controller(Operator)が適切な処理を実⾏ •

    KubernetesがGolangで実装されているので、 Custom Controller(Operator)もGolangで実装されることが多 い • ただし、Kubernetes上でコンテナとして動作すればよいので、他⾔語で実装しても特に問題なし Custom Controller(Operator) Copyright © 2022, Oracle and/or its affiliates. 16 Custom Controller(Operator) Current Status User CustomResource apply Adjust Reconcile API Server watch
  17. 宣言的オペレーション • Kubernetesが実現するオペレーションのコンセ プト • Manifest(今回のテーマの⽂脈ではCR)に定義 された内容を「あるべき状態」とし、 Operatorに実装されたReconciliation Loopによ り、今の状態を「あるべき状態」に収束さ

    せていく Reconciliation Loop • 宣⾔的オペレーションを実現する仕組み • Manifest(今回のテーマの⽂脈ではCR)に定義 された内容を「正」とし、今の状態を 「正」に収束させていくループ 宣言的オペレーションとReconciliation Loop(調整ループ) Copyright © 2022, Oracle and/or its affiliates. 17 Observe Analyze Act リソースの現在の状態を確認する リソースの現在の状態と 期待する状態を⽐較する 状態を⼀致させるために 必要な処理を⾏う Reconciliation Loop=調整ループ
  18. • Level1:基本インストール • Operatorがカスタムリソースを介してアプリケーションを完全にプロビジョニング • Level2:影響が無いアップグレード • 既存ワークロードに影響がないようにユーザがOperator/ワークロードを容易にアップデート可能 • Level3:フルライフサイクル

    • ⼿動での介⼊なしでOperatorが⾃動でステートフルデータをバックアップ/リストア可能 • Level4:深い洞察 • Operatorが監視とアラートを⾃動化(Prometheus/Grafanaなどの⾃動構築も含む) • Level5:⾃動操縦 • ユーザによる⼀切の介⼊なしにOperator/ワークロードのスケール、障害復旧などを⾃動で実施可 能 Operatorの成熟度モデル(Operator Capacity Levels) Copyright © 2022, Oracle and/or its affiliates. 18 参考:https://operatorhub.io/getting-started 各レベルは積み重ね Level5 => Level1 + Level2 + Level3 + Level4 + Level5
  19. OperatorHub.io • https://operatorhub.io/ • Kubernetes Operatorのパブリックレポジトリ • “Operator界のDocker Hub” •

    Amazon社、Microsoft社、Google社、RedHat社 によって⽴ち上げ • 今では、他にも様々なコミュニティやベン ダーが協⼒ • 223のOperatorが登録(2022/1時点) • OperatorHubに⾃分が使いたいOperatorがある 場合は、⾃作せずに利⽤しましょう!! • OLM(Operator Lifecycle Manager)をインストー ル • OperatorのManifestをインストール OperatorHub.io Copyright © 2022, Oracle and/or its affiliates. 19
  20. Kubernetes Operator開発 Takuya Niita Oracle Corporation Japan Jan 19, 2022

    Copyright © 2022, Oracle and/or its affiliates. 20 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  21. client-go • https://github.com/kubernetes/client-go • Golangで実装されたKubernetesのクライアントライブラリ • 主にAPI Serverへのアクセスに利⽤ • Kubernetes⾃体でも利⽤されている

    • Kubernetesのバージョンに合ったバージョン選択が必要 • https://github.com/kubernetes/client-go#user-content-versioning api/apimachinery • https://github.com/kubernetes/apimachinery • Golangで実装されたKubernetes⽤ライブラリ • scheme、encoding/decodingなどの機能がまとまったもの • Kubernetes API Object⽤のライブラリ Operatorを動作させるもの・・・ Copyright © 2022, Oracle and/or its affiliates. 21 これらのライブラリを利⽤して、Operatorをスクラッチ開発していくのはハードル⾼め・・・
  22. controller-runtime • KubernetesのSIG(Special Interest Group)によって開発されたGolangのライブラリセット • Kubebuilder/Operator SDK(後述)で活⽤ • 代表的なコンポーネント例

    • resource.Resource • Operatorが実装すべきインタフェース controller-tools • KubernetesのSIG(Special Interest Group)によって開発されたOperator開発を補助するためのライブラリの セット • Kubebuilder/Operator SDK(後述)で活⽤ • 代表的なコンポーネント例 • controller-gen • ソースコードの雛形を⽣成したり、ソースコードを元にManifest(CRDなど)を⽣成 controller-runtimeとcontroller-tools Copyright © 2022, Oracle and/or its affiliates. 22 controller-runtimeとcontroller-toolsが活⽤されたSDK = Kubebuilder/Operator SDK
  23. Kubebuilder • https://github.com/kubernetes-sigs/kubebuilder • 最新v3.2.0(2022/1現在) • Kubernetesユーザグループによって開発された SDK • controller-runtimeとcontroller-toolsを活⽤して開

    発 • Dockerfile、プロジェクトの雛形やマニフェス トの⽣成などを実施 • コマンドによってOperatorに必要なもの⼀ 式を提供 • 開発者がロジックの実装だけに集中するこ とが可能 Operatorを開発するためのSDK – Kubebuilder – Copyright © 2022, Oracle and/or its affiliates. 23
  24. Operator SDK • https://github.com/operator-framework/operator- sdk • Operator Frameworkの⼀つ • 最新v1.16.0(2022/1現在)

    • CoreOS社によって開発されたSDK • controller-runtimeとcontroller-toolsを活⽤して開 発 • Dockerfile、プロジェクトの雛形やマニフェスト の⽣成などを実施 • Operator Lifecycle Manager(OLM)とい う Operator ライフサイクルのインストール、更新、管理な どを実施してくれるツールもあり • Helm ChartやAnsible Playbookのプラグインもあり Operatorを開発するためのSDK – Operator SDK – Copyright © 2022, Oracle and/or its affiliates. 24
  25. Operator Lifecycle Manager • Operator Frameworkの⼀つ • https://github.com/operator-framework/operator- lifecycle-manager •

    最新v0.20.0(2022/1現在) • Operator⾃体を管理してくれる仕組み • 具体的には以下のようなOperatorのライフ サイクルをサポート • ビルド/デプロイ • アップデート • Operatorの技術的負債(Operatorの管理や運 ⽤負担)を軽減 • インストールは”operator-sdk”から可能 (補⾜) Operator Lifecycle Manager(OLM) Copyright © 2022, Oracle and/or its affiliates. 25 参考: https://speakerdeck.com/shkitayama/operatorlifecyclemanager-101
  26. KubebuilderとOperator SDK(Go-based)の統合 Copyright © 2022, Oracle and/or its affiliates. 26

    Kubebuilder Operator SDK(Go-based) メンテナンス Kubernetes SIG RedHat社(CoreOS社) ベースとなるライブラリ controller-runtime controller-tools controller-runtime controller-tools メンテナンスの主体が異なるだけで、 やってること、⽬的は同じでは?? 参考:https://github.com/kubernetes-sigs/kubebuilder/blob/master/designs/integrating-kubebuilder-and-osdk.md Kubebuilder側をupstreamとして、 Operator SDK (Go-based)をKubebuilderのラッパーにしよう!!! ※ドキュメントはOperator SDK (Go-based)側のドキュメントをKubebuilder側にマージし、Kubebuilder側で運用
  27. Golang以外Operatorを開発するためのSDK • Java Operator SDK • https://javaoperatorsdk.io/ • https://github.com/java-operator-sdk/java-operator-sdk •

    RedHat社とContainer Solutions社がメンテナンス • 最新v2.0.1(2022/1現在) • MavenやGradleなどで依存関係を追加するだけで利⽤可能 • kopf(Kubernetes Operators Framework for Python) • https://github.com/nolar/kopf • https://kopf.readthedocs.io/ • 最新v1.35.3(2022/1現在) • 元々はZalando社がメンテナンスしていたが、今は個⼈でメンテナンスされている模様 • ソースコード⾃体はforkされており、同じ開発者によってメンテナンスされている (参考)Golang以外でのOperator開発 Copyright © 2022, Oracle and/or its affiliates. 27
  28. Operator SDKを利⽤した開発プロセス Takuya Niita Oracle Corporation Japan Jan 19, 2022

    Copyright © 2022, Oracle and/or its affiliates. 28 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  29. Go based • Operator SDKをGolangで開発するためのセット • 後述のスライドで解説 Helm based(plugin) •

    既存HelmチャートをOperator Likeに扱うためのプラグイン(ロジックは実装しない) • helm-operator(HelmチャートのためのOperator)がHelmチャートのリソース(CRとして⽣成)を統⼀的 に管理可能(Helmチャートで実現可能な以上のことはできない) Ansible based(plugin) • 既存Ansible PlaybookをOperator Likeに扱うためのプラグイン • ansible-operator(Ansible PlaybookのためのOperator)がAnsible Playbookの定義(CRとして⽣成)を統⼀的 に管理可能(Ansible Playbookで実現可能な以上のことはできない) • インフラエンジニアがAnsibleベースでOperatorを実装できるかも…?? Operator SDKでの利⽤パターン Copyright © 2022, Oracle and/or its affiliates. 29
  30. Go based • Operator SDKをGolangで開発するためのセット • 後述のスライドで解説 Helm based(plugin) •

    既存HelmチャートをOperator Likeに扱うためのプラグイン(ロジックは実装しない) • helm-operator(HelmチャートのためのOperator)がHelmチャートのリソース(CRとして⽣成)を統⼀的 に管理可能(Helmチャートで実現可能な以上のことはできない) Ansible based(plugin) • 既存Ansible PlaybookをOperator Likeに扱うためのプラグイン • ansible-operator(Ansible PlaybookのためのOperator)がAnsible Playbookの定義(CRとして⽣成)を統⼀的 に管理可能(Ansible Playbookで実現可能な以上のことはできない) • インフラエンジニアがAnsibleベースでOperatorを実装できるかも…?? Operator SDKでの利⽤パターン Copyright © 2022, Oracle and/or its affiliates. 30 これをやっていきます!!
  31. operator-sdk(プロジェクトの操作) make (Operatorの操作) Operator SDK (Go-based) – 今回利⽤するコマンド – Copyright

    © 2022, Oracle and/or its affiliates. 31 コマンド 役割 init 新規の Operator プロジェクトを作成 create OperatorまたはCRの追加 olm OLM(Operator Lifecycle Manager)を利 ⽤したOperator操作 run Operatorのローカルテストやター ゲット環境でのOperatorの実⾏ コマンド 役割 deploy Operator⼀式を対象Kubernetesに デプロイ docker-build Operatorのコンテナイメージを ビルド docker-push Operatorのコンテナイメージをpush generate 定義されたリソースに応じたイン タフェース(.goファイル)の⽣成 manifests 定義されたリソースに応じた Manifestの⽣成 test Unit Testの実⾏
  32. このセッションで実装するサンプルOperator Copyright © 2022, Oracle and/or its affiliates. 32 任意のDeploymentを作成してみるOperator

    • https://github.com/oracle-japan/ochacafe-operator-intro • Ochacafeリソースを作成すると、指定された”size”と“image”に基づいてDeploymentを作成 • Ochacafeリソースの”size”を変更するとDeploymentのreplica数も変更される • Ochacafeリソースを取得(kubectl describe)すると、スケジューリングされたPod名を確認可能 ochacafe.yaml apply Ochacafeリソース nginx:latest
  33. • Operatorプロジェクトの雛形作成コマンド例 • API(OperatorおよびManifestの雛形)の作成 Operator SDK(Go-based) – プロジェクト作成 – Copyright

    © 2022, Oracle and/or its affiliates. 33 $ operator-sdk init --domain oracle.com --repo github.com/oracle-japan/ochacafe-operator-intro CRの”apiVersion“の⼀部になる Ex) apiVersion: xxx.oracle.com/xxxxxx $ operator-sdk create api --group ochacafe --version v1alpha1 --kind Ochacafe --controller --resource CRの”apiVersion“の⼀部になる Ex) apiVersion: ochacafe.oracle.com/v1alpha1 CRの”Kind“になる=Operatorの操作対象 GitHubのレポジトリ名(必要であれば) OperatorとManifestの⾃動⽣成フラグ
  34. Operator SDK(Go-based) – プロジェクト作成後のディレクトリ構成 – Copyright © 2022, Oracle and/or

    its affiliates. 34 .Dockerfile => OperatorをコンテナとしてビルドするためのDockerfile Makefile => Operatorのビルドやデプロイなどの諸々のコマンドが定義されたファイル api => APIリソース(CR)の定義。Kind毎に⽣成。Manifestのフィールド定義とも⾔える groupversion_info.go ・ ・ ・ config => 各種Manifestファイル。ソースコードのアノテーションを元に⽣成(controller-toolsが⽣成) crd default ・ ・ ・ ・ ・ ・ ochacafe_controller.go controllers => Operatorの実装部分。テンプレートをもとに実装(controller-runtimeを利⽤) ・ ・ ・ main.go => Operatorのエントリーポイント(メイン処理)
  35. • Operator超⼊⾨として実装するファイル(今回のサンプルOperatorの場合) Operator SDK(Go-based) – 実装(Step 1) – Copyright ©

    2022, Oracle and/or its affiliates. 35 $ vim api/v1alpha1/ochacafe_types.go CRで定義する フィールド Operatorが追記する フィールド ./make generate $ cat config/crd/bases/ ochacafe.oracle.com_ochacafe.yaml $ cat api/v1alpha1/zz_generated.deepcopy.go ./make manifests (一部抜粋) (一部抜粋)
  36. • Operator超⼊⾨として実装するファイル(今回のサンプルOperatorの場合) Operator SDK(Go-based) – 実装(Step 2) – Copyright ©

    2022, Oracle and/or its affiliates. 36 $ vim controllers/ochacafe_controller.go アノテーションとして、操作す るリソースと許可する操作を定 義。 今回は以下の権限を付与 • OperatorがDeploymentを作成/ 削除するための更新権限 • Statusを更新するためのPodの 参照権限 ./make manifests $ cat config/rbac/role.yaml (一部だけ)
  37. • Operator超⼊⾨として実装するファイル(今回のサンプルOperatorの場合) Operator SDK(Go-based) – 実装(Step 3) – Copyright ©

    2022, Oracle and/or its affiliates. 37 $ vim controllers/ochacafe_controller.go 内容 説明 ⼊⼒ Context(goroutine(スレッド)を扱うた めの情報) Request(CRに関する情報など) - 出⼒ Result(処理結果) error(エラー情報) Result.Requeue/Result.RequeueAfterというフィールドに 再キューイング要否と遅延時間をそれぞれ指定可能 正常終了時はerror=nil、異常終了時はerror=Exception情報
  38. (参考) Reconcile関数の実装時に気をつけるポイント Copyright © 2022, Oracle and/or its affiliates. 38

    • 結果が必ず収束するように実装!! • Reconcile関数の結果が冪等になっていない状態は“宣⾔的”ではない • Reconcile関数でエラーが発⽣したとしても、もう⼀度Reconcile関数を呼び出し、必ずリカバリ可能 にする • エラー時のリトライは、 Result.Requeue:trueで再実⾏ • 処理内で待機したり、時間のかかる処理を実装しない!! • リソースの状態が変化するまで待機したり、時間がかかる処理を実装するとスケーラブルな Operatorにならない • ⼤量のリソースを取得するような実装はAPI Serverの負荷を⾼めることにもつながる • 時間のかかる処理や待機が必要な場合は、 スレッド(goroutineで実⾏)にし、Result.RequeueAfterに 待機時間を指定すれば再実⾏可能 • API Serverへの不必要なアクセスは⾏わずにキャッシュ(client-goに実装)を活⽤ 参考:https://speakerdeck.com/zoetrope/kubernetesoperetafalseantipatan-besutopurakuteisu
  39. • Operator SDKにおけるテストスイートケース(雛形あり) Operator SDK(Go-based) – テスト(Step 1) – Copyright

    © 2022, Oracle and/or its affiliates. 39 $ cat controllers/suite_test.go envtestというAPI Serverやetcdをロー カルで利⽤できる仕組みでテスト環 境をセットアップ カバレッジを出⼒してくれるReporter APIも含まれている API Severとetcdの起動 API Severとetcdの停止
  40. envtest • https://book.kubebuilder.io/reference/envtest.html • controller-runtimeに含まれているテストユーティリティパッケージ • API Serverとetcdを起動してOperatorのテストを実⾏可能 • ”BeforeSuite”(テストスイートの前処理)や”BeforeEach”(各テストケースの前処理)で事前リソースを作成

    したり、各テストケース内で必要なリソースの作成や削除で利⽤ • ざっくりとした使い⽅は以下。 • envtest.Environment.Start()でAPI Serverとetcdの起動 • 返却値としてAPI Serverにアクセスするためのrest.Config(kubeconfigにあたる)を取得 • rest.Configからkubernetes.Clientsetを作成 • kubernetes.Clientsetを利⽤して、CRや標準リソースを作成、削除したりすることが可能 • envtest.Environment.Stop()でAPI Serverとetcdの停⽌ (補⾜) envtestについて Copyright © 2022, Oracle and/or its affiliates. 40
  41. • テストケースの実装(⾃分で実装) Operator SDK(Go-based) – テスト(Step 2) – Copyright ©

    2022, Oracle and/or its affiliates. 41 $ vim controllers/ochacafe_test.go 各テストケース前の準備 主には対象OperatorのReconcile関数の 呼び出し It()ブロックが1テストケース CRを作成し、結果(状態)をAssert!!
  42. • テストケースの実⾏ カバレッジレポートをHTML形式でみたい場合・・・ Operator SDK(Go-based) – テスト(Step 3) – Copyright

    © 2022, Oracle and/or its affiliates. 42 $ make test /ochacafe-operator-intro/bin/controller-gen rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases /ochacafe-operator-intro/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..." go fmt ./... go vet ./... KUBEBUILDER_ASSETS=”/Library/Application Support/io.kubebuilder.envtest/k8s/1.21.4-darwin-amd64" go test ./... - coverprofile cover.out ? github.com/oracle-japan/ochacafe-operator-intro [no test files] ? github.com/oracle-japan/ochacafe-operator-intro/api/v1alpha1 [no test files] ok github.com/oracle-japan/ochacafe-operator-intro/controllers 8.632s coverage: 62.7% of statements $ go tool cover -html=cover.out -o cover.html
  43. Operatorのビルド、プッシュ • イメージ名とプッシュ先はMakefileで指定 • OLM(Operator Lifecycle Manager)での実⾏ • OLMのインストール •

    バンドルイメージのビルドとプッシュ • デプロイ • makeでのデプロイ(ダイレクトデプロイ) • デプロイ Operator SDK(Go-based) – デプロイ– Copyright © 2022, Oracle and/or its affiliates. 43 $ make docker-build docker-push $ make deploy デプロイ時はkustomizeを利⽤して、Manifestをビルド(kustomizeコマンドはMakefileに記載) $ operator-sdk olm install $ make bundle bundle-build bundle-push $ operator-sdk run bundle nrt.ocir.io/orasejapan/ochacafe_sample_operator -bundle:v0.0.1
  44. metacontroller • Google社が開発していたKubernetesアドオン機能の⼀つ • 現在は別レポジトリでオープンソースとして開発が継続中 • https://github.com/metacontroller/metacontroller • 最新2.1.1(2022/1現在) •

    Webhookを利⽤してスクリプト形式で実装し、Custom Controller(Operator)をデプロイ可能な仕組み • “metacontroller server” が”CompositeController”と”DecoratorController”(合わせて”lambda controller”と 呼ばれる)を呼び出し、必要な処理を実⾏ • ”lambda controller”の実体は対象のCRとWebhookのエンドポイントを定義したDeployment • Webhookのロジックとして実装に集中できるため、より簡易的にOperatorを実装可能 (参考)metacontroller Copyright © 2022, Oracle and/or its affiliates. 44 今回のサンプルOperatorの場合は、metacontrollerで⼗分実装可能
  45. デモ Takuya Niita Oracle Corporation Japan Jan 19, 2022 Copyright

    © 2022, Oracle and/or its affiliates. 45 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  46. ⾃作Operatorデモ(1) Copyright © 2022, Oracle and/or its affiliates. 46 ochacafe_v1alpha1_ochacafe.yaml

    Ochacafeリソース:2 nginx:latest apply
  47. ⾃作Operatorデモ(2) Copyright © 2022, Oracle and/or its affiliates. 47 ochacafe_v1alpha1_ochacafe.yaml

    apply Ochacafeリソース:5 nginx:latest
  48. Oracle Database Operator • Oracle公式でリリースしたOracle Database⽤のKubernetes Operator • 現時点でα版(商⽤利⽤不可) •

    現在対応している環境は以下の3環境 • OKE:v1.17+ • OCNE:1.3+ • Minikube:1.21+ • 現時点でサポートしている機能は以下 • Autonomous Databaseのライフサイクル管理(プロビジョニング、削除、スケーリングなど) • Oracle Databaseのシングルインスタンスのライフサイクル管理(プロビジョニング、クローン、 パッチなど) • Oracle Databaseのシャーディング構成(シャードデータベース、GSM(Global Service Manager)などの 作成) Oracle Database Operator Copyright © 2022, Oracle and/or its affiliates. 48
  49. Oracle Database Operator • Oracle公式でリリースしたOracle Database⽤のKubernetes Operator • 現時点でα版(商⽤利⽤不可) •

    現在対応している環境は以下の3環境 • OKE:v1.17+ • OCNE:1.3+ • Minikube:1.21+ • 現時点でサポートしている機能は以下 • Autonomous Databaseのライフサイクル管理(プロビジョニング、削除、スケーリングなど) • Oracle Databaseのシングルインスタンスのライフサイクル管理(プロビジョニング、クローン、 パッチなど) • Oracle Databaseのシャーディング構成(シャードデータベース、GSM(Global Service Manager)などの 作成) Oracle Database Operator Copyright © 2022, Oracle and/or its affiliates. 49 これをデモします!!
  50. Oracle Database Operatorデモ Copyright © 2022, Oracle and/or its affiliates.

    50 Operatorによって構築される部分 singleinstancedatabase.yaml apply oci(OKEの標準StorageClass) Block Storage Oracle Database 21c Enterprise Edition Load Balancer
  51. まとめ Takuya Niita Oracle Corporation Japan Jan 19, 2022 Copyright

    © 2022, Oracle and/or its affiliates. 51 Oracle Cloud Hangout Cafe 5 – Kubernetes Operator 超⼊⾨
  52. Kubernetes Operatorパターン • Kubernetesを拡張するための⼿段の⼀つ • ユーザ独⾃のワークロードを定義可能なため、広く利⽤されている拡張⼿段 Kubernetes Operatorを実装する⽅法 • “controller-runtime”と”contoroller-tools”というライブラリセットを利⽤して実装された

    Kubebuilder/Operator SDKを利⽤するのが最適 • Kubebuilder/Operator SDKでは、開発者がコアロジックに集中できるように、開発ライフサイクルや運 ⽤ライフサイクルを効率的に実施可能な仕組みを実装 Kubernetes Operatorの先に⾒えてくるもの・・・ • 従来の「職⼈技」or 「⼿作業運⽤」を「コード」に落とし込み、運⽤を⾃動化 • Kubernetesの仕組みを利⽤して、アプリケーションやワークロードの可能性を無限⼤に拡張すること も可能!! まとめ Copyright © 2022, Oracle and/or its affiliates. 52
  53. 書籍 • Programming Kubernetes • https://www.oreilly.com/library/view/programming-kubernetes/9781492047094/ • Kubernetes Operators: Automating

    the Container Orchestration Platform • https://www.amazon.co.jp/Kubernetes-Operators-Automating-Container-Orchestration-ebook/dp/B0851SQW4V • 実践入門 Kubernetesカスタムコントローラーへの道 • https://amzn.to/3G1aTdM Meetup • Kubernetes Meetup Tokyo #18 • https://k8sjp.connpass.com/event/124114/presentation/ • Kubernetes Meetup Tokyo #23 - Operator Deep Dive • https://k8sjp.connpass.com/event/145942/presentation/ 参考資料 • Kubernetesオペレータのアンチパターン&ベストプラクティス by 池添さん • https://speakerdeck.com/zoetrope/kubernetesoperetafalseantipatan-besutopurakuteisu • OperatorLifecycleManager 101 by 北山さん • https://speakerdeck.com/shkitayama/operatorlifecyclemanager-101 参考情報&Special Thanks!!(1) Copyright © 2022, Oracle and/or its affiliates. 53
  54. 公式ドキュメント • Kubebuilder • GitHub:https://github.com/kubernetes-sigs/kubebuilder • Tutorial:https://zoetrope.github.io/kubebuilder-training/ • Operator SDK

    • GitHub:https://github.com/operator-framework/operator-sdk • Tutorial:https://sdk.operatorframework.io/docs/building-operators/golang/tutorial/ • metacontroller • GitHub:https://github.com/metacontroller/metacontroller • Tutorial:https://metacontroller.github.io/metacontroller/ • CNCF Operator White Paper • https://github.com/cncf/tag-app-delivery/blob/main/operator-wg/whitepaper/Operator-WhitePaper_v1-0.md デモ資材 • Oracle Database Operator • https://github.com/oracle/oracle-database-operator • 任意のDeploymemtを作成してみるOperator(今回のサンプルOperatror) • https://github.com/oracle-japan/ochacafe-operator-intro 参考情報&Special Thanks!!(2) Copyright © 2022, Oracle and/or its affiliates. 54
  55. Thank you 55 Copyright © 2022, Oracle and/or its affiliates.

  56. None