7.2. コンポーネントとアーキテクチャー
7.2.1. OLM 1.0 コンポーネントの概要 (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
OLM 1.0 は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
Operator Lifecycle Manager (OLM) 1.0 は、次のコンポーネントプロジェクトで構成されています。
- Operator Controller
- Operator Controller は OLM 1.0 の中心的なコンポーネントで、API を使用して Kubernetes を拡張します。ユーザーはこれを使用して、Operator や拡張機能をインストールし、そのライフサイクルを管理できます。これは、次の各コンポーネントからの情報を使用します。
- RukPak
RukPak は、クラウドネイティブコンテンツをパッケージ化して配布するためのプラグイン可能なソリューションです。インストール、更新、ポリシーに関する高度なストラテジーをサポートします。
RukPak は、Kubernetes クラスターにさまざまなアーティファクトをインストールするためのコンテンツエコシステムを提供します。アーティファクトの例には、Git リポジトリー、Helm チャート、OLM バンドルなどがあります。その後、RukPak はこれらのアーティファクトを安全な方法で管理、スケーリング、アップグレードして、強力なクラスター拡張を実現できます。
- Catalogd
- Catalogd は、クラスター上のクライアントが使用する、コンテナーイメージにパッケージ化されて出荷されるファイルベースのカタログ (FBC) コンテンツを展開する Kubernetes 拡張機能です。OLM 1.0 マイクロサービスアーキテクチャーのコンポーネントである catalogd は、Kubernetes 拡張機能の作成者がパッケージ化した拡張機能のメタデータをホストします。これは、ユーザーがインストール可能なコンテンツを発見するのに役立ちます。
7.2.2. Operator Controller (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Operator Controller は、Operator Lifecycle Manager (OLM) 1.0 の中心的なコンポーネントであり、他の OLM 1.0 コンポーネント (RukPak および catalogd) を使用します。Operator Controller は API で Kubernetes を拡張し、これを通してユーザーは Operator や機能拡張をインストールできます。
OLM 1.0 は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
7.2.2.1. Operator API リンクのコピーリンクがクリップボードにコピーされました!
Operator Controller は、インストールされている Operator のインスタンスを表すシングルリソースである新しい Operator
API オブジェクトを提供します。この Operator.operators.operatorframework.io
API は、ユーザー向け API をシングルオブジェクトに統合することで、インストールされた Operator の管理を合理化します。
OLM 1.0 では、Operator
オブジェクトはクラスタースコープです。これは、関連する Subscription
オブジェクトと OperatorGroup
オブジェクトの設定に応じて、Operator が namespace スコープまたはクラスタースコープになる以前の OLM バージョンとは異なります。
以前の動作について、詳細はマルチテナント対応と Operator のコロケーション を参照してください。
Operator
オブジェクトの例
OpenShift CLI (oc
) を使用する場合、このテクノロジープレビューフェーズで OLM 1.0 が提供する Operator
リソースでは、完全な <resource>.<group>
形式 (operator.operators.operatorframework.io
) を指定する必要があります。以下に例を示します。
oc get operator.operators.operatorframework.io
$ oc get operator.operators.operatorframework.io
API グループを指定せずに Operator
リソースのみを指定すると、CLI は OLM 1.0 に関連付けられていない以前の API (operator.operators.coreos.com
) の結果を返します。
7.2.2.1.1. OLM 1.0 のターゲットバージョンについて リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) 1.0 では、クラスター管理者は Operator のターゲットバージョンを Operator のカスタムリソース (CR) で宣言的に設定します。
Operator の CR でチャネルを指定すると、OLM 1.0 は指定されたチャネルから最新リリースをインストールします。更新が指定されたチャネルに公開されると、OLM 1.0 はそのチャネルからの最新リリースに自動的に更新します。
チャネルを指定した CR の例
- 1
- 指定されたチャネルに公開された最新リリースをインストールします。チャネルへの更新は自動的にインストールされます。
CR で Operator のターゲットバージョンを指定すると、OLM 1.0 は指定されたバージョンをインストールします。ターゲットバージョンが Operator の CR で指定されている場合、OLM 1.0 は更新がカタログに公開されるときにターゲットバージョンを変更しません。
クラスターにインストールされている Operator のバージョンを更新する場合は、Operator の CR を手動で更新する必要があります。Operator のターゲットバージョンを指定すると、Operator のバージョンが指定されたリリースに固定されます。
ターゲットバージョンを指定した CR の例
- 1
- ターゲットのバージョンを指定します。クラスターにインストールされている Operator のバージョンを更新する場合は、Operator の CR のこのフィールドを目的のターゲットバージョンに手動で更新する必要があります。
Operator のインストールされているバージョンを変更する場合は、Operator の CR を編集して目的のターゲットバージョンにします。
OLM の以前のバージョンでは、Operator の作成者は、サポートされていないバージョンへの更新を防ぐためにアップグレードエッジを定義できました。現在の開発状態では、OLM 1.0 はエッジ定義のアップグレードを強制しません。Operator の任意のバージョンを指定でき、OLM 1.0 は更新の適用を試みます。
次のコマンドを実行すると、使用可能なバージョンやチャネルを含む Operator のカタログの内容を検査できます。
コマンド構文
oc get package <catalog_name>-<package_name> -o yaml
$ oc get package <catalog_name>-<package_name> -o yaml
CR を作成または更新した後、次のコマンドを実行して Operator を作成または設定します。
コマンド構文
oc apply -f <extension_name>.yaml
$ oc apply -f <extension_name>.yaml
トラブルシューティング
存在しないターゲットバージョンまたはチャネルを指定した場合は、次のコマンドを実行して Operator のステータスを確認できます。
oc get operator.operators.operatorframework.io <operator_name> -o yaml
$ oc get operator.operators.operatorframework.io <operator_name> -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.2.3. Rukpak (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) 1.0 は、RukPak コンポーネントとそのリソースを使用してクラウドネイティブコンテンツを管理します。
OLM 1.0 は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
7.2.3.1. RukPak について リンクのコピーリンクがクリップボードにコピーされました!
RukPak は、クラウドネイティブコンテンツをパッケージ化して配布するためのプラグイン可能なソリューションです。インストール、更新、ポリシーに関する高度なストラテジーをサポートします。
RukPak は、Kubernetes クラスターにさまざまなアーティファクトをインストールするためのコンテンツエコシステムを提供します。アーティファクトの例には、Git リポジトリー、Helm チャート、OLM バンドルなどがあります。その後、RukPak はこれらのアーティファクトを安全な方法で管理、スケーリング、アップグレードして、強力なクラスター拡張を実現できます。
RukPak のコアは、API とコントローラーの小さなセットです。API は、クラスターにインストールするコンテンツや、そのコンテンツの実行デプロイメントを作成する方法を示すカスタムリソース定義 (CRD) としてパッケージ化されています。コントローラーは API を監視します。
一般的な用語
- バンドル
- クラスターにデプロイされるコンテンツを定義する Kubernetes マニフェストのコレクション
- バンドルイメージ
- ファイルシステム内にバンドルがあるコンテナーイメージ
- バンドル Git リポジトリー
- ディレクトリー内にバンドルがある Git リポジトリー
- プロビジョナー
- Kubernetes クラスターにコンテンツをインストールして管理するコントローラー
- バンドルデプロイメント
- バンドルのデプロイされたインスタンスを生成します
7.2.3.2. プロビジョナーについて リンクのコピーリンクがクリップボードにコピーされました!
RukPak は、プロビジョナー と呼ばれる一連のコントローラーで構成され、Kubernetes クラスターにコンテンツをインストールして管理します。RukPak は、Bundle
と BundleDeployment
という 2 つの主要な API も提供します。これらのコンポーネントが連携してコンテンツをクラスターに取り込み、インストールして、クラスター内にリソースを生成します。
2 つのプロビジョナーが現在実装され、RukPak にバンドルされています。これらは、plain+v0
バンドルをソースおよびアンパックする プレーンプロビジョナー と、Operator Lifecycle Manager (OLM) registry+v1
バンドルをソースおよびアンパックする レジストリープロビジョナー です。
各プロビジョナーには一意の ID が割り当てられ、特定の ID に一致する spec.provisionerClassName
フィールドを使用して Bundle
および BundleDeployment
オブジェクトを調整します。たとえば、プレーンプロビジョナーは、指定された plain+v0
バンドルをクラスターにアンパックしてからインスタンス化し、バンドルのコンテンツをクラスターで利用できるようにすることができます。
プロビジョナーは、プロビジョナーを明示的に参照する Bundle
リソースと BundleDeployment
リソースの両方にウォッチを配置します。特定のバンドルについて、プロビジョナーは Bundle
リソースのコンテンツをクラスターにアンパックします。次に、そのバンドルを参照する BundleDeployment
リソースを指定すると、プロビジョナーはバンドルのコンテンツをインストールし、それらのリソースのライフサイクルを管理します。
7.2.3.3. バンドル リンクのコピーリンクがクリップボードにコピーされました!
RukPak Bundle
オブジェクトは、クラスター内の他のコンシューマーが利用できるようにするコンテンツを表します。Pod が使用を開始するためにコンテナーイメージのコンテンツをプルしてアンパックする必要があるのと同じように、Bundle
オブジェクトは、プルしてアンパックする必要がある可能性があるコンテンツを参照するために使用されます。この意味で、バンドルはイメージの概念を一般化したものであり、あらゆるタイプのコンテンツを表すために使用できます。
バンドルは単独では何もできません。プロビジョナーがアンパックしてコンテンツをクラスターで利用できるようにする必要があります。これらは、プロビジョナー Pod にマウントされたディレクトリー内の tar.gz
ファイルなど、任意のストレージメディアに解凍できます。各 Bundle
オブジェクトには、その特定のバンドルタイプを監視およびアンパックする Provisioner
オブジェクトを示す、関連付けられた spec.provisionerClassName
フィールドがあります。
プレーンプロビジョナーと連携するように設定された Bundle
オブジェクトの例
バンドルは、作成後は不変と見なされます。
7.2.3.3.1. バンドルの不変性 リンクのコピーリンクがクリップボードにコピーされました!
Bundle
オブジェクトが API サーバーによって受け入れられると、そのバンドルは RukPak システムの残りの部分によって不変のアーティファクトと見なされます。この動作により、バンドルはクラスターにソーシングする一意の静的なコンテンツを表すという概念が適用されます。ユーザーは、特定のバンドルが特定の一連のマニフェストを指していて、新しいバンドルを作成しないと更新できないという確信を持つことができます。このプロパティーは、スタンドアロンバンドルと、組み込みの BundleTemplate
オブジェクトによって作成された動的バンドルの両方に当てはまります。
バンドルの不変性は、コア RukPak Webhook によって適用されます。この Webhook は Bundle
オブジェクトイベントを監視し、バンドルの更新について、既存のバンドルの spec
フィールドが提案された更新されたバンドルのそれと意味的に等しいかどうかをチェックします。それらが等しくない場合、更新は Webhook によって拒否されます。metadata
や status
などの他の Bundle
オブジェクトフィールドは、バンドルのライフサイクル中に更新されます。不変と見なされるのは spec
フィールドのみです。
Bundle
オブジェクトを適用してからその仕様を更新しようとすると失敗するはずです。たとえば、次の例はバンドルを作成します。
出力例
bundle.core.rukpak.io/combo-tag-ref created
bundle.core.rukpak.io/combo-tag-ref created
次に、新しいタグを指すようにバンドルにパッチを適用すると、エラーが返されます。
oc patch bundle combo-tag-ref --type='merge' -p '{"spec":{"source":{"git":{"ref":{"tag":"v0.0.3"}}}}}'
$ oc patch bundle combo-tag-ref --type='merge' -p '{"spec":{"source":{"git":{"ref":{"tag":"v0.0.3"}}}}}'
出力例
Error from server (bundle.spec is immutable): admission webhook "vbundles.core.rukpak.io" denied the request: bundle.spec is immutable
Error from server (bundle.spec is immutable): admission webhook "vbundles.core.rukpak.io" denied the request: bundle.spec is immutable
コアの RukPak 受付 Webhook は、バンドルの仕様が不変であるため、パッチを拒否しました。バンドルのコンテンツを変更するための推奨される方法は、インプレースで更新するのではなく、新しい Bundle
オブジェクトを作成することです。
不変性に関するその他の考慮事項
Bundle
オブジェクトの spec
フィールドは不変ですが、基本となる spec
フィールドを変更せずに、BundleDeployment
オブジェクトを新しいバージョンのバンドルコンテンツにピボットすることは可能です。この意図しないピボットは、次のシナリオで発生する可能性があります。
-
ユーザーは、イメージタグ、Git ブランチ、または Git タグを
Bundle
オブジェクトのspec.source
フィールドに設定します。 - イメージタグが新しいダイジェストに移動するか、ユーザーが変更を Git ブランチにプッシュするか、ユーザーが別のコミットで Git タグを削除して再プッシュします。
- ユーザーが、アンパック Pod の削除など、バンドルアンパック Pod を再作成するために何らかの操作を行います。
このシナリオが発生した場合、手順 2 の新しいコンテンツは、手順 3 の結果としてアンパックされます。バンドルのデプロイメントにより、変更が検出され、新しいバージョンのコンテンツにピボットされます。
これは、Pod のコンテナーイメージの 1 つがタグを使用し、そのタグが別のダイジェストに移動され、将来のある時点で既存の Pod が別のノードで再スケジュールされる Pod の動作に似ています。その時点で、ノードは新しいダイジェストで新しいイメージをプルし、ユーザーが明示的に要求することなく別の何かを実行します。
基になる Bundle
仕様コンテンツが変更されないことを確信するには、バンドルを作成するときにダイジェストベースのイメージまたは Git コミット参照を使用します。
7.2.3.3.2. プレーンバンドル仕様 リンクのコピーリンクがクリップボードにコピーされました!
RukPak のプレーンバンドルは、特定のディレクトリーにある静的で任意の Kubernetes YAML マニフェストのコレクションです。
現在実装されているプレーンバンドル形式は、plain+v0
形式です。バンドル形式の名前 plain+v0
は、バンドルのタイプ (plain
) と現在のスキーマバージョン (v0
) を組み合わせたものです。
plain+v0
バンドル形式はスキーマバージョン v0
です。これは、変更される可能性がある実験的な形式であることを意味します。
たとえば、以下は、plain+v0
バンドルのファイルツリーを示しています。アプリケーションのデプロイに必要な Kubernetes リソースを含む manifests/
ディレクトリーが必要です。
plain+v0
バンドルファイルツリーの例
静的マニフェストは、プロビジョナーがアンパックできる有効な plain+v0
バンドルになるように、少なくとも 1 つのリソースを含む manifests/
ディレクトリーに配置する必要があります。manifests/
ディレクトリーもフラットである必要があります。すべてのマニフェストは、サブディレクトリーのない最上位にある必要があります。
静的なマニフェストではないプレーンバンドルの manifests/
ディレクトリーにコンテンツを含めないでください。そうしないと、そのバンドルからクラスター上でコンテンツを作成するときにエラーが発生します。oc apply
コマンドで正常に適用されないファイルは、エラーになります。マルチオブジェクト YAML または JSON ファイルも有効です。
7.2.3.3.3. レジストリーバンドルの仕様 リンクのコピーリンクがクリップボードにコピーされました!
レジストリーバンドル、または registry+v1
バンドルには、従来の Operator Lifecycle Manager (OLM) バンドル形式で編成された一連の静的 Kubernetes YAML マニフェストが含まれています。
7.2.3.4. BundleDeployment リンクのコピーリンクがクリップボードにコピーされました!
BundleDeployment
オブジェクトは、オブジェクトのインストールと削除によって Kubernetes クラスターの状態を変更します。インストールされるコンテンツを検証して信頼し、RBAC を使用して BundleDeployment
API へのアクセスを、それらのアクセス許可を必要とするユーザーのみに制限することが重要です。
RukPak BundleDeployment
API は Bundle
オブジェクトを指し、それがアクティブであることを示します。これには、アクティブなバンドルの古いバージョンからのピボットが含まれます。BundleDeployment
オブジェクトには、目的のバンドルの組み込み仕様も含まれる場合があります。
Pod がコンテナーイメージのインスタンスを生成するのと同じように、バンドルのデプロイではデプロイされたバージョンのバンドルが生成されます。バンドルのデプロイは、Pod の概念の一般化と見なすことができます。
バンドルのデプロイが参照されたバンドルに基づいてクラスターに変更を加える方法の詳細は、そのバンドルのデプロイを監視するように設定されているプロビジョナーによって定義されます。
プレーンプロビジョナーと連携するように設定された BundleDeployment
オブジェクトの例
7.2.4. OLM 1.0 での依存関係の解決 (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) 1.0 は、RukPak バンドルのカタログに対する制約を解決するために依存関係マネージャーを使用します。
OLM 1.0 は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
7.2.4.1. 概念 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーは、パッケージマネージャーが以下を決して実行しないことを希望しています。
- 依存関係を満たさないパッケージ、または別のパッケージの依存関係と競合するパッケージをインストールする。
- 現行のインストール可能なパッケージセットでは制約が満たされないパッケージをインストールする。
- 依存する別のパッケージを破壊するパッケージ更新を実行する。
7.2.4.1.1. 解決に成功する例 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーは、次の依存関係を持つパッケージ A および B をインストールしたいと考えています。
パッケージ A |
パッケージ B |
↓(依存する) | ↓(依存する) |
パッケージ C |
パッケージ D |
さらに、ユーザーは A のバージョンを v0.1.0
に固定したいと考えています。
OLM 1.0 に渡されたパッケージと制約
パッケージ
- A
- B
制約
-
A
v0.1.0
は Cv0.1.0
に依存します。 -
A は
v0.1.0
に固定されています。 - B は D に依存します。
出力
解決されたセット:
-
A
v0.1.0
-
B
latest
-
C
v0.1.0
-
D
latest
-
A
7.2.4.1.2. 解決に失敗する例 リンクのコピーリンクがクリップボードにコピーされました!
ユーザーは、次の依存関係を持つパッケージ A および B をインストールしたいと考えています。
パッケージ A |
パッケージ B |
↓(依存する) | ↓(依存する) |
パッケージ C |
パッケージ C |
さらに、ユーザーは A のバージョンを v0.1.0
に固定したいと考えています。
OLM 1.0 に渡されたパッケージと制約
パッケージ
- A
- B
制約
-
A
v0.1.0
は Cv0.1.0
に依存します。 -
A は
v0.1.0
に固定されています。 -
B
latest
は Cv0.2.0
に依存します。
出力
解決されたセット:
-
A
v0.1.0
には Cv0.1.0
が必要であり、それは Cv0.2.0
を必要とする Blatest
と競合するため、解決できません。
-
A
7.2.5. Catalogd (テクノロジープレビュー) リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) 1.0 は、catalogd コンポーネントとそのリソースを使用して、Operator カタログと機能拡張カタログを管理します。
OLM 1.0 は、テクノロジープレビューのみの機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
7.2.5.1. OLM 1.0 のカタログについて リンクのコピーリンクがクリップボードにコピーされました!
catalogd コンポーネントを使用して、Operator やコントローラーなどの Kubernetes 拡張機能のカタログをクエリーすることで、インストール可能なコンテンツを検出できます。Catalogd は、クラスター上のクライアント用にカタログコンテンツを展開する Kubernetes 機能拡張であり、マイクロサービスの Operator Lifecycle Manager (OLM) 1.0 スイートの一部です。現在、catalogd は、コンテナーイメージとしてパッケージ化および配布されているカタログコンテンツを解凍します。
7.2.5.1.1. OLM 1.0 で Red Hat が提供する Operator カタログ リンクのコピーリンクがクリップボードにコピーされました!
Operator Lifecycle Manager (OLM) 1.0 には、デフォルトでは Red Hat が提供する Operator カタログが含まれていません。Red Hat が提供するカタログをクラスターに追加する場合は、カタログのカスタムリソース (CR) を作成し、クラスターに適用します。次のカスタムリソース (CR) の例は、OLM 1.0 のカタログリソースを作成する方法を示しています。
Red Hat Operators カタログの例
認定 Operator カタログの例
コミュニティー Operator カタログの例
次のコマンドは、クラスターにカタログを追加します。
コマンド構文
oc apply -f <catalog_name>.yaml
$ oc apply -f <catalog_name>.yaml
- 1
redhat-operators.yaml
などのカタログ CR を指定します。