Red Hat Quay を CP4D のプライベート・コンテナー・レジストリとして使う



## Red Hat Quay Operator のインストール

1. OpenShift Container Platform コンソールを使用して、Operators → OperatorHub を選択します。
2. 検索ボックスに Red Hat Quay と入力し、Red Hat が提供する公式の `Red Hat Quay Operator` を選択します。機能、前提条件、デプロイメント情報について記載されている Installation ページに移動します。
![operator1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/33697b28-c887-fb43-b608-271503eca194.png)

3. `インストール` を選択します。Operator Installation ページが表示されます。
![operator2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/db5414e7-cde5-198f-3b69-14b172659242.png)

4. インストールのカスタマイズには、以下の選択肢を使用できます。
    i. Update Channel: 更新チャネルとして、最新リリースの `stable-3.9` を選択します。
    ii. Installation Mode: Red Hat Quay Operator をクラスター全体で使用する場合は、`クラスターのすべてのnamespace` を選択します。
    iii. 更新の承認: `自動` を選択します。
![operator3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/b9cec853-549e-4197-4867-d63991997ca8.png)

5. `インストール` を選択します。 
![operator4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/9eafd957-7281-d7ea-c7d9-ada329460a02.png)

```
# oc get pods -n openshift-operators
NAME                                    READY   STATUS    RESTARTS   AGE
quay-operator.v3.9.0-645f8977b6-pspc5   1/1     Running   0          77s
```

## オブジェクトストレージの設定とRed Hat Quay のデプロイ

:::note
ここでは Amazon S3ストレージを使用する方法を紹介しますが、MCG (Multicloud Object Gateway) をインストール済みの場合、[こちら](https://rheb.hatenablog.com/entry/2022/09/26/151603)で紹介されている方法で、オブジェクトストレージを使用せずにRed Hat Quayをデプロイすることもできます。
:::

参考:

https://access.redhat.com/documentation/ja-jp/red_hat_quay/3.9/html/deploying_the_red_hat_quay_operator_on_openshift_container_platform/operator-preconfigure

Red Hat Quay をインストールする前にオブジェクトストレージを設定する必要があります。今回は、管理対象外ストレージであるAmazon S3 ストレージを使用します。

1. 次のコマンドを入力して、namespace (デフォルトのnamespaceは、quay-enterprise) を作成します。作成したnamespaceに、プロジェクトを切り替えます。
   ```
   # oc new-project quay-enterprise
   # oc project quay-enterprise
   ```

2. [こちら](https://qiita.com/mizutan/private/1b5d0517fde62853f3aa)を参照してAmazon S3 bucketをセットアップし、アクセスに必要な認証情報を入手します。次のような `config.yaml` ファイルを作成し、アクセス情報を設定します。

   ``` config.yaml
   DISTRIBUTED_STORAGE_CONFIG:
     s3Storage:
       - S3Storage
       - host: s3.ap-northeast-1.amazonaws.com
         s3_access_key: XXXXXXXXXXXXXXXXXXXX
         s3_secret_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
         s3_bucket: quay-bucket
         storage_path: /datastorage/registry
   DISTRIBUTED_STORAGE_DEFAULT_LOCATIONS: []
   DISTRIBUTED_STORAGE_PREFERENCE:
       - s3Storage
   ```

3. 次のコマンドを入力して、設定ファイルを使用して Secret を作成します。 

   ```
   # oc create secret generic --from-file config.yaml=./config.yaml config-bundle-secret
   secret/config-bundle-secret created
   ```

4. quayregistry.yaml ファイルを作成し、管理対象外コンポーネントを特定し、作成された Secret を参照します。

   ```quayregistry.yaml
   apiVersion: quay.redhat.com/v1
   kind: QuayRegistry
   metadata:
     name: my-registry
     namespace: quay-enterprise
   spec:
     configBundleSecret: config-bundle-secret
     components:
       - kind: objectstorage
         managed: false
   ```

5. quayregistry.yaml ファイルを使用してレジストリーをデプロイします。 

   ```
   # oc create -n quay-enterprise -f quayregistry.yaml
   quayregistry.quay.redhat.com/my-registry created
   ```

6. 次のようなpodが起動します。
   ```
   # oc get pods -n quay-enterprise
   NAME                                              READY   STATUS      RESTARTS        AGE
   my-registry-clair-app-5457c98f98-67w46            1/1     Running     2 (3m49s ago)   4m3s
   my-registry-clair-app-5457c98f98-7mdpf            1/1     Running     0               2m35s
   my-registry-clair-app-5457c98f98-d25l8            1/1     Running     0               65s
   my-registry-clair-app-5457c98f98-kbb45            1/1     Running     2 (3m38s ago)   3m50s
   my-registry-clair-postgres-75f9b7f5dc-nkd7q       1/1     Running     1 (3m34s ago)   4m3s
   my-registry-quay-app-759c59859d-kgqnb             1/1     Running     0               3m5s
   my-registry-quay-app-759c59859d-p764v             1/1     Running     0               3m6s
   my-registry-quay-app-upgrade-dsp8s                0/1     Completed   0               4m3s
   my-registry-quay-config-editor-5d5b468dff-pxllh   1/1     Running     0               4m3s
   my-registry-quay-database-77cf6fbf7f-bsq2z        1/1     Running     0               4m3s
   my-registry-quay-mirror-6cd84fdfb5-hwskm          1/1     Running     0               4m3s
   my-registry-quay-mirror-6cd84fdfb5-m6sj2          1/1     Running     0               3m48s
   my-registry-quay-redis-68c786fcf4-wpw67           1/1     Running     0               4m3s
   ```

## 最初のユーザーの作成

[Red Hat Quay UI を使用した最初のユーザーの作成](https://access.redhat.com/documentation/ja-jp/red_hat_quay/3.9/html/deploying_the_red_hat_quay_operator_on_openshift_container_platform/operator-deploy-ui#operator-first-user)


1. OpenShift Container Platform コンソールで、Operators → Installed Operators に移動し、`Red Hat Quay オペレーター`をクリックします。
![create_user0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/93cbecf5-eb98-7630-71fc-ab7aa981ffa8.png)
2. Quay Registry から新しくインストールした QuayRegistry オブジェクト（ここではmy-registry）をクリックして詳細を表示します。
![create_user1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/675c8f85-a10a-dcb5-5e75-ce3b97f33de5.png)
3. Registry Endpoint の URL をクリックし、Red Hat Quay レジストリー UI にアクセスします。
![create_user2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/9f7f044f-e53c-2567-5d4d-44a27a303fd5.png)
4. Red Hat Quay レジストリー UI で Create Account を選択し、ユーザーを作成します。
![create_user3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/de8c3dbf-08f6-6e92-0369-0c5526ac8090.png)
5．Username、Password、Email の詳細を入力し、Create Account をクリックします。
![create_user4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/1d485d2a-f2e7-8204-66fc-afc142fbf3eb.png)
6. 最初のユーザーを作成すると、自動的に Red Hat Quay レジストリーにログインされます。
![create_user5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/b481fe2a-3e6d-1899-88e9-37bee2850e02.png)

## Organization の作成

:::note info
IBM Cloud Pak for Data のプライベート・コンテナー・レジストリーとして使用する場合は、イメージのミラーリングの前に `cp` と `cpopen` というOrganizationを作成しておく必要があります。

参照：
[プライベート・コンテナー・レジストリーの要件 - 必要なイメージ接頭部の許可](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.7.x?topic=requirements-private-container-registry#container-registry-requirements__mirror-prefixes__title__1)
:::

1. 「+」 → New Organization をクリックします。
![organization1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/432c3f49-0d41-cdc7-0b8c-487f5e17dd2d.png)

2. Organization Name に `cp` および `cpopen` を入力し、`Create Organization` をクリックします。
![create_org_cp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/3213797a-564c-e520-ad29-4d860eeb5a45.png)
![create_org_cpopen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/26efeb6e-7463-da7d-95fe-f4629de04f90.png)


:::note info
IBM Cloud Pak for Data のプライベート・コンテナー・レジストリーとして使用する場合で、[Amazon Elastic File System のセットアップ](https://www.ibm.com/docs/ja/cloud-paks/cp-data/4.7.x?topic=storage-setting-up-amazon-elastic-file-system)を実施する場合は、さらにもう一つOrganizationを作成しておく必要があります。Red Hat Quayの場合、一番上の階層がOrganizationとなりますが、Organization はリポジトリとは違いその直下にイメージをミラーリングすることができないためです。
:::

例えば、 `sig-storage` というOrganization を作成した場合、ミラーリング実行コマンドを次のように変更して実行します。

```
cpd-cli manage mirror-nfs-provisioner \
--target_registry=${PRIVATE_REGISTRY_LOCATION}/sig-storage \
--source_registry=k8s.gcr.io/sig-storage

## 参考：マニュアル記載のミラーリングコマンド
cpd-cli manage mirror-nfs-provisioner \
--target_registry=${PRIVATE_REGISTRY_LOCATION} \
--source_registry=k8s.gcr.io/sig-storage
```

これにより、`sig-storage/nfs-subdir-external-provisioner` というリポジトリにイメージがミラーリングされます。
![sig-storage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2164968/5f47bb5a-ba3c-dd2b-72a0-fd56258ea1e0.png)
その後のステップで `NFS_IMAGE` 環境変数を設定する時には、次のように設定します。 
```
export NFS_IMAGE=${PRIVATE_REGISTRY_LOCATION}/sig-storage/nfs-subdir-external-provisioner:v4.0.2
```
## 環境
- ROSA 4.12
- Red Hat Quay 3.9　(3.9.1でも同様であることを確認済み)
- IBM Cloud Pak for Data 4.7