4.7. カスタムカタログの管理
dedicated-admin ロールを持つ管理者と Operator カタログメンテナーは、Red Hat OpenShift Service on AWS の Operator Lifecycle Manager (OLM) で バンドル形式 を使用してパッケージ化したカスタムカタログを作成および管理できます。
Kubernetes は定期的に特定の API を非推奨とし、後続のリリースで削除します。そのため、Red Hat OpenShift Service on AWS のバージョンで、API が削除された Kubernetes バージョンが採用されると、Operator がその API を使用できなくなります。
4.7.1. 前提条件 リンクのコピーリンクがクリップボードにコピーされました!
4.7.2. ファイルベースのカタログ リンクのコピーリンクがクリップボードにコピーされました!
ファイルベースのカタログ は、Operator Lifecycle Manager (OLM) の最新バージョンのカタログ形式です。この形式は、プレーンテキストベース (JSON または YAML) であり、以前の SQLite データベース形式の宣言的な設定の進化であり、完全な下位互換性があります。
Red Hat OpenShift Service on AWS 4.11 の時点で、デフォルトの Red Hat が提供する Operator カタログは、ファイルベースのカタログ形式でリリースされます。Red Hat OpenShift Service on AWS 4.6 から 4.10 までのデフォルトの Red Hat が提供する Operator カタログは、非推奨の SQLite データベース形式でリリースされました。
opm サブコマンド、フラグ、および SQLite データベース形式に関連する機能も非推奨となり、今後のリリースで削除されます。機能は引き続きサポートされており、非推奨の SQLite データベース形式を使用するカタログに使用する必要があります。
opm index prune などの SQLite データベース形式を使用する opm サブコマンドおよびフラグの多くは、ファイルベースのカタログ形式では機能しません。ファイルベースのカタログを使用する方法の詳細は、Operator Framework パッケージ形式 を参照してください。
4.7.2.1. ファイルベースのカタログイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
opm CLI を使用して、非推奨の SQLite データベース形式を置き換えるプレーンテキストの ファイルベースのカタログ 形式 (JSON または YAML) を使用するカタログイメージを作成できます。
前提条件
-
opmCLI がインストールされている。 -
podmanバージョン 1.9.3 以降がある。 - バンドルイメージがビルドされ、Docker v2-2 をサポートするレジストリーにプッシュされている。
手順
カタログを初期化します。
次のコマンドを実行して、カタログ用のディレクトリーを作成します。
$ mkdir <catalog_dir>opm generate dockerfileコマンドを実行して、カタログイメージを構築できる Dockerfile を生成します。$ opm generate dockerfile <catalog_dir> \ -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v41 - 1
-iフラグを使用して公式の Red Hat ベースイメージを指定します。それ以外の場合、Dockerfile はデフォルトのアップストリームイメージを使用します。
Dockerfile は、直前の手順で作成したカタログディレクトリーと同じ親ディレクトリーに存在する必要があります。
ディレクトリー構造の例
.1 ├── <catalog_dir>2 └── <catalog_dir>.Dockerfile3 opm initコマンドを実行して、カタログに Operator のパッケージ定義を追加します。$ opm init <operator_name> \1 --default-channel=preview \2 --description=./README.md \3 --icon=./operator-icon.svg \4 --output yaml \5 > <catalog_dir>/index.yaml6 このコマンドは、指定されたカタログ設定ファイルに
olm.package宣言型設定 blob を生成します。
opm renderコマンドを実行して、バンドルをカタログに追加します。$ opm render <registry>/<namespace>/<bundle_image_name>:<tag> \1 --output=yaml \ >> <catalog_dir>/index.yaml2 注記チャネルには、1 つ以上のバンドルが含まれる必要があります。
バンドルのチャネルエントリーを追加します。たとえば、次の例を仕様に合わせて変更し、
<catalog_dir>/index.yamlファイルに追加します。チャネルエントリーの例
--- schema: olm.channel package: <operator_name> name: preview entries: - name: <operator_name>.v0.1.01 - 1
<operator_name>の後、かつ、バージョンのvの前に、ピリオド (.) を追加するようにしてください。それ以外の場合、エントリーがopm validateコマンドに合格できません。
ファイルベースのカタログを検証します。
カタログディレクトリーに対して
opm validateコマンドを実行します。$ opm validate <catalog_dir>エラーコードが
0であることを確認します。$ echo $?出力例
0
podman buildコマンドを実行して、カタログイメージをビルドします。$ podman build . \ -f <catalog_dir>.Dockerfile \ -t <registry>/<namespace>/<catalog_image_name>:<tag>カタログイメージをレジストリーにプッシュします。
必要に応じて、
podman loginコマンドを実行してターゲットレジストリーで認証します。$ podman login <registry>podman pushコマンドを実行して、カタログイメージをプッシュします。$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
4.7.3. SQLite ベースのカタログ リンクのコピーリンクがクリップボードにコピーされました!
Operator カタログの SQLite データベース形式は非推奨の機能です。非推奨の機能は依然として Red Hat OpenShift Service on AWS に含まれており、引き続きサポートされますが、この製品の今後のリリースで削除されるため、新規デプロイメントでの使用は推奨されません。
Red Hat OpenShift Service on AWS で非推奨化または削除された主な機能の最新のリストは、Red Hat OpenShift Service on AWS リリースノートの 非推奨および削除された機能 セクションを参照してください。
4.7.3.1. SQLite ベースのインデックスイメージの作成 リンクのコピーリンクがクリップボードにコピーされました!
opm CLI を使用して、SQLite データベース形式に基づいてインデックスイメージを作成できます。
前提条件
-
opmCLI がインストールされている。 -
podmanバージョン 1.9.3 以降がある。 - バンドルイメージがビルドされ、Docker v2-2 をサポートするレジストリーにプッシュされている。
手順
新しいインデックスを開始します。
$ opm index add \ --bundles <registry>/<namespace>/<bundle_image_name>:<tag> \1 --tag <registry>/<namespace>/<index_image_name>:<tag> \2 [--binary-image <registry_base_image>]3 インデックスイメージをレジストリーにプッシュします。
必要な場合は、ターゲットレジストリーで認証します。
$ podman login <registry>インデックスイメージをプッシュします。
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
4.7.3.2. SQLite ベースのインデックスイメージの更新 リンクのコピーリンクがクリップボードにコピーされました!
dedicated-admin ロールを持つ管理者は、カスタムインデックスイメージを参照するカタログソースを使用するようにソフトウェアカタログを設定した後、インデックスイメージにバンドルイメージを追加することで、クラスター上で利用可能な Operators を最新の状態に保つことができます。
opm index add コマンドを使用して既存インデックスイメージを更新できます。
前提条件
-
opmCLI がインストールされている。 -
podmanバージョン 1.9.3 以降がある。 - インデックスイメージがビルドされ、レジストリーにプッシュされている。
- インデックスイメージを参照する既存のカタログソースがある。
手順
バンドルイメージを追加して、既存のインデックスを更新します。
$ opm index add \ --bundles <registry>/<namespace>/<new_bundle_image>@sha256:<digest> \1 --from-index <registry>/<namespace>/<existing_index_image>:<existing_tag> \2 --tag <registry>/<namespace>/<existing_index_image>:<updated_tag> \3 --pull-tool podman4 ここでは、以下のようになります。
<registry>-
quay.ioやmirror.example.comなどのレジストリーのホスト名を指定します。 <namespace>-
ocs-devやabcなど、レジストリーの namespace を指定します。 <new_bundle_image>-
ocs-operatorなど、レジストリーに追加する新しいバンドルイメージを指定します。 <digest>-
c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41などのバンドルイメージの SHA イメージ ID またはダイジェストを指定します。 <existing_index_image>-
abc-redhat-operator-indexなど、以前にプッシュされたイメージを指定します。 <existing_tag>-
以前にプッシュしたイメージのタグ (
4など) を指定します。 <updated_tag>-
更新されたインデックスイメージに適用するイメージタグ (
4.1など) を指定します。
コマンドの例
$ opm index add \ --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \ --from-index mirror.example.com/abc/abc-redhat-operator-index:4 \ --tag mirror.example.com/abc/abc-redhat-operator-index:4.1 \ --pull-tool podman更新されたインデックスイメージをプッシュします。
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>Operator Lifecycle Manager (OLM) がカタログソースで参照されるインデックスイメージを一定間隔で自動的にポーリングした後に、新規パッケージが正常に追加されたことを確認します。
$ oc get packagemanifests -n openshift-marketplace
4.7.3.3. SQLite ベースのインデックスイメージのフィルタリング リンクのコピーリンクがクリップボードにコピーされました!
Operator Bundle Format に基づくインデックスイメージは、Operator カタログのコンテナー化されたスナップショットです。パッケージの指定された一覧以外のすべてのインデックスを プルーニング できます。これにより、必要な Operators のみが含まれるソースインデックスのコピーを作成できます。
前提条件
-
podmanバージョン 1.9.3 以降がある。 -
grpcurl(サードパーティーのコマンドラインツール) がある。 -
opmCLI がインストールされている。 - Docker v2-2 をサポートするレジストリーにアクセスできる。
手順
ターゲットレジストリーで認証します。
$ podman login <target_registry>プルーニングされたインデックスに追加するパッケージのリストを判別します。
コンテナーでプルーニングするソースインデックスイメージを実行します。以下に例を示します。
$ podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4出力例
Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4... Getting image source signatures Copying blob ae8a0c23f5b1 done ... INFO[0000] serving registry database=/database/index.db port=50051別のターミナルセッションで、
grpcurlコマンドを使用して、インデックスが提供するパッケージのリストを取得します。$ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.outpackages.outファイルを検査し、プルーニングされたインデックスに保持したいパッケージ名をこのリストから特定します。以下に例を示します。パッケージリストのスニペットの例
... { "name": "advanced-cluster-management" } ... { "name": "jaeger-product" } ... { { "name": "quay-operator" } ...-
podman runコマンドを実行したターミナルセッションで、Ctrl と C を押してコンテナープロセスを停止します。
以下のコマンドを実行して、指定したパッケージ以外のすべてのパッケージのソースインデックスをプルーニングします。
$ opm index prune \ -f registry.redhat.io/redhat/redhat-operator-index:v4 \1 -p advanced-cluster-management,jaeger-product,quay-operator \2 [-i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4] \3 -t <target_registry>:<port>/<namespace>/redhat-operator-index:v44 以下のコマンドを実行して、新規インデックスイメージをターゲットレジストリーにプッシュします。
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4ここで、
<namespace>はレジストリー上の既存の namespace になります。
4.7.4. カタログソースと Pod セキュリティーアドミッション リンクのコピーリンクがクリップボードにコピーされました!
Pod のセキュリティー標準を確保するために、Pod セキュリティーアドミッション が Red Hat OpenShift Service on AWS 4.11 で導入されました。SQLite ベースのカタログ形式と、Red Hat OpenShift Service on AWS 4.11 より前にリリースされたバージョンの opm CLI ツールを使用してビルドされたカタログソースは、制限付き Pod セキュリティーの適用下では実行できません。
Red Hat OpenShift Service on AWS では、制限付き Pod セキュリティーが namespace にデフォルトで適用されず、カタログソースのデフォルトセキュリティーモードが legacy に設定されています。
すべての namespace に対するデフォルトの制限付き適用は、今後の Red Hat OpenShift Service on AWS リリースに組み込まれる予定です。制限付き適用が発生した場合、カタログソース Pod の Pod 仕様のセキュリティーコンテキストは、制限付き Pod のセキュリティー標準に一致する必要があります。カタログソースイメージで別の Pod セキュリティー標準が必要な場合は、namespace の Pod セキュリティーアドミッションラベルを明示的に設定する必要があります。
SQLite ベースのカタログソース Pod を制限付きで実行する必要がない場合は、Red Hat OpenShift Service on AWS でカタログソースを更新する必要はありません。
ただし、制限付きの Pod セキュリティー適用下でカタログソースが確実に実行されるように、今すぐ対策を講じることを推奨します。制限付き Pod セキュリティー適用下でカタログソースが確実に実行されるように対策を講じないと、今後の Red Hat OpenShift Service on AWS リリースでカタログソースが動作しなくなる可能性があります。
カタログの作成者は、次のいずれかのアクションを実行することで、制限付き Pod セキュリティー適用との互換性を有効にできます。
- カタログをファイルベースのカタログ形式に移行します。
-
Red Hat OpenShift Service on AWS 4.11 以降でリリースされた
opmCLI ツールのバージョンを使用してカタログイメージを更新します。
SQLite データベースカタログ形式は非推奨ですが、Red Hat では引き続きサポートされています。将来のリリースでは、SQLite データベース形式はサポートされなくなり、カタログはファイルベースのカタログ形式に移行する必要があります。Red Hat OpenShift Service on AWS 4.11 以降、デフォルトの Red Hat 提供の Operator カタログは、ファイルベースのカタログ形式でリリースされます。ファイルベースのカタログは、制限付き Pod セキュリティー適用と互換性があります。
SQLite データベースカタログイメージを更新したり、カタログをファイルベースのカタログ形式に移行したりしたくない場合は、昇格されたアクセス許可で実行するようにカタログを設定できます。
4.7.4.1. SQLite データベースカタログをファイルベースのカタログ形式に移行する リンクのコピーリンクがクリップボードにコピーされました!
非推奨の SQLite データベース形式のカタログをファイルベースのカタログ形式に更新できます。
前提条件
- SQLite データベースカタログソースがある。
-
dedicated-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
ワークステーションには、Red Hat OpenShift Service on AWS でリリースされた最新バージョンの
opmCLI ツールがインストールされている。
手順
次のコマンドを実行して、SQLite データベースカタログをファイルベースのカタログに移行します。
$ opm migrate <registry_image> <fbc_directory>次のコマンドを実行して、ファイルベースのカタログ用の Dockerfile を生成します。
$ opm generate dockerfile <fbc_directory> \ --binary-image \ registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4
次のステップ
- 生成された Dockerfile をビルドしてタグ付けし、レジストリーにプッシュできます。
4.7.4.2. SQLite データベースカタログイメージの再ビルド リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenShift Service on AWS のお使いのバージョンでリリースされた opm CLI ツールの最新バージョンを使用して、SQLite データベースカタログイメージを再ビルドできます。
前提条件
- SQLite データベースカタログソースがある。
-
dedicated-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
ワークステーションには、Red Hat OpenShift Service on AWS でリリースされた最新バージョンの
opmCLI ツールがインストールされている。
手順
次のコマンドを実行して、最新バージョンの
opmCLI ツールでカタログを再構築します。$ opm index add --binary-image \ registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4 \ --from-index <your_registry_image> \ --bundles "" -t \<your_registry_image>
4.7.4.3. 昇格された権限で実行するためのカタログの設定 リンクのコピーリンクがクリップボードにコピーされました!
SQLite データベースカタログイメージを更新したり、カタログをファイルベースのカタログ形式に移行したりしたくない場合は、次のアクションを実行して、デフォルトの Pod セキュリティー適用が制限付きに変更されたときにカタログソースが確実に実行されるようにすることができます。
- カタログソース定義でカタログセキュリティーモードをレガシーに手動で設定します。このアクションにより、デフォルトのカタログセキュリティーモードが制限付きに変更された場合でも、カタログが従来のアクセス許可で実行されることが保証されます。
- ベースラインまたは特権付き Pod のセキュリティー適用のために、カタログソースの namespace にラベルを付けます。
SQLite データベースカタログ形式は非推奨ですが、Red Hat では引き続きサポートされています。将来のリリースでは、SQLite データベース形式はサポートされなくなり、カタログはファイルベースのカタログ形式に移行する必要があります。ファイルベースのカタログは、制限付き Pod セキュリティー適用と互換性があります。
前提条件
- SQLite データベースカタログソースがある。
-
dedicated-adminロールを持つユーザーとしてクラスターにアクセスできる。 -
Pod Security Admission 標準が
baselineまたはprivilegedに昇格された実行中の Pod をサポートするターゲット namespace がある。
手順
次の例に示すように、
spec.grpcPodConfig.securityContextConfigラベルをlegacyに設定して、CatalogSource定義を編集します。CatalogSource定義の例apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-catsrc namespace: my-ns spec: sourceType: grpc grpcPodConfig: securityContextConfig: legacy image: my-image:latestヒントRed Hat OpenShift Service on AWS では、
spec.grpcPodConfig.securityContextConfigフィールドはデフォルトでlegacyに設定されています。Red Hat OpenShift Service on AWS の今後のリリースでは、デフォルト設定がrestrictedに変更される予定です。カタログを制限付き適用で実行できない場合は、このフィールドを手動でlegacyに設定することを推奨します。次の例に示すように、
<namespace>.yamlファイルを編集して、上位の Pod Security Admission 標準をカタログソース namespace に追加します。<namespace>.yamlファイルの例apiVersion: v1 kind: Namespace metadata: ... labels: security.openshift.io/scc.podSecurityLabelSync: "false"1 openshift.io/cluster-monitoring: "true" pod-security.kubernetes.io/enforce: baseline2 name: "<namespace_name>"
4.7.5. クラスターへのカタログソースの追加 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat OpenShift Service on AWS クラスターにカタログソースを追加すると、ユーザーが Operator を検出してインストールできるようになります。dedicated-admin ロールを持つ管理者は、インデックスイメージを参照する CatalogSource オブジェクトを作成できます。ソフトウェアカタログは、カタログソースを使用してユーザーインターフェイスの内容を表示します。
または、Web コンソールを使用してカタログソースを管理できます。Home CatalogSource を検索します。個々のソースを作成、更新、削除、無効化、および有効化できます。
前提条件
- インデックスイメージをビルドしてレジストリーにプッシュしている。
-
dedicated-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
インデックスイメージを参照する
CatalogSourceオブジェクトを作成します。仕様を以下のように変更し、これを
catalogSource.yamlファイルとして保存します。apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog namespace: openshift-marketplace1 annotations: olm.catalogImageTemplate:2 "<registry>/<namespace>/<index_image_name>:v{kube_major_version}.{kube_minor_version}.{kube_patch_version}" spec: sourceType: grpc grpcPodConfig: securityContextConfig: <security_mode>3 image: <registry>/<namespace>/<index_image_name>:<tag>4 displayName: My Operator Catalog publisher: <publisher_name>5 updateStrategy: registryPoll:6 interval: 30m- 1
- カタログソースを全 namespace のユーザーがグローバルに利用できるようにする場合は、
openshift-marketplacenamespace を指定します。それ以外の場合は、そのカタログの別の namespace を対象とし、その namespace のみが利用できるように指定できます。 - 2
- 任意:
olm.catalogImageTemplateアノテーションをカタログイメージ名に設定し、イメージタグのテンプレートを作成する際に、1 つ以上の Kubernetes クラスターバージョン変数を使用します。 - 3
legacyまたはrestrictedの値を指定します。フィールドが設定されていない場合、デフォルト値はlegacyです。今後の Red Hat OpenShift Service on AWS リリースでは、デフォルト値がrestrictedになる予定です。注記restricted権限でカタログを実行できない場合は、このフィールドを手動でlegacyに設定することを推奨します。- 4
- インデックスイメージを指定します。イメージ名の後にタグを指定すると (
:v4など)、カタログソース Pod がAlwaysイメージプルポリシーを使用します。つまり、Pod がコンテナーを起動する前に常にイメージをプルするようになります。@sha256:<id>などのダイジェストを指定した場合、イメージプルポリシーはIfNotPresentになります。これは、イメージがノード上にまだ存在しない場合にのみ、Pod がイメージをプルすることを意味します。 - 5
- カタログを公開する名前または組織名を指定します。
- 6
- カタログソースは新規バージョンの有無を自動的にチェックし、最新の状態を維持します。
このファイルを使用して
CatalogSourceオブジェクトを作成します。$ oc apply -f catalogSource.yaml
以下のリソースが正常に作成されていることを確認します。
Pod を確認します。
$ oc get pods -n openshift-marketplace出力例
NAME READY STATUS RESTARTS AGE my-operator-catalog-6njx6 1/1 Running 0 28s marketplace-operator-d9f549946-96sgr 1/1 Running 0 26hカタログソースを確認します。
$ oc get catalogsource -n openshift-marketplace出力例
NAME DISPLAY TYPE PUBLISHER AGE my-operator-catalog My Operator Catalog grpc 5sパッケージマニフェストを確認します。
$ oc get packagemanifest -n openshift-marketplace出力例
NAME CATALOG AGE jaeger-product My Operator Catalog 93s
Red Hat OpenShift Service on AWS Web コンソールの ソフトウェアカタログ ページから Operator をインストールできるようになりました。
4.7.6. カスタムカタログの削除 リンクのコピーリンクがクリップボードにコピーされました!
dedicated-admin ロールを持つ管理者は、関連するカタログソースを削除することで、以前にクラスターに追加したカスタム Operator カタログを削除できます。
前提条件
-
dedicated-adminロールを持つユーザーとしてクラスターにアクセスできる。
手順
-
Web コンソールの Administrator パースペクティブで、Home
Search に移動します。 - Project: リストからプロジェクトを選択します。
- Resources リストから CatalogSource を選択します。
-
削除するカタログの Options メニュー
を選択し、Delete CatalogSource をクリックします。