2.2. Operator Lifecycle Manager について
以下では、OpenShift Container Platform における Operator Lifecycle Manager (OLM) のワークフローおよびアーキテクチャーの概要を説明します。
2.2.1. Operator Lifecycle Manager の概要
OpenShift Container Platform 4.1 では、 Operator Lifecycle Manager (OLM) を使用することにより、ユーザーはすべての Operator およびクラスター全体で実行される関連サービスをインストールし、更新し、管理することができます。これは、Kubernetes のネイティブアプリケーション (Operator) を効果的かつ自動化された拡張可能な方法で管理するために設計されたオープンソースツールキットの Operator Framework の一部です。
図2.2 Operator Lifecycle Manager ワークフロー
OLM は OpenShift Container Platform 4.1 でデフォルトで実行されます。OpenShift Container Platform Web コンソールは、クラスター管理者が Operator をインストールしたり、クラスターで利用可能な Operator のカタログを使用できるように特定のプロジェクトアクセスを付与したりするのに使用する管理画面を提供します。
開発者の場合には、セルフサービスを使用することで、専門的な知識がなくてもデータベースのインスタンスのプロビジョニングや設定、またモニタリング、ビッグデータサービスなどを実行できます。 Operator にそれらに関するナレッジが織り込まれているためです。
2.2.2. ClusterServiceVersion (CSV)
ClusterServiceVersion (CSV) は、Operator Lifecycle Manager (OLM) のクラスターでの Operator の実行を支援する Operator メタデータから作成される YAML マニフェストです。これは、ユーザーインターフェースにロゴ、説明、およびバージョンなどの情報を設定するために使用される Operator コンテナーイメージを伴うメタデータです。また、これは Operator が必要とする RBAC ルールやそれが管理したり、依存したりするカスタムリース(Custom Resource、CR) などの、Operator を実行するために必要な技術情報の情報源にもなります。
CSV は以下で構成されます。
- メタデータ
アプリケーションメタデータ:
- 名前、説明、バージョン (semver 準拠)、リンク、ラベル、アイコンなど
- インストールストラテジー
タイプ: Deployment
- サービスアカウントおよび必要なパーミッションのセット
- Deployment のセット。
- Custom Resource Definitions (CRDs)
- タイプ
- Owned: サービスで管理されます。
- Required: サービスが実行されるためにクラスターに存在する必要があります。
- Resources: Operator が対話するリソースの一覧です。
- Descriptors: 意味情報を提供するために CRD 仕様およびステータスフィールドにアノテーションを付けます。
2.2.3. Operator Lifecycle Manager アーキテクチャー
Operator Lifecycle Manager (OLM) は、OLM Operator およびカタログ Operator の 2 つの Operator で構成されています。
これらの Operator はそれぞれ OLM フレームワークのベースとなるカスタムリソース定義(CRD) を管理します。
リソース | 短縮名 | 所有する Operator | 説明 |
---|---|---|---|
ClusterServiceVersion |
| OLM | アプリケーションのメタデータ: 名前、バージョン、アイコン、必須リソース、インストールなど。 |
InstallPlan |
| カタログ | CSV を自動的にインストールするか、またはアップグレードするために作成されるリソースの計算された一覧。 |
CatalogSource |
| カタログ | CSV、CRD、およびアプリケーションを定義するパッケージのリポジトリー。 |
Subscription |
| カタログ | パッケージのチャネルを追跡して CSV を最新の状態に保ちます。 |
OperatorGroup |
| OLM | 同じ namespace にデプロイされたすべての Operator を OperatorGroup オブジェクトとして設定し、namespace の一覧またはクラスター全体でカスタムリソース (CR) を監視します。 |
これらの Operator はそれぞれリソースも作成します。
リソース | 所有する Operator |
---|---|
Deployment | OLM |
ServiceAccount | |
(Cluster)Role | |
(Cluster)RoleBinding | |
Custom Resource Definition (CRD) | カタログ |
ClusterServiceVersion (CSV) |
2.2.3.1. OLM Operator
OLM Operator は、CSV で指定された必須リソースがクラスター内にあることが確認された後に CSV リソースで定義されるアプリケーションをデプロイします。
OLM Operator は必須リソースの作成には関与せず、ユーザーが CLI を使用してこれらのリソースを手動で作成したり、カタログ Operator を使用してこれらのリソースを作成することを選択することができます。このタスクの分離により、アプリケーションに OLM フレームワークをどの程度活用するかに関連してユーザーによる追加機能の購入を可能にします。
OLM Operator はすべての namespace を監視するように設定されることが多い一方で、それらすべてが別々の namespace を管理する限り、他の OLM Operator と並行して操作することができます。
OLM Operator のワークフロー
namespace で ClusterServiceVersion (CSV) の有無を確認し、要件を満たしていることを確認します。その場合、CSV のインストールストラテジーを実行します。
注記CSV は、インストールストラテジーの実行を可能にするには、OperatorGroup のアクティブなメンバーである必要があります。
2.2.3.2. カタログ Operator
カタログ Operator は CSV およびそれらが指定する必須リソースを解決し、インストールします。また、 CatalogSource でチャネル内のパッケージへの更新の有無を確認し、それらを利用可能な最新バージョンに (オプションで自動的に) アップグレードします。
チャネル内のパッケージを追跡する必要のあるユーザーは、必要なパッケージ、チャネル、および更新のプルに使用する CatalogSource を設定する Subscription リソースを作成します。 更新が見つかると、ユーザーに代わって適切な InstallPlan の namespace への書き込みが行われます。
また、ユーザーは必要な CSV および承認ストラテジーの名前を含む InstallPlan リソースを直接作成でき、カタログ Operator はすべての必須リソースの作成の実行計画を作成します。これが承認されると、カタログ Operator はすべてのリソースを InstallPlan に作成します。 その後、これが単独で OLM Operator の要件を満たすと、CSV のインストールに移行します。
カタログ Operator のワークフロー
- 名前でインデックス化される CRD および CSV のキャッシュがあることを確認します。
ユーザーによって作成された未解決の InstallPlan の有無を確認します。
- 要求される名前に一致する CSV を検索し、これを解決済みリソースとして追加します。
- 管理対象または必須の CRD のそれぞれについて、これを解決済みリソースとして追加します。
- 必須 CRD のそれぞれについて、これを管理する CSV を検索します。
- 解決済みの InstallPlan の有無を確認し、それについての検出されたすべてのリソースを作成します (ユーザーによって、または自動的に承認される場合)。
- CatalogSource および Subscription の有無を確認し、それらに基づいて InstallPlan を作成します。
2.2.3.3. カタログレジストリー
カタログレジストリーは、クラスター内での作成用に CSV および CRD を保存し、パッケージおよびチャネルについてのメタデータを保存します。
パッケージマニフェスト は、パッケージアイデンティティーを CSV のセットに関連付けるカタログレジストリー内のエントリーです。パッケージ内で、チャネルは特定の CSV を参照します。CSV は置き換え対象の CSV を明示的に参照するため、パッケージマニフェストはカタログ Operator に対し、CSV をチャネル内の最新バージョンに更新するために必要なすべての情報を提供します (各中間バージョンをステップスルー)。
2.2.4. OperatorGroup
OperatorGroup は、マルチテナント設定を OLM でインストールされた Operator に提供する OLM リソースです。OperatorGroup は、そのメンバー Operator に必要な RBAC アクセスを生成する際に使用するターゲット namespace のセットを選択します。ターゲット namespace のセットは、CSV の olm.targetNamespaces アノテーションに保存されるカンマ区切りの文字列によって指定されます。このアノテーションは、メンバー Operator の CSV インスタンスに適用され、それらのデプロインメントに展開されます。
2.2.4.1. OperatorGroup メンバーシップ
Operator は、以下の条件が true の場合に OperatorGroup の メンバー とみなされます。
- Operator の CSV が OperatorGroup と同じ namespace にある。
- Operator の CSV の InstallMode は OperatorGroup がターゲットに設定する namespace のセットをサポートする。
InstallMode は InstallModeType
フィールドおよびブール値の Supported
フィールドで構成される。CSV の仕様には、4 つの固有の InstallModeTypes
の InstallMode のセットを含めることができます。
InstallMode タイプ | 説明 |
---|---|
| Operator は、独自の namespace を選択する OperatorGroup のメンバーにすることができます。 |
| Operator は 1 つの namespace を選択する OperatorGroup のメンバーにすることができます。 |
| Operator は複数の namespace を選択する OperatorGroup のメンバーにすることができます。 |
|
Operator はすべての namespace を選択する OperatorGroup のメンバーにすることができます (ターゲット namespace 設定は空の文字列 |
CSV の仕様が InstallModeType
のエントリーを省略する場合、そのタイプは暗黙的にこれをサポートする既存エントリーによってサポートが示唆されない限り、サポートされないものとみなされます。
2.2.4.1.1. OperatorGroup メンバーシップのトラブルシューティング
-
複数の OperatorGroup が単一の namespace にある場合、その namespace で作成されるすべての CSV は
TooManyOperatorGroups
の理由で失敗状態に切り替わります。この理由で失敗状態になる CSV は、それらの namespace の OperatorGroup 数が 1 になると保留状態に切り替わります。 -
CSV の InstallMode がその namespace で OperatorGroup のターゲット namespace 選択をサポートしない場合、CSV は
UnsupportedOperatorGroup
の理由で失敗状態に切り替わります。この理由で失敗した状態にある CSV は、 OperatorGroup のターゲット namespace の選択がサポートされる設定に変更されるか、または CSV の InstallMode が OperatorGroup の target namespace 選択をサポートするように変更される場合に保留状態に切り替わります。
2.2.4.2. ターゲット namespace の選択
spec.selector
フィールドでラベルセレクターを使用して OperatorGroup の namespace のセットを指定します。
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-group namespace: my-namespace spec: selector: matchLabels: cool.io/prod: "true"
さらに、spec.targetNamespaces
フィールドを使用してターゲット namespace に名前を明示的に指定することもできます。
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-group namespace: my-namespace spec: targetNamespaces: - my-namespace - my-other-namespace - my-other-other-namespace
spec.targetNamespaces
と spec.selector
の両方が定義されている場合、 spec.selector
は無視されます。
または、spec.selector
と spec.targetNamespaces
の両方を省略し、global OperatorGroup を指定できます。 これにより、すべての namespace が選択されます。
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: my-group namespace: my-namespace
解決済みの一覧の選択された namespace は OperatorGroup の status.namespaces
フィールドに表示されます。グローバル OperatorGroup の status.namespace
には空の文字列 (""
) が含まれます。 これは、消費する Operator に対し、すべての namespace を監視するように示唆します。
2.2.4.3. OperatorGroup CSV アノテーション
OperatorGroup のメンバー CSV には以下のアノテーションがあります。
アノテーション | 説明 |
---|---|
| OperatorGroup の名前が含まれます。 |
| OperatorGroup の namespace が含まれます。 |
| OperatorGroup のターゲット namespace 選択を一覧表示するカンマ区切りの文字列が含まれます。 |
olm.targetNamespaces
以外のすべてのアノテーションがコピーされた CSV と共に含まれます。olm.targetNamespaces
アノテーションをコピーされた CSV で省略すると、テナント間のターゲット namespace の重複が回避されます。
2.2.4.4. 提供される API アノテーション
OperatorGroup によって提供される GroupVersionKinds
(GVK) についての情報が olm.providedAPIs
アノテーションに表示されます。アノテーションの値は、カンマで区切られた <kind>.<version>.<group>
で構成される文字列です。OperatorGroup のすべてのアクティブメンバーの CSV によって提供される CRD および APIService の GVK が含まれます。
PackageManifest リソースを提供する単一のアクティブメンバー CSV を含む OperatorGroup の以下の例を確認してください。
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: annotations: olm.providedAPIs: PackageManifest.v1alpha1.packages.apps.redhat.com name: olm-operators namespace: local ... spec: selector: {} serviceAccount: metadata: creationTimestamp: null targetNamespaces: - local status: lastUpdated: 2019-02-19T16:18:28Z namespaces: - local
2.2.4.5. ロールベースのアクセス制御
OperatorGroup の作成時に、3 つの ClusterRole が生成されます。それぞれには、以下の示すように ClusterRoleSelector がラベルに一致するように設定された単一の AggregationRule が含まれます。
ClusterRole | 一致するラベル |
---|---|
|
|
|
|
|
|
以下の RBAC リソースは、CSV が AllNamespaces
InstallMode のあるすべての namespace を監視しており、理由が InterOperatorGroupOwnerConflict
の失敗状態にない限り、CSV が OperatorGroup のアクティブメンバーになる際に生成されます。
ClusterRole | 設定 |
---|---|
|
集計ラベル:
|
|
集計ラベル:
|
|
集計ラベル:
|
|
Verbs on
集計ラベル:
|
ClusterRole | 設定 |
---|---|
|
集計ラベル:
|
|
集計ラベル:
|
|
集計ラベル:
|
追加のロールおよびロールバインディング
-
CSV が
*
が含まれる 1 つのターゲット namespace を定義する場合、ClusterRole と対応する ClusterRoleBinding が CSV のパーミッションフィールドに定義されるパーミッションごとに生成されます。生成されたすべてのリソースにはolm.owner: <csv_name>
およびolm.owner.namespace: <csv_namespace>
ラベルが付与されます。 -
CSV が
*
が含まれる 1 つのターゲット namespace を定義 しない 場合、olm.owner: <csv_name>
およびolm.owner.namespace: <csv_namespace>
ラベルの付いた Operator namespace にあるすべてのロールおよびロールバインディングがターゲット namespace にコピーされます。
2.2.4.6. コピーされる CSV
OLM は、それぞれの OperatorGroup のターゲット namespace に、OperatorGroup のすべてのアクティブな CSV のコピーを作成します。コピーされる CSV の目的は、ユーザーに対して、特定の Operator が作成されるリソースを監視するように設定されたターゲット namespace について通知することにあります。コピーされる CSV にはステータスの理由 Copied
があり、それらのソース CSV のステータスに一致するように更新されます。olm.targetNamespaces
アノテーションは、クラスター上でコピーされる CSV が作成される前に取られます。ターゲット namespace 選択を省略すると、テナント間のターゲット namespace の重複が回避されます。コピーされる CSV はそれらのソース CSV が存在しなくなるか、またはそれらのソース CSV が属する OperatorGroup がコピーされた CSV の namespace をターゲットに設定しなくなると削除されます。
2.2.4.7. 静的 OperatorGroup
OperatorGroup はその spec.staticProvidedAPIs
フィールドが true
に設定されると 静的 になります。その結果、OLM は OperatorGroup の olm.providedAPIs
アノテーションを変更しません。つまり、これを事前に設定することができます。これは、ユーザーが OperatorGroup を使用して namespace のセットでリソースの競合を防ぐ必要がある場合で、それらのリソースの API を提供するアクティブなメンバーの CSV がない場合に役立ちます。
以下は、something.cool.io/cluster-monitoring: "true"
アノテーションのある、すべての namespace の Prometheus リソースを保護する OperatorGroup の例です。
apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: cluster-monitoring namespace: cluster-monitoring annotations: olm.providedAPIs: Alertmanager.v1.monitoring.coreos.com,Prometheus.v1.monitoring.coreos.com,PrometheusRule.v1.monitoring.coreos.com,ServiceMonitor.v1.monitoring.coreos.com spec: staticProvidedAPIs: true selector: matchLabels: something.cool.io/cluster-monitoring: "true"
2.2.4.8. OperatorGroup の交差部分
2 つの OperatorGroup は、それらのターゲット namespace セットの交差部分が空のセットではなく、olm.providedAPIs
アノテーションで定義されるそれらの指定 API セットの交差部分が空のセットではない場合に、 交差部分のある指定 API があると見なされます。
これによって生じ得る問題として、交差部分のある指定 API を持つ複数の OperatorGroup は、一連の交差部分のある namespace で同じリソースに関して競合関係になる可能性があります。
交差ルールを確認すると、OperatorGroup の namespace は常に選択されたターゲット namespace の一部として組み込まれます。
2.2.4.8.1. 交差のルール
アクティブメンバーの CSV が同期する際はいつでも、OLM はクラスターで、CSV の OperatorGroup とそれ以外のすべての OperatorGroup 間に交差部分のある指定 API のセットについてクエリーします。その後、OLM はそのセットが空のセットであるかどうかを確認します。
true
であり、CSV の指定 API が OperatorGroup のサブセットである場合:- 移行を継続します。
true
であり、CSV の指定 API が Operator Group のサブセット ではない 場合:OperatorGroup が静的である場合:
- CSV に属するすべてのデプロイメントをクリーンアップします。
-
ステータスの理由
CannotModifyStaticOperatorGroupProvidedAPIs
のある失敗状態に CSV を移行します。
OperatorGroup が静的 ではない 場合:
-
OperatorGroup の
olm.providedAPIs
アノテーションを、それ自体と CSV の指定 API の集合に置き換えます。
-
OperatorGroup の
false
であり、CSV の指定 API が OperatorGroupt のサブセット ではない 場合:- CSV に属するすべてのデプロイメントをクリーンアップします。
-
ステータスの理由
InterOperatorGroupOwnerConflict
のある失敗状態に CSV を移行します。
false
であり、CSV の提供された API が OperatorGroup のサブセットである場合:OperatorGroup が静的である場合:
- CSV に属するすべてのデプロイメントをクリーンアップします。
-
ステータスの理由
CannotModifyStaticOperatorGroupProvidedAPIs
のある失敗状態に CSV を移行します。
OperatorGroup が静的 ではない 場合:
-
OperatorGroup の
olm.providedAPIs
アノテーションを、それ自体と CSV の指定 API 間の差異部分に置き換えます。
-
OperatorGroup の
OperatorGroup によって生じる失敗状態は非終了状態です。
以下のアクションは、OperatorGroup が同期するたびに実行されます。
- アクティブメンバーの CSV の指定 API のセットは、クラスターから計算されます。コピーされた CSV は無視されることに注意してください。
-
クラスターセットは
olm.providedAPIs
と比較され、olm.providedAPIs
に追加の API が含まれる場合は、それらの API がプルーニングされます。 - すべての namespace で同じ API を提供するすべての CSV は再びキューに入れられます。これにより、交差部分のあるグループ間の競合する CSV に対して、それらの競合が競合する CSV のサイズ変更または削除のいずれかによって解決されている可能性があることが通知されます。
2.2.5. メトリクス
OLM は、Prometheus ベースの OpenShift Container Platform クラスターモニタリングスタックで使用される特定の OLM 固有のリソースを公開します。
名前 | 説明 |
---|---|
| 正常に登録された CSV の数。 |
| InstallPlan の数。 |
| サブスクリプションの数。 |
| CatalogSource の単調 (monotonic) カウント。 |