4.7. カスタムカタログの管理

以下では、OpenShift Container Platform で Operator Lifecycle Manager (OLM) の Bundle Format またはレガシー Package Manifest Format のいずれかを使用してパッケージ化された Operator のカスタムパッケージを使用する方法について説明します。

4.7.1. Bundle Format を使用したカスタムカタログ

4.7.1.1. 前提条件

  • opm CLI をインストールします。

4.7.1.2. インデックスイメージの作成

opm CLI を使用してインデックスイメージを作成できます。

前提条件

  • opm version 1.12.3+
  • podman version 1.9.3+
  • Docker v2-2 をサポートするレジストリーにビルドされ、プッシュされるバンドルイメージ。

    重要

    OpenShift Container Platform クラスターの内部レジストリーはターゲットレジストリーとして使用できません。これは、ミラーリングプロセスで必要となるタグを使わないプッシュをサポートしないためです。

手順

  1. 新しいインデックスを開始します。

    $ 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
    1
    インデックスに追加するバンドルイメージのコンマ区切りの一覧。
    2
    インデックスイメージで使用するイメージタグ。
    3
    オプション: カタログを提供するために使用する代替レジストリーベースイメージ。
  2. インデックスイメージをレジストリーにプッシュします。

    1. 必要な場合は、ターゲットレジストリーで認証します。

      $ podman login <registry>
    2. インデックスイメージをプッシュします。

      $ podman push <registry>/<namespace>/test-catalog:latest

4.7.1.3. インデックスイメージからのカタログの作成

インデックスイメージから Operator カタログを作成し、これを Operator Lifecycle Manager (OLM) で使用するために OpenShift Container Platform クラスターに適用できます。

前提条件

  • レジストリーにビルドされ、プッシュされるインデックスイメージ。

手順

  1. インデックスイメージを参照する CatalogSource オブジェクトを作成します。

    1. 仕様を以下のように変更し、これを catalogSource.yaml ファイルとして保存します。

      apiVersion: operators.coreos.com/v1alpha1
      kind: CatalogSource
      metadata:
        name: my-operator-catalog
        namespace: openshift-marketplace 1
      spec:
        sourceType: grpc
        image: <registry>:<port>/<namespace>/redhat-operator-index:v4.6 2
        displayName: My Operator Catalog
        publisher: <publisher_name> 3
        updateStrategy:
          registryPoll: 4
            interval: 30m
      1
      カタログソースを全 namespace のユーザーがグローバルに利用できるようにする場合は、openshift-marketplace namespace を指定します。それ以外の場合は、そのカタログの別の namespace を対象とし、その namespace のみが利用できるように指定できます。
      2
      インデックスイメージを指定します。
      3
      カタログを公開する名前または組織名を指定します。
      4
      カタログソースは新規バージョンの有無を自動的にチェックし、最新の状態を維持します。
    2. このファイルを使用して CatalogSource オブジェクトを作成します。

      $ oc apply -f catalogSource.yaml
  2. 以下のリソースが正常に作成されていることを確認します。

    1. 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

    2. カタログソースを確認します。

      $ oc get catalogsource -n openshift-marketplace

      出力例

      NAME                  DISPLAY               TYPE PUBLISHER  AGE
      my-operator-catalog   My Operator Catalog   grpc            5s

    3. パッケージマニフェストを確認します。

      $ oc get packagemanifest -n openshift-marketplace

      出力例

      NAME                          CATALOG               AGE
      jaeger-product                My Operator Catalog   93s

OpenShift Container Platform Web コンソールで、OperatorHub ページから Operator をインストールできるようになりました。

4.7.1.4. インデックスイメージの更新

カスタムインデックスイメージを参照するカタログソースを使用するように OperatorHub を設定した後に、クラスター管理者はバンドルイメージをインデックスイメージに追加して、クラスターで利用可能な Operator を最新の状態に維持することができます。

opm index add コマンドを使用して既存インデックスイメージを更新できます。

前提条件

  • opm version 1.12.3+
  • podman version 1.9.3+
  • レジストリーにビルドされ、プッシュされるインデックスイメージ。
  • インデックスイメージを参照する既存のカタログソース。

手順

  1. バンドルイメージを追加して、既存のインデックスを更新します。

    $ 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 podman 4
    1
    --bundlesフラグは、インデックスに追加する他のバンドルイメージのコンマ区切りリストを指定します。
    2
    --from-indexフラグは、以前にプッシュされたインデックスを指定します。
    3
    --tagフラグは、更新されたインデックスイメージに適用するイメージタグを指定します。
    4
    --pull-toolフラグは、コンテナーイメージのプルに使用されるツールを指定します。

    ここでは、以下のようになります。

    <registry>
    quay.iomirror.example.comなどのレジストリーのホスト名を指定します。
    <namespace>
    ocs-devabcなど、レジストリーの namespace を指定します。
    <new_bundle_image>
    ocs-operatorなど、レジストリーに追加する新しいバンドルイメージを指定します。
    <digest>
    c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41などのバンドルイメージの SHA イメージ ID またはダイジェストを指定します。
    <existing_index_image>
    abc-redhat-operator-indexなど、以前にプッシュされたイメージを指定します。
    <existing_tag>
    4.6 など、以前にプッシュされたイメージタグを指定します。
    <updated_tag>
    4.6.1 など、更新されたインデックスイメージに適用するイメージタグを指定します。

    コマンドの例

    $ opm index add \
        --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \
        --from-index mirror.example.com/abc/abc-redhat-operator-index:4.6 \
        --tag mirror.example.com/abc/abc-redhat-operator-index:4.6.1 \
        --pull-tool podman

  2. 更新されたインデックスイメージをプッシュします。

    $ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
  3. Operator Lifecycle Manager (OLM) がカタログソースで参照されるインデックスイメージを一定間隔で自動的にポーリングした後に、新規パッケージが正常に追加されたことを確認します。

    $ oc get packagemanifests -n openshift-marketplace

4.7.1.5. インデックスイメージのプルーニング

Operator Bundle Format に基づくインデックスイメージは、Operator カタログのコンテナー化されたスナップショットです。パッケージの指定された一覧以外のすべてのインデックスをプルーニングできます。これにより、必要な Operator のみが含まれるソースインデックスのコピーを作成できます。

前提条件

  • podman version 1.9.3+
  • grpcurl(サードパーティーのコマンドラインツール)
  • opm バージョン 1.18.0+
  • Docker v2-2 をサポートするレジストリーへのアクセス

    重要

    OpenShift Container Platform クラスターの内部レジストリーはターゲットレジストリーとして使用できません。これは、ミラーリングプロセスで必要となるタグを使わないプッシュをサポートしないためです。

手順

  1. ターゲットレジストリーで認証します。

    $ podman login <target_registry>
  2. プルーニングされたインデックスに追加するパッケージの一覧を判別します。

    1. コンテナーでプルーニングするソースインデックスイメージを実行します。以下に例を示します。

      $ podman run -p50051:50051 \
          -it registry.redhat.io/redhat/redhat-operator-index:v4.6

      出力例

      Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4.6...
      Getting image source signatures
      Copying blob ae8a0c23f5b1 done
      ...
      INFO[0000] serving registry                              database=/database/index.db port=50051

    2. 別のターミナルセッションで、grpcurl コマンドを使用して、インデックスが提供するパッケージの一覧を取得します。

      $ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
    3. packages.out ファイルを検査し、プルーニングされたインデックスに保持したいパッケージ名をこの一覧から特定します。以下に例を示します。

      パッケージ一覧のスニペットの例

      ...
      {
        "name": "advanced-cluster-management"
      }
      ...
      {
        "name": "jaeger-product"
      }
      ...
      {
      {
        "name": "quay-operator"
      }
      ...

    4. podman run コマンドを実行したターミナルセッションで、CtrlC を押してコンテナープロセスを停止します。
  3. 以下のコマンドを実行して、指定したパッケージ以外のすべてのパッケージのソースインデックスをプルーニングします。

    $ opm index prune \
        -f registry.redhat.io/redhat/redhat-operator-index:v4.6 \1
        -p advanced-cluster-management,jaeger-product,quay-operator \2
        [-i registry.redhat.io/openshift4/ose-operator-registry:v4.6] \3
        -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4.6 4
    1
    プルーニングするインデックス。
    2
    保持するパッケージのコンマ区切りリスト。
    3
    IBM Power Systems および IBM Z イメージのみに必要です: ターゲット OpenShift Container Platform クラスターのメジャーバージョンおよびマイナーバージョンに一致するタグを使用する Operator レジストリーのベースイメージです。
    4
    ビルドされる新規インデックスイメージのカスタムタグ。
  4. 以下のコマンドを実行して、新規インデックスイメージをターゲットレジストリーにプッシュします。

    $ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4.6

    ここで、<namespace> はレジストリー上の既存の namespace になります。