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/v1beta2
API グループをサポートするもの) にインストールされる Operator Lifecycle Manager (OLM) -
cluster-admin
パーミッションのあるアカウントを使用したクラスターへのアクセス -
OpenShift CLI (
oc
) v4.6+ (インストール済み)
手順
Operator プロジェクトを作成します。
プロジェクトのディレクトリーを作成します。
mkdir -p $HOME/projects/memcached-operator
$ mkdir -p $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ディレクトリーに切り替えます。
cd $HOME/projects/memcached-operator
$ cd $HOME/projects/memcached-operator
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Go モジュールのサポートをアクティブにします。
export GO111MODULE=on
$ export GO111MODULE=on
Copy 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-operator
Copy 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:nonroot
Copy 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:latest
Copy 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.6
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
以下の行を置き換えて、Makefile の
test
ターゲットを更新し、後続のビルドで必要な依存関係をインストールできるようにします。例5.1 既存の
test
ターゲットtest: generate fmt vet manifests go test ./... -coverprofile cover.out
test: generate fmt vet manifests go test ./... -coverprofile cover.out
Copy 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.out
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.out
Copy 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=Memcached
Copy 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] y
Copy 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 generate
Copy 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 manifests
Copy 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 string
Copy 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 manifests
Copy 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 コントローラーのサンプルは、それぞれの
Memcached
CR について以下の調整 (reconciliation) ロジックを実行します。- Memcached デプロイメントを作成します (ない場合)。
-
デプロイメントのサイズが、
Memcached
CR 仕様で指定されたものと同じであることを確認します。 -
Memcached
CR ステータスをmemcached
Pod の名前に置き換えます。
次の 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}, nil
import "time" // Reconcile for any reason other than an error after 5 seconds return ctrl.Result{RequeueAfter: time.Second*5}, nil
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記RequeueAfter
を定期的な CR の調整に設定しているResult
を返すことができます。reconciler、クライアント、およびリソースイベントとの対話に関する詳細は、Controller Runtime Client API のドキュメントを参照してください。