This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.5.3. Go ベースの Operator の作成
Operator 開発者は、Operator SDK での Go プログラミング言語のサポートを利用して、Go ベースの Memcached Operator のサンプルをビルドして、分散キー/値のストアを作成し、そのライフサイクルを管理することができます。
Kubebuilder は Go ベース Operator のスキャフォールディングソリューションとして、Operator SDK に組み込まれます。
5.3.1. Operator SDK を使用した Go ベース Operator の作成 リンクのコピーリンクがクリップボードにコピーされました!
Operator SDK は、詳細なアプリケーション固有の運用上の知識を必要とする可能性のあるプロセスである、Kubernetes ネイティブアプリケーションのビルドを容易にします。SDK はこの障壁を低くするだけでなく、メータリングやモニターリングなどの数多くの一般的な管理機能に必要なスケルトンコードの量を減らします。
この手順では、SDK によって提供されるツールおよびライブラリーを使用して単純な Memcached Operator を作成する例を示します。
前提条件
- 開発ワークステーションにインストールされる Operator SDK v0.19.4 CLI
-
OpenShift Container Platform 4.6 などの、Kubernetes ベースのクラスター (v1.8 以上の
apps/v1beta2API グループをサポートするもの) にインストールされる Operator Lifecycle Manager (OLM) -
cluster-adminパーミッションのあるアカウントを使用したクラスターへのアクセス -
OpenShift CLI (
oc) v4.6+ (インストール済み)
手順
Operator プロジェクトを作成します。
プロジェクトのディレクトリーを作成します。
mkdir -p $HOME/projects/memcached-operator
$ mkdir -p $HOME/projects/memcached-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーに切り替えます。
cd $HOME/projects/memcached-operator
$ cd $HOME/projects/memcached-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow Go モジュールのサポートをアクティブにします。
export GO111MODULE=on
$ export GO111MODULE=onCopy to Clipboard Copied! Toggle word wrap Toggle overflow operator-sdk initコマンドを実行してプロジェクトを初期化します。operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operator$ operator-sdk init \ --domain=example.com \ --repo=github.com/example-inc/memcached-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記operator-sdk initコマンドは、デフォルトでgo.kubebuilder.io/v2プラグインを使用します。
サポートされるイメージを使用するよう Operator を更新します。
プロジェクトのルートレベルの Dockerfile で、デフォルトのランナーイメージの参照フォームを変更します。
FROM gcr.io/distroless/static:nonroot
FROM gcr.io/distroless/static:nonrootCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のように変更してください。
FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
FROM registry.access.redhat.com/ubi8/ubi-minimal:latestCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Go プロジェクトのバージョンによっては、 Dockerfile に
USER 65532:65532またはUSER nonroot:nonrootディレクティブが含まれる可能性があります。いずれの場合も、サポートされるランナーイメージでは必要ないため、その行を削除します。 config/default/manager_auth_proxy_patch.yamlファイルで、以下のimageの値を変更します。gcr.io/kubebuilder/kube-rbac-proxy:<tag>
gcr.io/kubebuilder/kube-rbac-proxy:<tag>Copy to Clipboard Copied! Toggle word wrap Toggle overflow サポートされるイメージを使用するには、以下へ変更します。
registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.6
registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.6Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以下の行を置き換えて、Makefile の
testターゲットを更新し、後続のビルドで必要な依存関係をインストールできるようにします。例5.1 既存の
testターゲットtest: generate fmt vet manifests go test ./... -coverprofile cover.outtest: generate fmt vet manifests go test ./... -coverprofile cover.outCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の行を使用します。
例5.2 更新された
testターゲットENVTEST_ASSETS_DIR=$(shell pwd)/testbin test: manifests generate fmt vet ## Run tests. mkdir -p ${ENVTEST_ASSETS_DIR} test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.7.2/hack/setup-envtest.sh source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.outENVTEST_ASSETS_DIR=$(shell pwd)/testbin test: manifests generate fmt vet ## Run tests. mkdir -p ${ENVTEST_ASSETS_DIR} test -f ${ENVTEST_ASSETS_DIR}/setup-envtest.sh || curl -sSLo ${ENVTEST_ASSETS_DIR}/setup-envtest.sh https://raw.githubusercontent.com/kubernetes-sigs/controller-runtime/v0.7.2/hack/setup-envtest.sh source ${ENVTEST_ASSETS_DIR}/setup-envtest.sh; fetch_envtest_tools $(ENVTEST_ASSETS_DIR); setup_envtest_env $(ENVTEST_ASSETS_DIR); go test ./... -coverprofile cover.outCopy to Clipboard Copied! Toggle word wrap Toggle overflow カスタムリソース定義 (CRD) API およびコントローラーを作成します。
以下のコマンドを実行して、グループ
cache、バージョンv1、および種類Memcachedを指定して API を作成します。operator-sdk create api \ --group=cache \ --version=v1 \ --kind=Memcached$ operator-sdk create api \ --group=cache \ --version=v1 \ --kind=MemcachedCopy to Clipboard Copied! Toggle word wrap Toggle overflow プロンプトが表示されたら
yを入力し、リソースとコントローラーの両方を作成します。Create Resource [y/n] y Create Controller [y/n] y
Create Resource [y/n] y Create Controller [y/n] yCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...
Writing scaffold for you to edit... api/v1/memcached_types.go controllers/memcached_controller.go ...Copy to Clipboard Copied! Toggle word wrap Toggle overflow このプロセスでは、
api/v1/memcached_types.goで Memcached リソース API が生成され、controllers/memcached_controller.goでコントローラーが生成されます。api/v1/memcached_types.goで Go タイプの定義を変更し、以下のspecおよびstatusを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow +kubebuilder:subresource:statusマーカーを追加し、statusサブリソースを CRD マニフェストに追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- この行を追加します。
これにより、コントローラーは残りの CR オブジェクトを変更せずに CR ステータスを更新できます。
リソースタイプ用に生成されたコードを更新します。
make generate
$ make generateCopy to Clipboard Copied! Toggle word wrap Toggle overflow ヒント*_types.goファイルの変更後は、make generateコマンドを実行し、該当するリソースタイプ用に生成されたコードを更新する必要があります。上記の Makefile ターゲットは
controller-genユーティリティーを呼び出して、api/v1/zz_generated.deepcopy.goファイルを更新します。これにより、API Go タイプの定義は、すべてのKindタイプが実装する必要のあるruntime.Objectインターフェイスが実装されます。
CRD マニフェストを生成して更新します。
make manifests
$ make manifestsCopy to Clipboard Copied! Toggle word wrap Toggle overflow この Makefile ターゲットは
controller-genユーティリティーを呼び出し、config/crd/bases/cache.example.com_memcacheds.yamlファイルに CRD マニフェストを生成します。オプション: カスタム検証を CRD に追加します。
OpenAPI v3.0 スキーマは、マニフェストの生成時に
spec.validationブロックの CRD マニフェストに追加されます。この検証ブロックにより、Kubernetes の作成または更新時にMemcachedカスタムリソース (CR) のプロパティーを検証できます。Operator の作成者は Kubebuilder markers と呼ばれるアノテーションのような、単一行のコメントを使用して API のカスタム検証を設定できます。これらのマーカーには、
+kubebuilder:validation接頭辞が常に必要です。たとえば、以下のマーカーを追加して enum 型の仕様を追加できます。// +kubebuilder:validation:Enum=Lion;Wolf;Dragon type Alias string
// +kubebuilder:validation:Enum=Lion;Wolf;Dragon type Alias stringCopy to Clipboard Copied! Toggle word wrap Toggle overflow API コードのマーカーの使用については、Kubebuilder ドキュメントの Generating CRDs および Markers for Config/Code Generation を参照してください。OpenAPIv3 検証マーカーの詳細の一覧については、Kubebuilder ドキュメントの CRD Validation を参照してください。
カスタム検証を追加する場合は、以下のコマンドを実行し、CRD の OpenAPI 検証セクションを更新します。
make manifests
$ make manifestsCopy to Clipboard Copied! Toggle word wrap Toggle overflow
新規 API およびコントローラーの作成後に、コントローラーロジックを実装することができます。この例では、生成されたコントローラーファイル
controllers/memcached_controller.goを以下の実装例に置き換えます。例5.3
memcached_controller.goの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow コントローラーのサンプルは、それぞれの
MemcachedCR について以下の調整 (reconciliation) ロジックを実行します。- Memcached デプロイメントを作成します (ない場合)。
-
デプロイメントのサイズが、
MemcachedCR 仕様で指定されたものと同じであることを確認します。 -
MemcachedCR ステータスをmemcachedPod の名前に置き換えます。
次の 2 つのサブステップでは、コントローラーがリソースを監視する方法および調整ループがトリガーされる方法を検査します。これらの手順を省略し、直接 Operator のビルドおよび実行に進むことができます。
controllers/memcached_controller.goファイルでコントローラーの実装を検査し、コントローラーのリソースの監視方法を確認します。SetupWithManager()関数は、CR およびコントローラーによって所有され、管理される他のリソースを監視するようにコントローラーがビルドされる方法を指定します。例5.4
SetupWithManager()関数Copy to Clipboard Copied! Toggle word wrap Toggle overflow NewControllerManagedBy()は、さまざまなコントローラー設定を可能にするコントローラービルダーを提供します。For(&cachev1.Memcached{})は、監視するプライマリーリソースとしてMemcachedタイプを指定します。Memcachedタイプのそれぞれの Add、Update、または Delete イベントの場合、reconcile ループにMemcachedオブジェクトの (namespace および name キーから成る) reconcileRequest引数が送られます。Owns(&appsv1.Deployment{})は、監視するセカンダリーリソースとしてDeploymentタイプを指定します。Add、Update、または Delete イベントの各Deploymentタイプの場合、イベントハンドラーは各イベントを、デプロイメントのオーナーの reconcile request にマップします。この場合、デプロイメントが作成されたMemcachedオブジェクトがオーナーです。すべてのコントローラーには、reconcile ループを実装する
Reconcile()メソッドのある reconciler オブジェクトがあります。この reconcile ループには、キャッシュからプライマリーリソースオブジェクトのMemcachedを検索するために使用される namespace および name キーであるRequest引数が渡されます。例5.5 reconcile ループ
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Reconcile()関数の返り値に応じて、reconcileRequestは再度キューに入れられ、ループが再びトリガーされる可能性があります。例5.6 再キューロジック
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Result.RequeueAfterを設定して、猶予期間後に要求を再びキューに入れることができます。例5.7 猶予期間後の再キュー
import "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nilimport "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nilCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記RequeueAfterを定期的な CR の調整に設定しているResultを返すことができます。reconciler、クライアント、およびリソースイベントとの対話に関する詳細は、Controller Runtime Client API のドキュメントを参照してください。