4.9. ネットワークが制限された環境での Operator Lifecycle Manager の使用

ネットワークが制限された環境 ( 非接続クラスター としても知られる) にインストールされている OpenShift Container Platform クラスターの場合、デフォルトで Operator Lifecycle Manager (OLM) はリモートレジストリーでホストされる Red Hat が提供する OperatorHub ソースにアクセスできません。それらのリモートソースには完全なインターネット接続が必要であるためです。

ただし、クラスター管理者は、完全なインターネットアクセスのあるワークステーションがある場合には、クラスターがネットワークが制限された環境で OLM を使用できるようにできます。ワークステーションは、リモートソースのローカルミラーを準備するために使用され、コンテンツをミラーレジストリーにプッシュしますが、これにはリモートの OperatorHub コンテンツをプルするのに完全なインターネットアクセスが必要になります。

ミラーレジストリーは bastion ホストに配置することができます。bastion ホストには、ワークステーションと非接続クラスターの両方への接続、または完全に切断されたクラスター、またはミラーリングされたコンテンツを非接続環境に物理的に移動するためにリムーバブルメディアが必要な エアギャップ ホストへの接続が必要です。

以下では、ネットワークが制限された環境で OLM を有効にするために必要な以下のプロセスについて説明します。

  • OLM のデフォルトのリモート OperatorHub ソースを無効にします。
  • 完全なインターネットアクセスのあるワークステーションを使用して、OperatorHub コンテンツのローカルミラーを作成し、これをミラーレジストリーにプッシュします。
  • OLM を、デフォルトのリモートソースからではなくミラーレジストリーのローカルソースから Operator をインストールし、管理するように設定します。

ネットワークが制限された環境で OLM を有効にした後も、引き続き制限のないワークステーションを使用して、Operator の新しいバージョンが更新されるとローカルの OperatorHub ソースを更新された状態に維持することができます。

重要

OLM はローカルソースから Operator を管理できますが、特定の Operator がネットワークが制限された環境で正常に実行されるかどうかは、Operator 自体が次の基準を満たすかどうかに依存します。

  • 関連するイメージ、または Operator がそれらの機能を実行するために必要となる可能性のある他のコンテナーイメージを ClusterServiceVersion (CSV) オブジェクトの relatedImages パラメーターで一覧表示します。
  • 指定されたすべてのイメージを、タグではなくダイジェスト (SHA) で参照します。

Red Hat エコシステムカタログ でソフトウェアを検索して、以下の選択肢でフィルタリングすることにより、非接続モードでの実行をサポートする Red Hat Operator のリストを見つけることができます。

コンテナー化されたアプリケーション

デプロイメント方法

Operator

インフラストラクチャー機能

Disconnected

4.9.1. 前提条件

  • cluster-admin 権限を持つユーザーとして OpenShift Container Platform クラスターにログインします。
  • デフォルトカタログをプルーニングし、Operator のサブセットのみを選択的にミラーリングするには、opm CLI をインストールします。
注記

IBM Z のネットワークが制限された環境で OLM を使用している場合は、レジストリーを配置するディレクトリーに 12 GB 以上を割り当てる必要があります。

4.9.2. デフォルトの OperatorHub ソースの無効化

Red Hat によって提供されるコンテンツを調達する Operator カタログおよびコミュニティープロジェクトは、OpenShift Container Platform のインストール時にデフォルトで OperatorHub に設定されます。ネットワークが制限された環境では、クラスター管理者としてデフォルトのカタログを無効にする必要があります。その後、OperatorHub をローカルカタログソースを使用するように設定できます。

手順

  • disableAllDefaultSources: trueOperatorHub オブジェクトに追加して、デフォルトカタログのソースを無効にします。

    $ oc patch OperatorHub cluster --type json \
        -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
ヒント

または、Web コンソールを使用してカタログソースを管理できます。AdministrationCluster SettingsConfigurationOperatorHub ページから、Sources タブをクリックして、個別のソースを作成し、削除し、無効にし、有効にすることができます。

4.9.3. SQLite ベースのインデックスイメージのフィルターリング

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

ネットワークが制限された環境の OpenShift Container Platform クラスターでミラーリングされたコンテンツを使用するように Operator Lifecycle Manager (OLM) を設定する場合、デフォルトカタログから Operator のサブセットのみをミラーリングする必要がある場合に、このプルーニング方法を使用します。

この手順のステップでは、ターゲットレジストリーは、ネットワークアクセスが無制限のワークステーションからアクセスできる既存のミラーレジストリーです。この例では、デフォルトの redhat-operators カタログのインデックスイメージのプルーニングも示していますが、このプロセスはすべてのインデックスイメージに対して同じです。

前提条件

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

    重要

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

手順

  1. registry.redhat.io で認証します。

    $ podman login registry.redhat.io
  2. ターゲットレジストリーで認証します。

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

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

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

      出力例

      Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4.9...
      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 を押してコンテナープロセスを停止します。
  4. 以下のコマンドを実行して、指定したパッケージ以外のすべてのパッケージのソースインデックスをプルーニングします。

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

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

    ここで、<namespace> はレジストリー上の既存の namespace になります。たとえば、olm-mirror namespace を作成し、ミラーリングされたすべてのコンテンツをプッシュすることができます。

4.9.4. Operator カタログのミラーリング

非接続クラスターで使用する Operator カタログをミラーリングする方法は、非接続インストールのイメージのミラーリング を参照してください。

4.9.5. クラスターへのカタログソースの追加

カタログソースを OpenShift Container Platform クラスターに追加すると、ユーザーの Operator の検出およびインストールが可能になります。クラスター管理者は、インデックスイメージを参照する CatalogSource オブジェクトを作成できます。OperatorHub はカタログソースを使用してユーザーインターフェイスを設定します。

前提条件

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

手順

  1. インデックスイメージを参照する CatalogSource オブジェクトを作成します。oc adm catalog mirror コマンドを使用してカタログをターゲットレジストリーにミラーリングする場合、manifests ディレクトリーに生成される catalogSource.yaml ファイルを開始点としてそのまま使用することができます。

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

      apiVersion: operators.coreos.com/v1alpha1
      kind: CatalogSource
      metadata:
        name: my-operator-catalog 1
        namespace: openshift-marketplace 2
      spec:
        sourceType: grpc
        image: <registry>/<namespace>/redhat-operator-index:v4.9 3
        displayName: My Operator Catalog
        publisher: <publisher_name> 4
        updateStrategy:
          registryPoll: 5
            interval: 30m
      1
      レジストリーにアップロードする前にローカルファイルにコンテンツをミラーリングする場合は、metadata.name フィールドからバックスラッシュ (/) 文字を削除し、オブジェクトの作成時に invalid resource name エラーを回避します。
      2
      カタログソースを全 namespace のユーザーがグローバルに利用できるようにする場合は、openshift-marketplace namespace を指定します。それ以外の場合は、そのカタログの別の namespace を対象とし、その namespace のみが利用できるように指定できます。
      3
      インデックスイメージを指定します。
      4
      カタログを公開する名前または組織名を指定します。
      5
      カタログソースは新規バージョンの有無を自動的にチェックし、最新の状態を維持します。
    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.9.6. SQLite ベースのインデックスイメージの更新

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

opm index add コマンドを使用して既存インデックスイメージを更新できます。ネットワークが制限された環境の場合、更新されたコンテンツもクラスターにミラーリングする必要があります。

前提条件

  • opm バージョン 1.18.0+
  • 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.9 など、以前にプッシュされたイメージタグを指定します。
    <updated_tag>
    4.9.1 など、更新されたインデックスイメージに適用するイメージタグを指定します。

    コマンドの例

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

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

    $ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
  3. Operator カタログのミラーリングの手順にあるステップを再度実行し、更新されたコンテンツをミラーリングします。ただし、ImageContentSourcePolicy (ICSP) オブジェクトの作成手順を参照する場合、 oc create コマンドの代わりに oc replace コマンドを使用します。以下に例を示します。

    $ oc replace -f ./manifests-redhat-operator-index-<random_number>/imageContentSourcePolicy.yaml

    この変更は、オブジェクトがすでに存在し、更新する必要があるために必要になります。

    注記

    通常、oc apply コマンドを使用して、oc apply を使用して以前に作成された既存のオブジェクトを更新できます。ただし、ICSP オブジェクトの metadata.annotations フィールドのサイズに関する既知の問題により、現時点では oc replace コマンドをこの手順で使用する必要があります。

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

    $ oc get packagemanifests -n openshift-marketplace