非接続環境での ODF Operator ミラーリング

非接続環境の OpenShift で、oc-mirror OpenShift CLI (oc) プラグインを使用して、完全な非接続環境でイメージをミラーレジストリーにミラーリングした作業例を紹介します。

https://docs.redhat.com/ja/documentation/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected

### 環境
- OCP 4.12
- プライベート・コンテナー・レジストリー：myregistry.domain.com:5001 

### 準備作業
次の準備作業をあらかじめ実施しておく必要があります。
[4.4.5. ミラーホストの準備](https://docs.redhat.com/ja/documentation/openshift_container_platform/4.12/html/installing/installing-mirroring-disconnected#mirroring-preparing-your-hosts)
4.4.5.1. oc-mirror OpenShift CLI プラグインのインストール
4.4.5.2. イメージのミラーリングを可能にする認証情報の設定


こちらの記事もご参照ください。

https://qiita.com/mizutan/items/f9ce173778e4b4ed743c

#### 1. イメージセット設定の作成
イメージセット設定ファイルは、コンテンツをミラーリングするときに oc mirror コマンドで必要です。

【インターネットに接続できるマシンで実行します】
1. oc mirror init コマンドを使用して、イメージセット設定のテンプレートファイルを作成します。
    ```
    oc mirror init > imageset-config-odf.yaml
    ```
    
2. イメージセット設定のテンプレートファイル `imageset-config-odf.yaml` を編集します。非接続環境で必要なパッケージのリストは[こちら](    https://docs.redhat.com/ja/documentation/red_hat_openshift_data_foundation/4.12/html/planning_your_deployment/disconnected-environment_rhodf#disconnected-environment_rhodf)を参照します。

    ```text:imageset-config-odf.yaml
    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    storageConfig:
      local:
        path: /repo/oc-mirror-odf
    mirror:
      platform:
        channels:
        - name: stable-4.12
          type: ocp
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12
        packages:
        - name: ocs-operator
        - name: odf-operator
        - name: mcg-operator
        - name: odf-csi-addons-operator
        - name: odr-cluster-operator
        - name: odr-hub-operator
          channels:
          - name: stable-4.12
      additionalImages:
      - name: registry.redhat.io/ubi8/ubi:latest
      helm: {}
    ```

#### 2. ミラーからディスクへのミラーリング

1. `oc mirror` コマンドを実行して、前のステップで作成したイメージセット設定ファイル `imageset-config-odf.yaml` を指定して、ターゲットディレクトリー `/repo/oc-mirror-odf` にイメージをミラーリングします。
    ```
    oc mirror --config=./imageset-config-odf.yaml file:///repo/oc-mirror-odf
    ```

    ```text:実行例
    # oc mirror --config=./imageset-config-odf.yaml file:///repo/oc-mirror-odf --continue-on-error
    Creating directory: /repo/oc-mirror-odf/oc-mirror-workspace/src/publish
    Creating directory: /repo/oc-mirror-odf/oc-mirror-workspace/src/v2
    Creating directory: /repo/oc-mirror-odf/oc-mirror-workspace/src/charts
    Creating directory: /repo/oc-mirror-odf/oc-mirror-workspace/src/release-signatures
          :
          :
    sha256:3e1e43cc533337ec4c0a607c42cabbc90fc9fa18c3d7a31e8b41cc5a4342f1f7 file://openshift/release:4.12.58-x86_64-kube-rbac-proxy
    sha256:8c956741a28f696593a5df8aa9b2ea423063f33eec98c94f80f25e9c99d0d68d file://openshift/release:4.12.58-x86_64-ibmcloud-machine-controllers
    info: Mirroring completed in 7m21.24s (41.15MB/s)
    Creating archive /repo/oc-mirror-odf/mirror_seq1_000000.tar
    ```
2. [結果の検証] ターゲットディレクトリーに `.tar` ファイルが作成されています。
    ```
    # ls -l /repo/oc-mirror-odf/mirror_seq1_000000.tar
    -rw-r--r-- 1 root root 32841216000 Jun  6 21:40 /repo/oc-mirror-odf/mirror_seq1_000000.tar
    ```
#### 3. イメージセットの `.tar` ファイルをプライベート・コンテナー・レジストリーに接続できる非接続環境に転送します。

#### 4. ディスクからミラーレジストリー（プライベート・コンテナー・レジストリー）へのミラーリング
【プライベート・コンテナー・レジストリーに接続できるマシンで実行します】
1. `oc mirror` コマンドを実行して、ディスク上のイメージセットファイルを処理し、その内容をターゲットミラーレジストリーにミラーリングします。 
このコマンドは、ミラーレジストリーをイメージセットで更新し、`ImageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルを生成します。

    ```
    # oc mirror --from=/repo/oc-mirror-odf/mirror_seq1_000000.tar docker://myregistry.domain.com:5001 --continue-on-error
    Checking push permissions for myregistry.domain.com:5001
    Publishing image set from archive "/repo/oc-mirror-odf/mirror_seq1_000000.tar" to registry "myregistry.domain.com:5001"
      :
      :
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/blobs/sha256/f8e72f3bc738ed25bd232bfa3fe4d60a99eb6c75954d79e5faa52a4320fb487e
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/index.json
    catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.12/layout/oci-layout
    Rendering catalog image "myregistry.domain.com:5001/redhat/redhat-operator-index:v4.12" with file-based catalog
    Writing image mapping to oc-mirror-workspace/results-1717723328/mapping.txt
    Writing CatalogSource manifests to oc-mirror-workspace/results-1717723328
    Writing ICSP manifests to oc-mirror-workspace/results-1717723328
    ```

2. [結果の検証] 実行ディレクトリー下に `oc-mirror-workspace` ディレクトリーができています。この下の `results` ディレクトリー下に、`imageContentSourcePolicy` および `CatalogSource` リソースのYAMLファイルが存在することを確認します。
    
    ```
    # ls -l results-1717723328
    合計 60
    -rwxr-xr-x 1 root root   250  6月  7 10:34 catalogSource-cs-redhat-operator-index.yaml
    drwxr-xr-x 2 root root    10  6月  7 10:22 charts
    -rwxr-xr-x 1 root root  1271  6月  7 10:34 imageContentSourcePolicy.yaml
    -rw-r--r-- 1 root root 50755  6月  7 10:34 mapping.txt
    drwxr-xr-x 2 root root    60  6月  7 10:33 release-signatures
    ```

#### 5. oc-mirror が生成したリソースを使用するためのクラスター設定 
イメージセットをミラーレジストリーにミラーリングした後、生成された`ImageContentSourcePolicy` および `CatalogSource` リソースをクラスターに適用します。

1. cluster-admin ロールを持つユーザーとして OpenShift CLI にログインします。

2. 以下のコマンドを実行して、results ディレクトリーからクラスターに YAML ファイルを適用します。     
    ```text:実行例
    # oc apply -f ./oc-mirror-workspace/results-1717723328/
    catalogsource.operators.coreos.com/cs-redhat-operator-index created
    imagecontentsourcepolicy.operator.openshift.io/generic-0 configured
    imagecontentsourcepolicy.operator.openshift.io/operator-0 configured
    imagecontentsourcepolicy.operator.openshift.io/release-0 configured
    ```
3. [結果の検証] 
a. 以下のコマンドを実行して、`ImageContentSourcePolicy` リソースが正常にインストールされたことを確認します。 
    ```
    oc get imagecontentsourcepolicy
    ```
    
    b. 以下のコマンドを実行して、`CatalogSource` リソースが正常にインストールされたことを確認します。
    ```
    oc get catalogsource -n openshift-marketplace
    ```


#### 6. 確認
ここまで完了すると、OperatorHubに `OpenShift Data Foundation` が表示されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/4af92411-3728-7256-8846-67327a5c51c1.png)