5.3. Go ベースの Operator
5.3.1. Go ベースの Operator の Operator SDK の使用を開始する
Operator SDK によって提供されるツールおよびライブラリーを使用して Go ベースの Operator をセットアップし、実行することに関連した基本内容を示すには、Operator 開発者は Go ベースの Memcached の Operator のサンプル、分散キー/値のストアをビルドして、クラスターへデプロイすることができます。
5.3.1.1. 前提条件
- Operator SDK CLI がインストールされている。
- 
								OpenShift CLI (oc) v4.13 以降がインストールされている
- Go v1.19 以降
- 
								cluster-adminパーミッションを持つアカウントを使用して、ocで OpenShift Container Platform 4.13 クラスターにログインしている
- クラスターがイメージをプルできるように、イメージをプッシュするリポジトリーを public として設定するか、イメージプルシークレットを設定している。
5.3.1.2. Go ベースの Operator の作成およびデプロイ
Operator SDK を使用して Memcached の単純な Go ベースの Operator をビルドし、デプロイできます。
手順
- プロジェクトを作成します。 - プロジェクトディレクトリーを作成します。 - mkdir memcached-operator - $ mkdir memcached-operator- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- プロジェクトディレクトリーに移動します。 - cd memcached-operator - $ cd memcached-operator- 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 - このコマンドは、デフォルトで Go プラグインを使用します。 
 
- API を作成します。 - 単純な Memcached API を作成します。 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Operator イメージをビルドし、プッシュします。 - デフォルトの - Makefileターゲットを使用して Operator をビルドし、プッシュします。プッシュ先となるレジストリーを使用するイメージのプル仕様を使用して- IMGを設定します。- make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag> - $ make docker-build docker-push IMG=<registry>/<user>/<image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Operator を実行します。 - CRD をインストールします。 - make install - $ make install- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- プロジェクトをクラスターにデプロイします。 - IMGをプッシュしたイメージに設定します。- make deploy IMG=<registry>/<user>/<image_name>:<tag> - $ make deploy IMG=<registry>/<user>/<image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- サンプルカスタムリソース (CR) を作成します。 - サンプル CR を作成します。 - oc apply -f config/samples/cache_v1_memcached.yaml \ -n memcached-operator-system- $ oc apply -f config/samples/cache_v1_memcached.yaml \ -n memcached-operator-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Operator を調整する CR を確認します。 - oc logs deployment.apps/memcached-operator-controller-manager \ -c manager \ -n memcached-operator-system- $ oc logs deployment.apps/memcached-operator-controller-manager \ -c manager \ -n memcached-operator-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- Delete a CR. - 次のコマンドを実行して CR を削除します。 - oc delete -f config/samples/cache_v1_memcached.yaml -n memcached-operator-system - $ oc delete -f config/samples/cache_v1_memcached.yaml -n memcached-operator-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- クリーンアップします。 - 以下のコマンドを実行して、この手順の一部として作成されたリソースをクリーンアップします。 - make undeploy - $ make undeploy- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
5.3.1.3. 次のステップ
- Go ベースの Operator のビルドに関する詳細な手順は、Go ベースの Operator の Operator SDK チュートリアル を参照してください。
5.3.2. Go ベースの Operator の Operator SDK チュートリアル
Operator 開発者は、Operator SDK での Go プログラミング言語のサポートを利用して、Go ベースの Memcached の Operator のサンプルをビルドして、分散キー/値のストアを作成し、そのライフサイクルを管理することができます。
このプロセスは、Operator Framework の 2 つの重要な設定要素を使用して実行されます。
- Operator SDK
- 
								operator-sdkCLI ツールおよびcontroller-runtimeライブラリー API
- Operator Lifecycle Manager (OLM)
- クラスター上の Operator のインストール、アップグレード、ロールベースのアクセス制御 (RBAC)
このチュートリアルでは、Go ベースの Operator の Operator SDK の使用を開始する よりも詳細に説明します。
5.3.2.1. 前提条件
- Operator SDK CLI がインストールされている。
- 
								OpenShift CLI (oc) v4.13 以降がインストールされている
- Go v1.19 以降
- 
								cluster-adminパーミッションを持つアカウントを使用して、ocで OpenShift Container Platform 4.13 クラスターにログインしている
- クラスターがイメージをプルできるように、イメージをプッシュするリポジトリーを public として設定するか、イメージプルシークレットを設定している。
5.3.2.2. プロジェクトの作成
						Operator SDK CLI を使用して memcached-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 プラグインを使用します。- operator-sdk initコマンドは、Go モジュール と使用する- go.modファイルを生成します。生成されるファイルには有効なモジュールパスが必要であるため、- $GOPATH/src/外のプロジェクトを作成する場合は、- --repoフラグが必要です。
5.3.2.2.1. PROJECT ファイル
							operator-sdk init コマンドで生成されるファイルの 1 つに、Kubebuilder の PROJECT ファイルがあります。プロジェクトルートから実行される後続の operator-sdk コマンドおよび help 出力は、このファイルを読み取り、プロジェクトタイプが Go であることを認識しています。以下に例を示します。
						
5.3.2.2.2. Manager について
							Operator の主なプログラムは、Manager を初期化して実行する main.go ファイルです。Manager はすべてのカスタムリソース (CR) API 定義の Scheme を自動的に登録し、コントローラーおよび Webhook を設定して実行します。
						
Manager は、すべてのコントローラーがリソースの監視をする namespace を制限できます。
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: namespace})
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: namespace})
							デフォルトで、Manager は Operator が実行される namespace を監視します。すべての namespace を確認するには、namespace オプションを空のままにすることができます。
						
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: ""})
mgr, err := ctrl.NewManager(cfg, manager.Options{Namespace: ""})
							MultiNamespacedCacheBuilder 関数を使用して、特定の namespace セットを監視することもできます。
						
var namespaces []string 
mgr, err := ctrl.NewManager(cfg, manager.Options{ 
   NewCache: cache.MultiNamespacedCacheBuilder(namespaces),
})
var namespaces []string 
mgr, err := ctrl.NewManager(cfg, manager.Options{ 
   NewCache: cache.MultiNamespacedCacheBuilder(namespaces),
})5.3.2.2.3. 複数グループ API について
API およびコントローラーを作成する前に、Operator に複数の API グループが必要かどうかを検討してください。このチュートリアルでは、単一グループ API のデフォルトケースを説明しますが、複数グループ API をサポートするようにプロジェクトのレイアウトを変更するには、以下のコマンドを実行します。
operator-sdk edit --multigroup=true
$ operator-sdk edit --multigroup=true
							このコマンドにより、PROJECT ファイルが更新されます。このファイルは、以下の例のようになります。
						
domain: example.com layout: go.kubebuilder.io/v3 multigroup: true ...
domain: example.com
layout: go.kubebuilder.io/v3
multigroup: true
...
							複数グループプロジェクトの場合、API Go タイプのファイルが apis/<group>/<version>/ ディレクトリーに作成され、コントローラーは controllers/<group>/ ディレクトリーに作成されます。続いて、Dockerfile が適宜更新されます。
						
追加リソース
- 複数グループのプロジェクトへの移行に関する詳細は、Kubebuilder のドキュメント を参照してください。
5.3.2.3. API およびコントローラーの作成
Operator SDK CLI を使用してカスタムリソース定義 (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 でコントローラーが生成されます。
					
5.3.2.3.1. API の定義
							Memcached カスタムリソース (CR) の API を定義します。
						
手順
- api/v1/memcached_types.goで Go タイプの定義を変更し、以下の- specおよび- statusを追加します。- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- リソースタイプ用に生成されたコードを更新します。 - 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インターフェイスを実装します。
5.3.2.3.2. CRD マニフェストの生成
							API が spec フィールドと status フィールドおよびカスタムリソース定義 (CRD) 検証マーカーで定義された後に、CRD マニフェストを生成できます。
						
手順
- 以下のコマンドを実行し、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 マニフェストを生成します。
5.3.2.3.2.1. OpenAPI 検証
								OpenAPIv3 スキーマは、マニフェストの生成時に spec.validation ブロックの CRD マニフェストに追加されます。この検証ブロックにより、Kubernetes が作成または更新時に Memcached CR のプロパティーを検証できます。
							
								API の検証を設定するには、マーカーまたはアノテーションを使用できます。これらのマーカーには、+kubebuilder:validation 接頭辞が常にあります。
							
5.3.2.4. コントローラーの実装
新規 API およびコントローラーの作成後に、コントローラーロジックを実装することができます。
手順
- この例では、生成されたコントローラーファイル - controllers/memcached_controller.goを以下の実装例に置き換えます。- 例5.1 - memcached_controller.goの例- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - コントローラーのサンプルは、それぞれの - Memcachedカスタムリソース (CR) について以下の調整 (reconciliation) ロジックを実行します。- Memcached デプロイメントを作成します (ない場合)。
- 
										デプロイメントのサイズが、MemcachedCR 仕様で指定されたものと同じであることを確認します。
- 
										MemcachedCR ステータスをmemcachedPod の名前に置き換えます。
 
次のサブセクションでは、実装例のコントローラーがリソースを監視する方法と reconcile ループがトリガーされる方法を説明しています。これらのサブセクションを省略し、直接 Operator の実行 に進むことができます。
5.3.2.4.1. コントローラーによって監視されるリソース
							controllers/memcached_controller.go の SetupWithManager() 関数は、CR およびコントローラーによって所有され、管理される他のリソースを監視するようにコントローラーがビルドされる方法を指定します。
						
							NewControllerManagedBy() は、さまざまなコントローラー設定を可能にするコントローラービルダーを提供します。
						
							For(&cachev1.Memcached{}) は、監視するプライマリーリソースとして Memcached タイプを指定します。Memcached タイプのそれぞれの Add、Update、または Delete イベントの場合、reconcile ループに Memcached オブジェクトの (namespace および name キーで構成される) reconcile Request 引数が送られます。
						
							Owns(&appsv1.Deployment{}) は、監視するセカンダリーリソースとして Deployment タイプを指定します。Add、Update、または Delete イベントの各 Deployment タイプの場合、イベントハンドラーは各イベントを、デプロイメントのオーナーの reconcile request にマップします。この場合、デプロイメントが作成された Memcached オブジェクトがオーナーです。
						
5.3.2.4.2. コントローラーの設定
多くの他の便利な設定を使用すると、コントローラーを初期化できます。以下に例を示します。
- MaxConcurrentReconcilesオプションを使用して、コントローラーの同時調整の最大数を設定します。デフォルトは- 1です。- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 述語を使用した監視イベントをフィルタリングします。
- 
									EventHandler のタイプを選択し、監視イベントが reconcile ループの reconcile request に変換する方法を変更します。プライマリーリソースおよびセカンダリーリソースよりも複雑な Operator 関係の場合は、EnqueueRequestsFromMapFuncハンドラーを使用して、監視イベントを任意の reconcile request のセットに変換することができます。
これらの設定およびその他の設定に関する詳細は、アップストリームの Builder および Controller の GoDocs を参照してください。
5.3.2.4.3. reconcile ループ
							すべてのコントローラーには、reconcile ループを実装する Reconcile() メソッドのある reconciler オブジェクトがあります。この reconcile ループには、キャッシュからプライマリーリソースオブジェクトの Memcached を検索するために使用される namespace および name キーである Request 引数が渡されます。
						
返り値、結果、およびエラーに基づいて、Request は再度キューに入れられ、reconcile ループが再びトリガーされる可能性があります。
							Result.RequeueAfter を設定して、猶予期間後にも要求を再びキューに入れることができます。
						
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
								RequeueAfter を定期的な CR の調整に設定している Result を返すことができます。
							
reconciler、クライアント、およびリソースイベントとの対話に関する詳細は、Controller Runtime Client API のドキュメントを参照してください。
5.3.2.4.4. パーミッションおよび RBAC マニフェスト
コントローラーには、管理しているリソースと対話するために特定の RBAC パーミッションが必要です。これらは、以下のような RBAC マーカーを使用して指定されます。
							config/rbac/role.yaml の ClusterRole オブジェクトマニフェストは、make manifests コマンドが実行されるたびに controller-gen ユーティリティーを使用して、以前のマーカーから生成されます。
						
5.3.2.5. プロキシーサポートの有効化
Operator の作成者は、ネットワークプロキシーをサポートする Operator を開発できるようになりました。クラスター管理者は、Operator Lifecycle Manager (OLM) によって処理される環境変数のプロキシーサポートを設定します。Operator は以下の標準プロキシー変数の環境を検査し、値をオペランドに渡して、プロキシーされたクラスターをサポートする必要があります。
- 
								HTTP_PROXY
- 
								HTTPS_PROXY
- 
								NO_PROXY
							このチュートリアルでは、HTTP_PROXY を環境変数の例として使用します。
						
前提条件
- クラスター全体の egress プロキシーが有効にされているクラスター。
手順
- controllers/memcached_controller.goファイルを編集し、以下のパラメーターを追加します。- operator-libライブラリーから- proxyパッケージをインポートします。- import ( ... "github.com/operator-framework/operator-lib/proxy" ) - import ( ... "github.com/operator-framework/operator-lib/proxy" )- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- proxy.ReadProxyVarsFromEnvhelper 関数を調整ループに、結果をオペランド環境に追加します。- for i, container := range dep.Spec.Template.Spec.Containers { dep.Spec.Template.Spec.Containers[i].Env = append(container.Env, proxy.ReadProxyVarsFromEnv()...) } ...- for i, container := range dep.Spec.Template.Spec.Containers { dep.Spec.Template.Spec.Containers[i].Env = append(container.Env, proxy.ReadProxyVarsFromEnv()...) } ...- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 以下を - config/manager/manager.yamlファイルに追加して、Operator デプロイメントに環境変数を設定します。- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
5.3.2.6. Operator の実行
Operator SDK CLI を使用して Operator をビルドし、実行する方法は 3 つあります。
- クラスター外で Go プログラムとしてローカルに実行します。
- クラスター上のデプロイメントとして実行します。
- Operator をバンドルし、Operator Lifecycle Manager (OLM) を使用してクラスター上にデプロイします。
Go ベースの Operator を OpenShift Container Platform でのデプロイメントとして、または OLM を使用するバンドルとして実行する前に、プロジェクトがサポートされているイメージを使用するように更新されていることを確認します。
5.3.2.6.1. クラスター外でローカルに実行する。
Operator プロジェクトをクラスター外の Go プログラムとして実行できます。これは、デプロイメントとテストを迅速化するという開発目的において便利です。
手順
- 以下のコマンドを実行して、 - ~/.kube/configファイルに設定されたクラスターにカスタムリソース定義 (CRD) をインストールし、Operator をローカルで実行します。- make install run - $ make install run- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
5.3.2.6.2. クラスター上でのデプロイメントとしての実行
Operator プロジェクトは、クラスター上でデプロイメントとして実行できます。
前提条件
- プロジェクトを更新してサポートされるイメージを使用することで、OpenShift Container Platform で実行する Go ベースの Operator が準備済みである。
手順
- 以下の - makeコマンドを実行して Operator イメージをビルドし、プッシュします。以下の手順の- IMG引数を変更して、アクセス可能なリポジトリーを参照します。Quay.io などのリポジトリーサイトにコンテナーを保存するためのアカウントを取得できます。- イメージをビルドします。 - make docker-build IMG=<registry>/<user>/<image_name>:<tag> - $ make docker-build IMG=<registry>/<user>/<image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注記- Operator の SDK によって生成される Dockerfile は、 - go buildに関する- GOARCH=amd64を明示的に参照します。これは、AMD64 アーキテクチャー以外の場合は- GOARCH=$TARGETARCHに修正できます。Docker は、- -platformで指定された値に環境変数を自動的に設定します。Buildah では、そのために- -build-argを使用する必要があります。詳細は、Multiple Architectures を参照してください。
- イメージをリポジトリーにプッシュします。 - make docker-push IMG=<registry>/<user>/<image_name>:<tag> - $ make docker-push IMG=<registry>/<user>/<image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注記- 両方のコマンドのイメージの名前とタグ (例: - IMG=<registry>/<user>/<image_name>:<tag>) を Makefile に設定することもできます。- IMG ?= controller:latestの値を変更して、デフォルトのイメージ名を設定します。
 
- 以下のコマンドを実行して Operator をデプロイします。 - make deploy IMG=<registry>/<user>/<image_name>:<tag> - $ make deploy IMG=<registry>/<user>/<image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - デフォルトで、このコマンドは - <project_name>-systemの形式で Operator プロジェクトの名前で namespace を作成し、デプロイメントに使用します。このコマンドは、- config/rbacから RBAC マニフェストもインストールします。
- 以下のコマンドを実行して、Operator が実行されていることを確認します。 - oc get deployment -n <project_name>-system - $ oc get deployment -n <project_name>-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m - NAME READY UP-TO-DATE AVAILABLE AGE <project_name>-controller-manager 1/1 1 1 8m- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
5.3.2.6.3. Operator のバンドルおよび Operator Lifecycle Manager を使用したデプロイ
5.3.2.6.3.1. Operator のバンドル
Operator Bundle Format は、Operator SDK および Operator Lifecycle Manager (OLM) のデフォルトパッケージ方法です。Operator SDK を使用して OLM に対して Operator を準備し、バンドルイメージとして Operator プロジェクトをビルドしてプッシュできます。
前提条件
- 開発ワークステーションに Operator SDK CLI がインストールされている。
- 
										OpenShift CLI (oc) v4.13 以降がインストールされている
- Operator プロジェクトが Operator SDK を使用して初期化されている。
- Operator が Go ベースの場合、プロジェクトを更新して OpenShift Container Platform での実行をサポートするイメージを使用する必要がある。
手順
- 以下の - makeコマンドを Operator プロジェクトディレクトリーで実行し、Operator イメージをビルドし、プッシュします。以下の手順の- IMG引数を変更して、アクセス可能なリポジトリーを参照します。Quay.io などのリポジトリーサイトにコンテナーを保存するためのアカウントを取得できます。- イメージをビルドします。 - make docker-build IMG=<registry>/<user>/<operator_image_name>:<tag> - $ make docker-build IMG=<registry>/<user>/<operator_image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 注記- Operator の SDK によって生成される Dockerfile は、 - go buildに関する- GOARCH=amd64を明示的に参照します。これは、AMD64 アーキテクチャー以外の場合は- GOARCH=$TARGETARCHに修正できます。Docker は、- -platformで指定された値に環境変数を自動的に設定します。Buildah では、そのために- -build-argを使用する必要があります。詳細は、Multiple Architectures を参照してください。
- イメージをリポジトリーにプッシュします。 - make docker-push IMG=<registry>/<user>/<operator_image_name>:<tag> - $ make docker-push IMG=<registry>/<user>/<operator_image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- Operator SDK - generate bundleおよび- bundle validateのサブコマンドを含む複数のコマンドを呼び出す- make bundleコマンドを実行し、Operator バンドルマニフェストを作成します。- make bundle IMG=<registry>/<user>/<operator_image_name>:<tag> - $ make bundle IMG=<registry>/<user>/<operator_image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Operator のバンドルマニフェストは、アプリケーションを表示し、作成し、管理する方法を説明します。 - make bundleコマンドは、以下のファイルおよびディレクトリーを Operator プロジェクトに作成します。- 
												ClusterServiceVersionオブジェクトを含むbundle/manifestsという名前のバンドルマニフェストディレクトリー
- 
												bundle/metadataという名前のバンドルメタデータディレクトリー
- 
												config/crdディレクトリー内のすべてのカスタムリソース定義 (CRD)
- 
												Dockerfile bundle.Dockerfile
 - 続いて、これらのファイルは - operator-sdk bundle validateを使用して自動的に検証され、ディスク上のバンドル表現が正しいことを確認します。
- 
												
- 以下のコマンドを実行し、バンドルイメージをビルドしてプッシュします。OLM は、1 つ以上のバンドルイメージを参照するインデックスイメージを使用して Operator バンドルを使用します。 - バンドルイメージをビルドします。イメージをプッシュしようとするレジストリー、ユーザー namespace、およびイメージタグの詳細で - BUNDLE_IMGを設定します。- make bundle-build BUNDLE_IMG=<registry>/<user>/<bundle_image_name>:<tag> - $ make bundle-build BUNDLE_IMG=<registry>/<user>/<bundle_image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- バンドルイメージをプッシュします。 - docker push <registry>/<user>/<bundle_image_name>:<tag> - $ docker push <registry>/<user>/<bundle_image_name>:<tag>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
5.3.2.6.3.2. Operator Lifecycle Manager を使用した Operator のデプロイ
								Operator Lifecycle Manager (OLM) は、Kubernetes クラスターで Operator (およびそれらの関連サービス) をインストールし、更新し、ライフサイクルを管理するのに役立ちます。OLM はデフォルトで OpenShift Container Platform にインストールされ、Kubernetes 拡張として実行されるため、追加のツールなしにすべての Operator のライフサイクル管理機能に Web コンソールおよび OpenShift CLI (oc) を使用できます。
							
Operator Bundle Format は、Operator SDK および OLM のデフォルトパッケージ方法です。Operator SDK を使用して OLM でバンドルイメージを迅速に実行し、適切に実行されるようにできます。
前提条件
- 開発ワークステーションに Operator SDK CLI がインストールされている。
- Operator バンドルイメージがビルドされ、レジストリーにプッシュされている。
- 
										(OpenShift Container Platform 4.13 など、apiextensions.k8s.io/v1CRD を使用する場合は v1.16.0 以降の) Kubernetes ベースのクラスターに OLM がインストールされていること。
- 
										cluster-admin権限を持つアカウントを使用してocでクラスターにログインしている。
- Operator が Go ベースの場合、プロジェクトを更新して OpenShift Container Platform での実行をサポートするイメージを使用する必要がある。
手順
- 以下のコマンドを入力してクラスターで Operator を実行します。 - operator-sdk run bundle \ -n <namespace> \ <registry>/<user>/<bundle_image_name>:<tag>- $ operator-sdk run bundle \- 1 - -n <namespace> \- 2 - <registry>/<user>/<bundle_image_name>:<tag>- 3 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 1
- run bundleコマンドは、有効なファイルベースのカタログを作成し、OLM を使用して Operator バンドルをクラスターにインストールします。
- 2
- オプション: デフォルトで、このコマンドは~/.kube/configファイルの現在アクティブなプロジェクトに Operator をインストールします。-nフラグを追加して、インストールに異なる namespace スコープを設定できます。
- 3
- イメージを指定しない場合、コマンドはquay.io/operator-framework/opm:latestをデフォルトのインデックスイメージとして使用します。イメージを指定した場合は、コマンドはバンドルイメージ自体をインデックスイメージとして使用します。
 重要- OpenShift Container Platform 4.11 の時点で、Operator カタログに関して、 - run bundleコマンドはデフォルトでファイルベースのカタログ形式をサポートします。Operator カタログに関して、非推奨の SQLite データベース形式は引き続きサポートされますが、今後のリリースで削除される予定です。Operator の作成者はワークフローをファイルベースのカタログ形式に移行することが推奨されます。- このコマンドにより、以下のアクションが行われます。 - バンドルイメージをインジェクトしてインデックスイメージを作成します。インデックスイメージは不透明で一時的なものですが、バンドルを実稼働環境でカタログに追加する方法を正確に反映します。
- 新規インデックスイメージを参照するカタログソースを作成します。これにより、OperatorHub が Operator を検出できるようになります。
- 
												OperatorGroup、Subscription、InstallPlan、および RBAC を含むその他の必要なリソースすべてを作成して、Operator をクラスターにデプロイします。
 
5.3.2.7. カスタムリソースの作成
Operator のインストール後に、Operator によってクラスターに提供されるカスタムリソース (CR) を作成して、これをテストできます。
前提条件
- 
								クラスターにインストールされている MemcachedCR を提供する Memcached Operator の例
手順
- Operator がインストールされている namespace へ変更します。たとえば、 - make deployコマンドを使用して Operator をデプロイした場合は、以下のようになります。- oc project memcached-operator-system - $ oc project memcached-operator-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- config/samples/cache_v1_memcached.yamlで- MemcachedCR マニフェストのサンプルを編集し、以下の仕様が含まれるようにします。- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- CR を作成します。 - oc apply -f config/samples/cache_v1_memcached.yaml - $ oc apply -f config/samples/cache_v1_memcached.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- MemcachedOperator が、正しいサイズで CR サンプルのデプロイメントを作成することを確認します。- oc get deployments - $ oc get deployments- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 8m memcached-sample 3/3 3 3 1m - NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 8m memcached-sample 3/3 3 3 1m- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- ステータスが Memcached Pod 名で更新されていることを確認するために、Pod および CR ステータスを確認します。 - Pod を確認します。 - oc get pods - $ oc get pods- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - NAME READY STATUS RESTARTS AGE memcached-sample-6fd7c98d8-7dqdr 1/1 Running 0 1m memcached-sample-6fd7c98d8-g5k7v 1/1 Running 0 1m memcached-sample-6fd7c98d8-m7vn7 1/1 Running 0 1m - NAME READY STATUS RESTARTS AGE memcached-sample-6fd7c98d8-7dqdr 1/1 Running 0 1m memcached-sample-6fd7c98d8-g5k7v 1/1 Running 0 1m memcached-sample-6fd7c98d8-m7vn7 1/1 Running 0 1m- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- CR ステータスを確認します。 - oc get memcached/memcached-sample -o yaml - $ oc get memcached/memcached-sample -o yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- デプロイメントサイズを更新します。 - config/samples/cache_v1_memcached.yamlファイルを更新し、- MemcachedCR の- spec.sizeフィールドを- 3から- 5に変更します。- oc patch memcached memcached-sample \ -p '{"spec":{"size": 5}}' \ --type=merge- $ oc patch memcached memcached-sample \ -p '{"spec":{"size": 5}}' \ --type=merge- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Operator がデプロイメントサイズを変更することを確認します。 - oc get deployments - $ oc get deployments- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 出力例 - NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 10m memcached-sample 5/5 5 5 3m - NAME READY UP-TO-DATE AVAILABLE AGE memcached-operator-controller-manager 1/1 1 1 10m memcached-sample 5/5 5 5 3m- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
- 次のコマンドを実行して CR を削除します。 - oc delete -f config/samples/cache_v1_memcached.yaml - $ oc delete -f config/samples/cache_v1_memcached.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- このチュートリアルの一環として作成したリソースをクリーンアップします。 - Operator のテストに - make deployコマンドを使用した場合は、以下のコマンドを実行します。- make undeploy - $ make undeploy- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Operator のテストに - operator-sdk run bundleコマンドを使用した場合は、以下のコマンドを実行します。- operator-sdk cleanup <project_name> - $ operator-sdk cleanup <project_name>- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
5.3.3. Go ベースの Operator のプロジェクトレイアウト
					operator-sdk CLI は、各 Operator プロジェクトに多数のパッケージおよびファイルを生成、または スキャフォールディング することができます。
				
5.3.3.1. Go ベースのプロジェクトレイアウト
						operator-sdk init コマンドを使用して生成される Go ベースの Operator プロジェクト (デフォルトタイプ) には、以下のディレクトリーおよびファイルが含まれます。
					
| ファイルまたはディレクトリー | 目的 | 
|---|---|
| 
										 | 
										Operator のメインプログラム。これは、 | 
| 
										 | 
										CRD の API を定義するディレクトリーツリー。 | 
| 
										 | 
										コントローラーの実装。 | 
| 
										 | クラスターにコントローラーをデプロイするために使用される Kubernetes マニフェスト (CRD、RBAC、および証明書を含む)。 | 
| 
										 | コントローラーのビルドおよびデプロイに使用するターゲット。 | 
| 
										 | コンテナーエンジンが Operator をビルドするために使用する手順。 | 
| 
										 | CRD の登録、RBAC のセットアップ、およびデプロイメントとして Operator のデプロイをする Kubernetes マニフェスト。 | 
5.3.4. Go ベースの Operator プロジェクトを新しい Operator SDK バージョン用に更新する
OpenShift Container Platform 4.13 は Operator SDK 1.28.0 をサポートします。ワークステーションにすでに 1.36.1 CLI がインストールされている場合は、最新バージョンをインストール して CLI を 1.38.0 に更新できます。
ただし、既存の Operator プロジェクトが Operator SDK 1.28.0 との互換性を維持するには、1.25.4 以降に導入された関連する重大な変更に対し、更新手順を実行する必要があります。アップグレードの手順は、以前は 1.25.4 で作成または維持されている Operator プロジェクトのいずれかで手動で実行する必要があります。
5.3.4.1. Operator SDK 1.28.0 の Go ベースの Operator プロジェクトの更新
次の手順では、1.28.0 との互換性を確保するため、既存の Go ベースの Operator プロジェクトを更新します。
前提条件
- Operator SDK 1.28.0 がインストールされている
- Operator SDK 1.25.4 で作成または保守されている Operator プロジェクト
手順
- 次のファイルで - ose-kube-rbac-proxyプル仕様を見つけて、イメージタグを- v4.13に更新します。- 
										config/default/manager_auth_proxy_patch.yaml
- 
										bundle/manifests/memcached-operator.clusterserviceversion.yaml
 - … containers: - name: kube-rbac-proxy image: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.13 …- … containers: - name: kube-rbac-proxy image: registry.redhat.io/openshift4/ose-kube-rbac-proxy:v4.13- 1 - …- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 1
- タグバージョンをv4.12からv4.13に更新します。
 
- 
										
- go.modファイルを変更して、次の依存関係と更新されたバージョンを含めます。- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 次のコマンドを実行して、最新の依存関係をダウンロードします。 - go mod tidy - $ go mod tidy- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Makefile を次のように変更します。 - 
										ENVTEST_K8S_VERSIONフィールドを1.25から1.26に変更します。
- buildターゲットを- generate fmt vetから- manifests generated fmt vetに変更します。- - build: generate fmt vet ## Build manager binary. + build: manifests generate fmt vet ## Build manager binary.- - build: generate fmt vet ## Build manager binary. + build: manifests generate fmt vet ## Build manager binary.- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
 
-