5.6. クラスターサービスバージョン (CSV) の定義
クラスターサービスバージョン (CSV) は、ClusterServiceVersion オブジェクトで定義され、Operator Lifecycle Manager (OLM) によるクラスターでの Operator の実行をサポートする Operator メタデータから作成される YAML マニフェストです。これは、ユーザーインターフェイスにロゴ、説明、およびバージョンなどの情報を設定するために使用される Operator コンテナーイメージに伴うメタデータです。CSV は、Operator が必要とする RBAC ルールやそれが管理したり、依存したりするカスタムリソース (CR) などの Operator の実行に必要な技術情報の情報源でもあります。
Operator SDK には、YAML マニフェストおよび Operator ソースファイルに含まれる情報を使用してカスタマイズされた現行 Operator プロジェクトの CSV を生成するための CSV ジェネレーターが含まれます。
Operator プロジェクトの関連スキャフォールディングおよびテストツールなど、Red Hat がサポートするバージョンの Operator SDK CLI ツールは非推奨となり、OpenShift Container Platform の今後のリリースで削除される予定です。Red Hat は、現在のリリースライフサイクル中にこの機能のバグ修正とサポートを提供しますが、この機能は今後、機能拡張の提供はなく、OpenShift Container Platform リリースから削除されます。
新しい Operator プロジェクトを作成する場合、Red Hat がサポートするバージョンの Operator SDK は推奨されません。既存の Operator プロジェクトを使用する Operator 作成者は、OpenShift Container Platform 4.18 でリリースされるバージョンの Operator SDK CLI ツールを使用してプロジェクトを維持し、OpenShift Container Platform の新しいバージョンを対象とする Operator リリースを作成できます。
Operator プロジェクトの次の関連ベースイメージは 非推奨 ではありません。これらのベースイメージのランタイム機能と設定 API は、バグ修正と CVE への対応のために引き続きサポートされます。
- Ansible ベースの Operator プロジェクトのベースイメージ
- Helm ベースの Operator プロジェクトのベースイメージ
OpenShift Container Platform で非推奨となったか、削除された主な機能の最新の一覧は、OpenShift Container Platform リリースノートの 非推奨および削除された機能 セクションを参照してください。
サポートされていない、コミュニティーによって管理されているバージョンの Operator SDK は、Operator SDK (Operator Framework) を参照してください。
CSV で生成されるコマンドにより、Operator の作成者が OLM を詳しく知らなくても、Operator は OLM と対話したり、メタデータをカタログレジストリーに公開したりできます。また、Kubernetes および OLM の新機能が実装される過程で CSV 仕様が変更される可能性が高いため、Operator SDK はその後の新規 CSV 機能を処理できるように更新システムを容易に拡張できるようになっています。
5.6.1. CSV 生成の仕組み リンクのコピーリンクがクリップボードにコピーされました!
クラスターサービスバージョン (CSV) を含む Operator バンドルマニフェストは、Operator Lifecycle Manager (OLM) でアプリケーションを表示、作成、および管理する方法を説明します。generate bundle サブコマンドによって呼び出される Operator SDK の CSV ジェネレーターは、Operator をカタログに公開し、これを OLM でデプロイする最初の手順になります。サブコマンドには、CSV マニフェストを作成するための特定の入力マニフェストが必要です。すべての入力は、コマンドが CSV ベースと共に呼び出される際に読み取られ、べき等性で CSV を生成したり、再生成したりします。
通常は、generate kustomize manifests サブコマンドが最初に実行され、generate bundle サブコマンドで使用される入力された Kustomize ベースを生成します。ただし、Operator SDK は make bundle コマンドを提供します。これは、以下のサブコマンドを順番に実行するなどの複数のタスクを自動化します。
-
generate kustomize manifests -
generate bundle -
bundle validate
5.6.1.1. 生成されるファイルおよびリソース リンクのコピーリンクがクリップボードにコピーされました!
make bundle コマンドは、以下のファイルおよびディレクトリーを Operator プロジェクトに作成します。
-
ClusterServiceVersion(CSV) オブジェクトを含むbundle/manifestsという名前のバンドルマニフェストディレクトリー -
bundle/metadataという名前のバンドルメタデータディレクトリー -
config/crdディレクトリー内のすべてのカスタムリソース定義 (CRD) -
Dockerfile
bundle.Dockerfile
通常、以下のリソースは CSV に含まれます。
- Role
- namespace 内で Operator パーミッションを定義します。
- ClusterRole
- クラスター全体の Operator パーミッションを定義します。
- デプロイメント
- Operator のオペランドが Pod で実行される方法を定義します。
- CustomResourceDefinition (CRD)
- Operator が調整するカスタムリソースを定義します。
- カスタムリソースの例
- 特定の CRD の仕様に従ったリソースの例。
5.6.1.2. バージョンの管理 リンクのコピーリンクがクリップボードにコピーされました!
generate bundle サブコマンドの --version フラグは、バンドルの初回作成時および既存バンドルのアップグレード時に、バンドルのセマンティックバージョンを提供します。
Makefile に VERSION 変数を設定することで、--version フラグは、generate bundle サブコマンドが make bundle コマンドによって実行される際に、値を使用して自動的に呼び出されます。CSV バージョンは Operator のバージョンと同じであり、新規 CSV は Operator バージョンのアップグレード時に生成されます。
5.6.2. 手動で定義される CSV フィールド リンクのコピーリンクがクリップボードにコピーされました!
多くの CSV フィールドは、生成された、Operator SDK に特化していない汎用マニフェストを使用して設定することはできません。これらのフィールドは、ほとんどの場合、Operator および各種のカスタムリソース定義 (CRD) に関する人間が作成するメタデータです。
Operator 作成者はそれらのクラスターサービスバージョン (CSV) YAML ファイルを直接変更する必要があり、パーソナライズ設定されたデータを以下の必須フィールドに追加します。Operator SDK は、必須フィールドのいずれかにデータが欠落していることが検出されると、CSV 生成時に警告を送信します。
以下の表は、手動で定義された CSV フィールドのうち、必須フィールドとオプションフィールドを詳細に示しています。
| フィールド | 説明 |
|---|---|
|
|
CSV の固有名。Operator バージョンは、 |
|
|
Operator の成熟度モデルに応じた機能レベル。オプションには、 |
|
| Operator を識別するためのパブリック名。 |
|
| Operator の機能に関する簡単な説明。 |
|
| Operator を記述するキーワード。 |
|
|
|
|
|
|
|
| Operator 内部で使用されるキー/値のペア。 |
|
|
Operator のセマンティクスバージョン。例: |
|
|
Operator が使用する任意の CRD。このフィールドは、CRD YAML ファイルが
|
| フィールド | 説明 |
|---|---|
|
| この CSV によって置き換えられる CSV の名前。 |
|
|
それぞれが |
|
| Operator がクラスターでのリソースのペアの作成に使用するセレクター。 |
|
|
|
|
|
このバージョンでソフトウェアが達成した成熟度。オプションに、 |
上記の各フィールドが保持するデータの詳細は、CSV spec を参照してください。
現時点で、ユーザーの介入を必要とするいくつかの YAML フィールドは、Operator コードから解析される可能性があります。
5.6.3. Operator メタデータアノテーション リンクのコピーリンクがクリップボードにコピーされました!
Operator 開発者は、クラスターサービスバージョン (CSV) のメタデータに特定のアノテーションを設定して、OperatorHub や Red Hat Ecosystem Catalog などのユーザーインターフェイス (UI) の機能を有効にしたり、機能を強調したりできます。Operator のメタデータのアノテーションは、CSV YAML ファイルの metadata.annotations フィールドを設定して手動で定義します。
5.6.3.1. インフラストラクチャー機能のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
features.operators.openshift.io グループのアノテーションは、Operator がサポートするインフラストラクチャー機能の詳細を表すものです。この機能は、"true" または "false" 値を設定することで指定されます。ユーザーは、Web コンソールや Red Hat Ecosystem Catalog の OperatorHub から Operator を探すときに、これらの機能を使用して表示やフィルタリングを行うことができます。これらのアノテーションは、OpenShift Container Platform 4.10 以降でサポートされています。
features.operators.openshift.io のインフラストラクチャー機能のアノテーションにより、OpenShift Container Platform の以前のバージョンで使用されていた operators.openshift.io/infrastructure-features アノテーションが非推奨となりました。詳細は、「非推奨のインフラストラクチャー機能のアノテーション」を参照してください。
| アノテーション | 説明 | 有効な値 [1] |
|---|---|---|
|
|
Operator はすべての依存関係を含む非接続カタログにミラーリングされるため、インターネットへのアクセスは必要ないかどうかを指定します。Operator は、 |
|
|
| Operator が基盤となるプラットフォームの FIPS-140 設定を受け入れ、FIPS モードで起動したノードで動作するかどうかを指定します。このモードでは、Operator とそれが管理するすべてのワークロード (オペランド) は、FIPS-140 検証用に提出された Red Hat Enterprise Linux (RHEL) 暗号化ライブラリーのみを呼び出します。 |
|
|
|
標準の |
|
|
| Operator が使用する TLS 暗号スイート、および該当する場合は管理対象のワークロード (オペランド) を変更するための既知の設定項目を Operator が実装するかどうかを指定します。 |
|
|
| Cloud Credential Operator (CCO) を使用して、AWS Secure Token Service (STS) を介した AWS API によるトークン化認証の設定を Operator がサポートするかどうかを指定します。 |
|
|
| Cloud Credential Operator (CCO) を使用して、Azure マネージド ID を介した Azure API によるトークン化認証の設定を Operator がサポートするかどうかを指定します。 |
|
|
| Cloud Credential Operator (CCO) を使用して、GCP Workload Identity Foundation (WIF) を介した Google Cloud API によるトークン化認証の設定を Operator がサポートするかどうかを指定します。 |
|
|
| Cloud-Native Network Function (CNF) Kubernetes プラグインを Operator が提供するかどうかを指定します。 |
|
|
| Container Network Interface (CNI) Kubernetes プラグインを Operator が提供するかどうかを指定します。 |
|
|
| Container Storage Interface (CSI) Kubernetes プラグインを Operator が提供するかどうかを指定します。 |
|
- Kubernetes アノテーションは文字列でなければならないため、有効な値は意図的に二重引用符で囲んで表示されています。
インフラストラクチャー機能のアノテーションを含む CSV の例
5.6.3.2. 非推奨のインフラストラクチャー機能のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform 4.14 以降、operators.openshift.io/infrastructure-features のアノテーションのグループが、features.operators.openshift.io namespace のアノテーションのグループによって非推奨となりました。新しいアノテーションを使用することを推奨しますが、現在は両方のグループを並行して使用できます。
これらのアノテーションは、Operator がサポートするインフラストラクチャー機能の詳細を表すものです。ユーザーは、Web コンソールや Red Hat Ecosystem Catalog の OperatorHub から Operator を探すときに、これらの機能を使用して表示やフィルタリングを行うことができます。
| 有効なアノテーション値 | 説明 |
|---|---|
|
| Operator はすべての依存関係を含む非接続カタログにミラーリングされるため、インターネットへのアクセスは必要ありません。ミラーリングに必要なすべての関連イメージが Operator によって一覧表示されます。 |
|
| Operator は Cloud-native Network Functions (CNF) Kubernetes プラグインを提供します。 |
|
| Operator は Container Network Interface (CNI) Kubernetes プラグインを提供します。 |
|
| Operator は Container Storage Interface (CSI) Kubernetes プラグインを提供します。 |
|
| Operator は基盤となるプラットフォームの FIPS モードを受け入れ、FIPS モードで起動したノードで動作します。 重要 FIPS モードでブートされた Red Hat Enterprise Linux (RHEL) または Red Hat Enterprise Linux CoreOS (RHCOS) を実行する場合、OpenShift Container Platform コアコンポーネントは、x86_64、ppc64le、および s390x アーキテクチャーのみで、FIPS 140-2/140-3 検証のために NIST に提出された RHEL 暗号化ライブラリーを使用します。 |
|
|
Operator はプロキシーの背後のクラスターでの実行をサポートします。Operator は、クラスターがプロキシーを使用するように設定される際に Operator Lifecycle Manager (OLM) が Operator に自動的に提供する標準のプロキシー環境変数の |
disconnected および proxy-aware サポートを含む CSV の例
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/infrastructure-features: '["disconnected", "proxy-aware"]'
5.6.3.3. その他の任意のアノテーション リンクのコピーリンクがクリップボードにコピーされました!
次の Operator のアノテーションは任意です。
| アノテーション | 説明 |
|---|---|
|
| カスタムリソース定義 (CRD) テンプレートに最低限の設定セットを指定します。互換性のある UI は、ユーザーがさらにカスタマイズできるようにこのテンプレートの事前入力を行います。 |
|
|
Operator のインストール中に、クラスターサービスバージョン (CSV) に |
|
| Operator をデプロイする必要のある推奨 namespace を設定します。 |
|
|
指定された |
|
| ユーザーの操作を目的としていない UI の CRD を非表示にします。 |
|
|
Operator を使用するために必要とされる特定のサブスクリプションをリスト表示するための自由形式の配列です。例: |
|
|
クラスター上の、operators.openshift.io/must-gather-image でアノテーションが付けられたすべての Operator のデフォルトイメージを使用して、 |
OpenShift Container Platform ライセンス要件を含む CSV の例
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/valid-subscription: '["OpenShift Container Platform"]'
3scale ライセンス要件を含む CSV の例
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/valid-subscription: '["3Scale Commercial License", "Red Hat Managed Integration"]'
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
operators.openshift.io/valid-subscription: '["3Scale Commercial License", "Red Hat Managed Integration"]'
5.6.4. ネットワークが制限された環境に関する Operator の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Operator の作成者は、Operator がネットワークが制限された環境、または非接続の環境で適切に実行されるよう追加要件を満たすことを確認する必要があります。
非接続モードをサポートするための Operator の要件
- ハードコードされたイメージ参照は、環境変数に置き換えます。
Operator のクラスターサービスバージョン (CSV) で以下を行います。
- Operator がそれらの機能を実行するために必要となる可能性のある 関連イメージ または他のコンテナーをリスト表示します。
- 指定されたすべてのイメージを、タグではなくダイジェスト (SHA) で参照します。
- Operator のすべての依存関係は、非接続モードでの実行もサポートする必要があります。
- Operator にはクラスター外のリソースは必要ありません。
前提条件
- CSV を含む Operator プロジェクト次の手順では、Go ベース、Ansible ベース、および Helm ベースのプロジェクトの例として Memcached Operator を使用します。
手順
config/manager/manager.yamlファイルで、Operator が使用する追加のイメージ参照の環境変数を設定します。ハードコードされたイメージ参照は、Operator プロジェクトタイプに関連するファイルの環境変数に置き換えます。
Go ベースの Operator プロジェクトの場合には、次の例に示すように、環境変数を
controllers/memcached_controller.goファイルに追加します。Ansible ベースの Operator プロジェクトの場合には、次の例に示すように、環境変数を
roles/memcached/tasks/main.ymlファイルに追加します。Helm ベースの Operator プロジェクトの場合、以下の例のように
overrideValuesフィールドをwatches.yamlファイルに追加します。例5.5
watches.yamlファイルの例以下の例のように、
overrideValuesフィールドの値をhelm-charts/memchached/values.yamlファイルに追加します。helm-charts/memchached/values.yamlファイルの例... relatedImage: ""
... relatedImage: ""Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の例のように、
helm-charts/memcached/templates/deployment.yamlファイルのチャートテンプレートを編集します。
次の変更を加えて、
BUNDLE_GEN_FLAGS変数定義をMakefileに追加します。Makefileの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow タグではなくダイジェスト (SHA) を使用するように Operator イメージを更新するには、
make bundleコマンドを実行し、USE_IMAGE_DIGESTSをtrueに設定します。make bundle USE_IMAGE_DIGESTS=true
$ make bundle USE_IMAGE_DIGESTS=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow disconnectedアノテーションを追加します。これは、Operator が非接続環境で機能することを示します。metadata: annotations: operators.openshift.io/infrastructure-features: '["disconnected"]'metadata: annotations: operators.openshift.io/infrastructure-features: '["disconnected"]'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Operator は、このインフラストラクチャー機能によって OperatorHub でフィルターされます。
5.6.5. 複数のアーキテクチャーおよびオペレーティングシステム用の Operator の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) では、すべての Operator が Linux ホストで実行されることを前提としています。ただし、Operator の作成者は、ワーカーノードが OpenShift Container Platform クラスターで利用可能な場合に、Operator が他のアーキテクチャーでのワークロードの管理をサポートするかどうかを指定できます。
Operator が AMD64 および Linux 以外のバリアントをサポートする場合、サポートされるバリアントをリスト表示するために Operator を提供するクラスターサービスバージョン (CSV) にラベルを追加できます。サポートされているアーキテクチャーとオペレーティングシステムを示すラベルは、以下で定義されます。
labels:
operatorframework.io/arch.<arch>: supported
operatorframework.io/os.<os>: supported
labels:
operatorframework.io/arch.<arch>: supported
operatorframework.io/os.<os>: supported
デフォルトチャネルのチャネルヘッドにあるラベルのみが、パッケージマニフェストをラベルでフィルターする場合に考慮されます。たとえば、デフォルト以外のチャネルで Operator の追加アーキテクチャーを提供することは可能ですが、そのアーキテクチャーは PackageManifest API でのフィルターには使用できません。
CSV に os ラベルが含まれていない場合、これはデフォルトで以下の Linux サポートラベルが設定されているかのように処理されます。
labels:
operatorframework.io/os.linux: supported
labels:
operatorframework.io/os.linux: supported
CSV に arch ラベルが含まれていない場合、これはデフォルトで以下の AMD64 サポートラベルが設定されているかのように処理されます。
labels:
operatorframework.io/arch.amd64: supported
labels:
operatorframework.io/arch.amd64: supported
Operator が複数のノードアーキテクチャーまたはオペレーティングシステムをサポートする場合、複数のラベルを追加することもできます。
前提条件
- CSV を含む Operator プロジェクト
- 複数のアーキテクチャーおよびオペレーティングシステムのリスト表示をサポートするには、CSV で参照される Operator イメージはマニフェストリストイメージである必要があります。
- Operator がネットワークが制限された環境または非接続環境で適切に機能できるようにするには、参照されるイメージは、タグではなくダイジェスト (SHA) を使用して指定される必要もあります。
手順
Operator がサポートするサポートされるアーキテクチャーおよびオペレーティングシステムのそれぞれに CSV の
metadata.labelsにラベルを追加します。labels: operatorframework.io/arch.s390x: supported operatorframework.io/os.zos: supported operatorframework.io/os.linux: supported operatorframework.io/arch.amd64: supported
labels: operatorframework.io/arch.s390x: supported operatorframework.io/os.zos: supported operatorframework.io/os.linux: supported1 operatorframework.io/arch.amd64: supported2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.6.5.1. Operator のアーキテクチャーおよびオペレーティングシステムのサポート リンクのコピーリンクがクリップボードにコピーされました!
以下の文字列は、複数のアーキテクチャーおよびオペレーティングシステムをサポートする Operator のラベル付けまたはフィルター時に OpenShift Container Platform の Operator Lifecycle Manager (OLM) でサポートされます。
| アーキテクチャー | 文字列 |
|---|---|
| AMD64 |
|
| ARM64 |
|
| IBM Power® |
|
| IBM Z® |
|
| オペレーティングシステム | 文字列 |
|---|---|
| Linux |
|
| z/OS |
|
OpenShift Container Platform およびその他の Kubernetes ベースのディストリビューションの異なるバージョンは、アーキテクチャーおよびオペレーティングシステムの異なるセットをサポートする可能性があります。
5.6.6. 推奨される namespace の設定 リンクのコピーリンクがクリップボードにコピーされました!
Operator が正しく機能するには、一部の Operator を特定の namespace にデプロイするか、特定の namespace で補助リソースと共にデプロイする必要があります。サブスクリプションから解決されている場合、Operator Lifecycle Manager (OLM) は Operator の namespace を使用したリソースをそのサブスクリプションの namespace にデフォルト設定します。
Operator の作成者は、必要なターゲット namespace をクラスターサービスバージョン (CSV) の一部として表現し、それらの Operator にインストールされるリソースの最終的な namespace の制御を維持できます。OperatorHub を使用して Operator をクラスターに追加する場合、Web コンソールはインストールプロセス時にクラスター管理者に提案される namespace を自動設定します。
手順
CSV で、
operatorframework.io/suggested-namespaceアノテーションを提案される namespace に設定します。metadata: annotations: operatorframework.io/suggested-namespace: <namespace>metadata: annotations: operatorframework.io/suggested-namespace: <namespace>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 提案された namespace を設定します。
5.6.7. デフォルトのノードセレクターを使用して推奨される namespace を設定する リンクのコピーリンクがクリップボードにコピーされました!
一部の Operator は、コントロールプレーンノードでのみ実行することを想定しています。これは、Operator 自体が Pod 仕様で nodeSelector を設定することによって実行できます。
クラスター全体のデフォルト nodeSelector が重複して競合する可能性を回避するために、Operator が実行される namespace にデフォルトのノードセレクターを設定できます。デフォルトのノードセレクターはクラスターのデフォルトよりも優先されるため、クラスターのデフォルトは Operator の namespace 内の Pod には適用されません。
OperatorHub を使用して Operator をクラスターに追加する場合、Web コンソールはインストールプロセス時にクラスター管理者に提案される namespace を自動設定します。推奨される namespace は、クラスターサービスバージョン (CSV) に含まれる YAML の namespace マニフェストを使用して作成されます。
手順
CSV で、
namespaceオブジェクトのマニフェストを使用してoperatorframework.io/suggested-namespace-templateを設定します。次のサンプルは、namespace のデフォルトのノードセレクターが指定されたNamespaceの例のマニフェストです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 提案された namespace を設定します。
注記suggested-namespaceおよびsuggested-namespace-templateアノテーションの両方が CSV にある場合、suggested-namespace-templateが優先されます。
5.6.8. Operator 条件の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) は、Operator を管理する一方で OLM の動作に影響を与える複雑な状態を通信するためのチャネルを Operator に提供します。デフォルトで、OLM は Operator のインストール時に OperatorCondition カスタムリソース定義 (CRD) を作成します。OperatorCondition カスタムリソース (CR) に設定される条件に基づいて、OLM の動作は随時変わります。
Operator 条件をサポートするには、Operator は OLM によって作成された OperatorCondition CR を読み取ることができ、次のタスクを完了することができる必要があります。
- 特定の条件を取得します。
- 特定の条件のステータスを設定します。
これは、operator-lib ライブラリーを使用して実行できます。Operator の作成者は、ライブラリーがクラスター内の Operator が所有する OperatorCondition CR にアクセスできるように Operator に controller-runtime クライアント を指定できます。
ライブラリーは汎用的な Conditions インターフェイスを提供します。これには、OperatorCondition CR で conditionType の Get および Set を実行するための以下のメソッドがあります。
Get-
特定の条件を取得するために、ライブラリーは
controller-runtimeのclient.Get機能を使用します。これには、conditionAccessorにあるタイプがtypes.NamespacedNameのObjectKeyが必要です。 Set-
特定の条件のステータスを更新するために、ライブラリーは
controller-runtimeのclient.Update機能を使用します。conditionTypeが CRD にない場合、エラーが生じます。
Operator は CR の status サブリソースのみを変更することができます。Operator は status.conditions 配列を削除したり、条件を追加できるようにこれを更新したりすることができます。条件にあるフィールドの形式および説明の詳細は、アップストリームの Condition GoDocs を参照してください。
Operator SDK 1.38.0 は、operator-lib v0.11.0 をサポートしています。
前提条件
- Operator プロジェクトが Operator SDK を使用して生成されている。
手順
Operator プロジェクトで Operator 条件を有効にするには、以下を実行します。
Operator プロジェクトの
go.modファイルで、operator-framework/operator-libを必要なライブラリーとして追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Operator ロジックに独自のコンストラクターを作成すると、次の結果が得られます。
-
controller-runtimeクライアントを許可します。 -
conditionTypeを受け入れます。 -
条件を更新または追加する
Conditionインターフェイスを返します。
現時点で OLM は
Upgradeable状態をサポートするため、Upgradeable条件にアクセスするためのメソッドを持つインターフェイスを作成できます。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
NewUpgradeableコンストラクターが、タイプConditionの変数condを使用するためにさらに使用されます。cond変数には、OLM のUpgradeable条件を処理するために使用できるGetおよびSetメソッドが含まれます。-
5.6.9. Webhook の定義 リンクのコピーリンクがクリップボードにコピーされました!
Webhook により、リソースがオブジェクトストアに保存され、Operator コントローラーによって処理される前に、Operator の作成者はリソースのインターセプト、変更、許可、および拒否を実行することができます。Operator Lifecycle Manager (OLM) は、Operator と共に提供される際にこれらの Webhook のライフサイクルを管理できます。
Operator のクラスターサービスバージョン (CSV) リソースには、以下のタイプの Webhook を定義するために webhookdefinitions セクションを含めることができます。
- 受付 Webhook (検証および変更用)
- 変換 Webhook
手順
webhookdefinitionsセクションを Operator の CSV のspecセクションに追加し、typeとしてValidatingAdmissionWebhook、MutatingAdmissionWebhook、またはConversionWebhookを使用して Webhook 定義を追加します。以下の例には、3 つのタイプの Webhook がすべて含まれます。Webhook が含まれる CSV
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.6.9.1. OLM に関する Webhook の考慮事項 リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) を使用して Webhook で Operator をデプロイする場合、以下を定義する必要があります。
-
typeフィールドはValidatingAdmissionWebhook、MutatingAdmissionWebhook、またはConversionWebhookのいずれかに設定する必要があります。そうでないと、CSV は失敗フェーズに置かれます。 -
CSV には、
webhookdefinitionのdeploymentNameフィールドに指定される値に等しい名前のデプロイメントが含まれる必要があります。
Webhook が作成されると、OLM は、Operator がデプロイされる Operator グループに一致する namespace でのみ Webhook が機能するようにします。
5.6.9.1.1. 認証局に関する制約 リンクのコピーリンクがクリップボードにコピーされました!
OLM は、各デプロイメントに単一の認証局 (CA) を提供するように設定されます。CA を生成してデプロイメントにマウントするロジックは、元々 API サービスのライフサイクルロジックで使用されていました。結果は、以下のようになります。
-
TLS 証明書ファイルは、
/apiserver.local.config/certificates/apiserver.crtにあるデプロイメントにマウントされます。 -
TLS キーファイルは、
/apiserver.local.config/certificates/apiserver.keyにあるデプロイメントにマウントされます。
5.6.9.1.2. 受付 Webhook ルールに関する制約 リンクのコピーリンクがクリップボードにコピーされました!
Operator がクラスターをリカバリー不可能な状態に設定しないようにするため、OLM は受付 Webhook に定義されたルールが以下の要求のいずれかをインターセプトする場合に、失敗フェーズに CSV を配置します。
- すべてのグループをターゲットとする要求
-
operators.coreos.comグループをターゲットとする要求 -
ValidatingWebhookConfigurationsまたはMutatingWebhookConfigurationsリソースをターゲットとする要求
5.6.9.1.3. 変換 Webhook の制約 リンクのコピーリンクがクリップボードにコピーされました!
OLM は、変換 Webhook 定義が以下の制約に準拠しない場合に、失敗フェーズに CSV を配置します。
-
変換 Webhook と特長とする CSV は、
AllNamespacesインストールモードのみをサポートできます。 -
変換 Webhook がターゲットとする CRD では、
spec.preserveUnknownFieldsフィールドをfalseまたはnilに設定する必要があります。 - CSV で定義される変換 Webhook は所有 CRD をターゲットにする必要があります。
- 特定の CRD には、クラスター全体で 1 つの変換 Webhook のみを使用できます。
5.6.10. カスタムリソース定義 (CRD) について リンクのコピーリンクがクリップボードにコピーされました!
Operator が使用できる以下の 2 つのタイプのカスタムリソース定義 (CRD) があります。1 つ目は Operator が所有する 所有 タイプと、もう 1 つは Operator が依存する 必須 タイプです。
5.6.10.1. 所有 CRD (Owned CRD) リンクのコピーリンクがクリップボードにコピーされました!
Operator が所有するカスタムリソース定義 (CRD) は CSV の最も重要な部分です。これは Operator と必要な RBAC ルール間のリンク、依存関係の管理、および他の Kubernetes の概念を設定します。
Operator は通常、複数の CRD を使用して複数の概念を結び付けます (あるオブジェクトの最上位のデータベース設定と別のオブジェクトのレプリカセットの表現など)。それぞれは CSV ファイルにリスト表示される必要があります。
| フィールド | 説明 | 必須/任意 |
|---|---|---|
|
| CRD のフルネーム。 | 必須 |
|
| オブジェクト API のバージョン。 | 必須 |
|
| CRD の機械可読名。 | 必須 |
|
|
CRD 名の人間が判読できるバージョン (例: | 必須 |
|
| Operator がこの CRD を使用する方法に関する短い説明、または CRD が提供する機能の説明。 | 必須 |
|
|
この CRD が所属する API グループ (例: | 任意 |
|
|
CRD が 1 つ以上の Kubernetes オブジェクトのタイプを所有する。これらは、トラブルシューティングが必要になる可能性のあるオブジェクトや、データベースを公開するサービスまたは Ingress ルールなどのアプリケーションに接続する方法をユーザーに知らせるために この場合、オーケストレーションするすべてのリストではなく、重要なオブジェクトのみをリスト表示することが推奨されます。たとえば、ユーザーが変更できない内部状態を保存する設定マップをリスト表示しないでください。 | 任意 |
|
| これらの記述子は、エンドユーザーにとって最も重要な Operator の入力および出力で UI にヒントを提供する手段になります。CRD にユーザーが指定する必要のあるシークレットまたは設定マップの名前が含まれる場合は、それをここに指定できます。これらのアイテムはリンクされ、互換性のある UI で強調表示されます。 記述子には、3 つの種類があります。
すべての記述子は以下のフィールドを受け入れます。
記述子 一般の詳細は、openshift/console プロジェクトも参照してください。 | 任意 |
以下の例は、シークレットおよび設定マップでユーザー入力を必要とし、サービス、ステートフルセット、Pod および設定マップのオーケストレーションを行う MongoDB Standalone CRD を示しています。
所有 CRD の例
5.6.10.2. 必須 CRD (Required CRD) リンクのコピーリンクがクリップボードにコピーされました!
他の必須 CRD の使用は完全にオプションであり、これらは個別 Operator のスコープを縮小し、エンドツーエンドのユースケースに対応するために複数の Operator を一度に作成するために使用できます。
一例として、Operator がアプリケーションをセットアップし、分散ロックに使用する (etcd Operator からの) etcd クラスター、およびデータストレージ用に (Postgres Operator からの) Postgres データベースをインストールする場合があります。
Operator Lifecycle Manager (OLM) は、これらの要件を満たすためにクラスター内の利用可能な CRD および Operator に対してチェックを行います。適切なバージョンが見つかると、Operator は必要な namespace 内で起動し、サービスアカウントが各 Operator が必要な Kubernetes リソースを作成し、監視し、変更できるようにするために作成されます。
| フィールド | 説明 | 必須/任意 |
|---|---|---|
|
| 必要な CRD のフルネーム。 | 必須 |
|
| オブジェクト API のバージョン。 | 必須 |
|
| Kubernetes オブジェクトの種類。 | 必須 |
|
| CRD の人間による可読可能なバージョン。 | 必須 |
|
| 大規模なアーキテクチャーにおけるコンポーネントの位置付けに関するサマリー。 | 必須 |
必須 CRD の例
5.6.10.3. CRD のアップグレード リンクのコピーリンクがクリップボードにコピーされました!
OLM は、単一のクラスターサービスバージョン (CSV) によって所有されている場合にはカスタムリソース定義 (CRD) をすぐにアップグレードします。CRD が複数の CSV によって所有されている場合、CRD は、以下の後方互換性の条件のすべてを満たす場合にアップグレードされます。
- 現行 CRD の既存の有効にされたバージョンすべてが新規 CRD に存在する。
- 検証が新規 CRD の検証スキーマに対して行われる場合、CRD の提供バージョンに関連付けられる既存インスタンスまたはカスタムリソースすべてが有効である。
5.6.10.3.1. 新規 CRD バージョンの追加 リンクのコピーリンクがクリップボードにコピーされました!
手順
CRD の新規バージョンを Operator に追加するには、以下を実行します。
CSV の
versionsセクションに CRD リソースの新規エントリーを追加します。たとえば、現在の CRD にバージョン
v1alpha1があり、新規バージョンv1beta1を追加し、これを新規のストレージバージョンとしてマークをする場合に、v1beta1の新規エントリーを追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 新規エントリー。
CSV が新規バージョンを使用する場合、CSV の
ownedセクションの CRD の参照バージョンが更新されていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
versionを更新します。
- 更新された CRD および CSV をバンドルにプッシュします。
5.6.10.3.2. CRD バージョンの非推奨または削除 リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) では、カスタムリソース定義 (CRD) の提供バージョンをすぐに削除できません。その代わりに、CRD の非推奨バージョンを CRD の served フィールドを false に設定して無効にする必要があります。その後に、無効にされたバージョンではないバージョンを後続の CRD アップグレードで削除できます。
手順
特定バージョンの CRD を非推奨にし、削除するには、以下を実行します。
非推奨バージョンを non-serving (無効にされたバージョン) とマークして、このバージョンが使用されなくなり、後続のアップグレードで削除される可能性があることを示します。以下に例を示します。
versions: - name: v1alpha1 served: false storage: trueversions: - name: v1alpha1 served: false1 storage: trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
falseに設定します。
非推奨となるバージョンが現在
storageバージョンの場合、storageバージョンを有効にされたバージョンに切り替えます。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記CRD から
storageバージョンであるか、このバージョンであった特定のバージョンを削除するために、そのバージョンが CRD のステータスのstoredVersionから削除される必要があります。OLM は、保存されたバージョンが新しい CRD に存在しないことを検知した場合に、この実行を試行します。- 上記の変更内容で CRD をアップグレードします。
後続のアップグレードサイクルでは、無効にされたバージョンを CRD から完全に削除できます。以下に例を示します。
versions: - name: v1beta1 served: true storage: trueversions: - name: v1beta1 served: true storage: trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
該当バージョンが CRD から削除される場合、CSV の
ownedセクションにある CRD の参照バージョンも更新されていることを確認します。
5.6.10.4. CRD テンプレート リンクのコピーリンクがクリップボードにコピーされました!
Operator のユーザーは、どのオプションが必須またはオプションであるかを認識している必要があります。alm-examples という名前のアノテーションとして、設定の最小セットを使用して、各カスタムリソース定義 (CRD) のテンプレートを提供できます。互換性のある UI は、ユーザーがさらにカスタマイズできるようにこのテンプレートの事前入力を行います。
アノテーションは、Kind のリストで構成されます (例: CRD 名および Kubernetes オブジェクトの対応する metadata および spec)。
以下の詳細の例では、EtcdCluster、EtcdBackup および EtcdRestore のテンプレートを示しています。
metadata:
annotations:
alm-examples: >-
[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"<operator_namespace>"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":["<etcd-cluster-endpoints>"],"storageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}}]
metadata:
annotations:
alm-examples: >-
[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"<operator_namespace>"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":["<etcd-cluster-endpoints>"],"storageType":"S3","s3":{"path":"<full-s3-path>","awsSecret":"<aws-secret>"}}}]
5.6.10.5. 内部オブジェクトの非表示 リンクのコピーリンクがクリップボードにコピーされました!
Operator がタスクを実行するためにカスタムリソース定義 (CRD) を内部で使用する方法は一般的な方法です。これらのオブジェクトはユーザーが操作することが意図されていません。オブジェクトの操作により Operator のユーザーにとって混乱を生じさせる可能性があります。たとえば、データベース Operator には、ユーザーが replication: true で Database オブジェクトを作成する際に常に作成される Replication CRD が含まれる場合があります。
Operator の作成者は、operators.operatorframework.io/internal-objects アノテーションを Operator のクラスターサービスバージョン (CSV) に追加して、ユーザー操作を目的としていないユーザーインターフェイスの CRD を非表示にすることができます。
手順
-
CRD のいずれかに internal のマークを付ける前に、アプリケーションの管理に必要となる可能性のあるデバッグ情報または設定が CR のステータスまたは
specブロックに反映されていることを確認してください (使用する Operator に該当する場合)。 operators.operatorframework.io/internal-objectsアノテーションを Operator の CSV に追加し、ユーザーインターフェイスで非表示にする内部オブジェクトを指定します。内部オブジェクのトアノテーション
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 内部 CRD を文字列の配列として設定します。
5.6.10.6. 必要なカスタムリソースの初期化 リンクのコピーリンクがクリップボードにコピーされました!
Operator では、ユーザーが Operator が完全に機能する前にカスタムリソースをインスタンス化する必要がある場合があります。ただし、ユーザーが必要な内容やリソースの定義方法を判断することが困難な場合があります。
Operator 開発者は、Operator のインストール中に operatorframework.io/initialization-resource をクラスターサービスバージョン (CSV) に追加することで、必要なカスタムリソースを 1 つ指定できます。次に、CSV で提供されるテンプレートを使用してカスタムリソースを作成するように求められます。アノテーションには、インストール時にリソースを初期化するために必要な完全な YAML 定義が含まれるテンプレートが含まれている必要があります。
このアノテーションが定義されている場合、OpenShift Container Platform Web コンソールから Operator をインストールすると、ユーザーには CSV で提供されるテンプレートを使用してリソースを作成することを求めるプロンプトが出されます。
手順
operatorframework.io/initialization-resourceアノテーションを Operator の CSV に追加し、必要なカスタムリソースを指定します。たとえば、以下のアノテーションではStorageClusterリソースの作成が必要であり、これは完全な YAML 定義を提供します。初期化リソースアノテーション
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
5.6.11. API サービスについて リンクのコピーリンクがクリップボードにコピーされました!
CRD の場合のように、Operator が使用できる API サービスの 2 つのタイプ (所有 (owned) および 必須 (required)) があります。
5.6.11.1. 所有 API サービス リンクのコピーリンクがクリップボードにコピーされました!
CSV が API サービスを所有する場合、CSV は API サービスおよびこれが提供する group/version/kind (GVK) をサポートする拡張 api-server のデプロイメントを記述します。
API サービスはこれが提供する group/version によって一意に識別され、提供することが予想される複数の種類を示すために複数回リスト表示できます。
| フィールド | 説明 | 必須/任意 |
|---|---|---|
|
|
API サービスが提供するグループ ( | 必須 |
|
|
API サービスのバージョン ( | 必須 |
|
| API サービスが提供することが予想される種類。 | 必須 |
|
| 指定された API サービスの複数形の名前 | 必須 |
|
|
API サービスに対応する CSV で定義されるデプロイメントの名前 (所有 API サービスに必要)。CSV の保留フェーズに、OLM Operator は CSV の | 必須 |
|
|
API サービス名の人間が判読できるバージョン (例: | 必須 |
|
| Operator がこの API サービスを使用する方法に関する短い説明、または API サービスが提供する機能の説明。 | 必須 |
|
| API サービスは 1 つ以上の Kubernetes オブジェクトのタイプを所有します。これらは、トラブルシューティングが必要になる可能性のあるオブジェクトや、データベースを公開するサービスまたは Ingress ルールなどのアプリケーションに接続する方法をユーザーに知らせるためにリソースセクションにリスト表示されます。 この場合、オーケストレーションするすべてのリストではなく、重要なオブジェクトのみをリスト表示することが推奨されます。たとえば、ユーザーが変更できない内部状態を保存する設定マップをリスト表示しないでください。 | 任意 |
|
| 所有 CRD と基本的に同じです。 | 任意 |
5.6.11.1.1. API サービスリソースの作成 リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) はそれぞれ固有の所有 API サービスにサービスおよび API サービスリソースを作成するか、これらを置き換えます。
-
サービス Pod セレクターは API サービスの記述の
DeploymentNameフィールドに一致する CSV デプロイメントからコピーされます。 - 新規の CA キー/証明書ペアが各インストールに生成され、base64 でエンコードされた CA バンドルがそれぞれの API サービスリソースに組み込まれます。
5.6.11.1.2. API サービス提供証明書 リンクのコピーリンクがクリップボードにコピーされました!
OLM は、所有 API サービスがインストールされるたびに、提供するキー/証明書のペアの生成を処理します。提供証明書には、生成される Service リソースのホスト名が含まれる一般名 (CN) が含まれ、これは対応する API サービスリソースに組み込まれた CA バンドルのプライベートキーによって署名されます。
証明書は、デプロイメント namespace の kubernetes.io/tls タイプのシークレットとして保存され、apiservice-cert という名前のボリュームは、API サービスの記述の DeploymentName フィールドに一致する CSV のデプロイメントのボリュームセクションに自動的に追加されます。
存在していない場合、一致する名前を持つボリュームマウントもそのデプロイメントのすべてのコンテナーに追加されます。これにより、ユーザーは、カスタムパスの要件に対応するために、予想される名前のボリュームマウントを定義できます。生成されるボリュームマウントのパスは /apiserver.local.config/certificates にデフォルト設定され、同じパスの既存のボリュームマウントが置き換えられます。
5.6.11.2. 必要な API サービス リンクのコピーリンクがクリップボードにコピーされました!
OLM は、必要なすべての CSV に利用可能な API サービスがあり、すべての予想される GVK がインストールの試行前に検出可能であることを確認します。これにより、CSV は所有しない API サービスによって提供される特定の種類に依存できます。
| フィールド | 説明 | 必須/任意 |
|---|---|---|
|
|
API サービスが提供するグループ ( | 必須 |
|
|
API サービスのバージョン ( | 必須 |
|
| API サービスが提供することが予想される種類。 | 必須 |
|
|
API サービス名の人間が判読できるバージョン (例: | 必須 |
|
| Operator がこの API サービスを使用する方法に関する短い説明、または API サービスが提供する機能の説明。 | 必須 |