Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

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 のワークフロー

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) を管理します。

表2.1 OLM およびカタログ Operator で管理される CRD

リソース短縮名所有する Operator 説明

ClusterServiceVersion

csv

OLM

アプリケーションのメタデータ: 名前、バージョン、アイコン、必須リソース、インストールなど。

InstallPlan

ip

カタログ

CSV を自動的にインストールするか、またはアップグレードするために作成されるリソースの計算された一覧。

CatalogSource

catsrc

カタログ

CSV、CRD、およびアプリケーションを定義するパッケージのリポジトリー。

Subscription

sub

カタログ

パッケージのチャネルを追跡して CSV を最新の状態に保ちます。

OperatorGroup

org

OLM

同じ namespace にデプロイされたすべての Operator を OperatorGroup オブジェクトとして設定し、namespace の一覧またはクラスター全体でカスタムリソース (CR) を監視します。

これらの Operator はそれぞれリソースも作成します。

表2.2 OLM およびカタログ 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 のセットを含めることができます。

表2.3 InstallMode およびサポートされる OperatorGroup

InstallMode タイプ説明

OwnNamespace

Operator は、独自の namespace を選択する OperatorGroup のメンバーにすることができます。

SingleNamespace

Operator は 1 つの namespace を選択する OperatorGroup のメンバーにすることができます。

MultiNamespace

Operator は複数の namespace を選択する OperatorGroup のメンバーにすることができます。

AllNamespaces

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.targetNamespacesspec.selector の両方が定義されている場合、 spec.selector は無視されます。

または、spec.selectorspec.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 には以下のアノテーションがあります。

アノテーション説明

olm.operatorGroup=<group_name>

OperatorGroup の名前が含まれます。

olm.operatorGroupNamespace=<group_namespace>

OperatorGroup の namespace が含まれます。

olm.targetNamespaces=<target_namespaces>

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一致するラベル

<operatorgroup_name>-admin

olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<operatorgroup_name>-edit

olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<operatorgroup_name>-view

olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

以下の RBAC リソースは、CSV が AllNamespaces InstallMode のあるすべての namespace を監視しており、理由が InterOperatorGroupOwnerConflict の失敗状態にない限り、CSV が OperatorGroup のアクティブメンバーになる際に生成されます。

表2.4 CRD からの各 API リソース用に生成された ClusterRole

ClusterRole設定

<kind>.<group>-<version>-admin

<kind> の動詞

  • *

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

<kind> の動詞

  • create
  • update
  • patch
  • delete

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

<kind> の動詞

  • get
  • list
  • watch

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

<kind>.<group>-<version>-view-crdview

Verbs on apiextensions.k8s.io customresourcedefinitions <crd-name>:

  • get

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

表2.5 APIService からの各 API リソース用に生成された ClusterRole

ClusterRole設定

<kind>.<group>-<version>-admin

<kind> の動詞

  • *

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-admin: true
  • olm.opgroup.permissions/aggregate-to-admin: <operatorgroup_name>

<kind>.<group>-<version>-edit

<kind> の動詞

  • create
  • update
  • patch
  • delete

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-edit: true
  • olm.opgroup.permissions/aggregate-to-edit: <operatorgroup_name>

<kind>.<group>-<version>-view

<kind> の動詞

  • get
  • list
  • watch

集計ラベル:

  • rbac.authorization.k8s.io/aggregate-to-view: true
  • olm.opgroup.permissions/aggregate-to-view: <operatorgroup_name>

追加のロールおよびロールバインディング

  • 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 の集合に置き換えます。
  • false であり、CSV の指定 API が OperatorGroupt のサブセット ではない 場合:

    • CSV に属するすべてのデプロイメントをクリーンアップします。
    • ステータスの理由 InterOperatorGroupOwnerConflict のある失敗状態に CSV を移行します。
  • false であり、CSV の提供された API が OperatorGroup のサブセットである場合:

    • OperatorGroup が静的である場合:

      • CSV に属するすべてのデプロイメントをクリーンアップします。
      • ステータスの理由 CannotModifyStaticOperatorGroupProvidedAPIs のある失敗状態に CSV を移行します。
    • OperatorGroup が静的 ではない 場合:

      • OperatorGroup の olm.providedAPIs アノテーションを、それ自体と CSV の指定 API 間の差異部分に置き換えます。
注記

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 固有のリソースを公開します。

表2.6 OLM によって公開されるメトリクス

名前説明

csv_count

正常に登録された CSV の数。

install_plan_count

InstallPlan の数。

subscription_count

サブスクリプションの数。

csv_upgrade_count

CatalogSource の単調 (monotonic) カウント。