IBM Cloud SatelliteのOpenShiftクラスターでOpenShift Container RegistryのストレージにIBM Cloud Object Storageを使用する（パブリック編）

# 目的

IBM Cloud SatelliteでデプロイしたOpenShiftクラスター（ROKS）は、デフォルトで内蔵のOpenShift Container Registryが無効化されています。Satelliteの場合、デプロイ先のインフラストラクチャーが不定のためだと思われます。今回はOpenShift Container Registryを有効化しつつ、IBM Cloud Object Storageを使ってデータを永続化してみます。

# 手順

## OpenShift Container Registryの有効化

デフォルトではOpenShift Container RegistryのPodは存在しません。

```
$ oc get pods -n openshift-image-registry
NAME                                               READY   STATUS    RESTARTS   AGE
cluster-image-registry-operator-7cbb7997cd-b8hcd   1/1     Running   0          12h
node-ca-gnh8p                                      1/1     Running   0          36d
node-ca-nfwhq                                      1/1     Running   0          36d
node-ca-ztwcf                                      1/1     Running   0          36d
```

オペレーターのコンフィグを編集し、spec.managementStateをUnmanagedからManagedに変更します。

```
$ oc edit configs.imageregistry.operator.openshift.io/cluster -n openshift-image-registry

spec:
  managementState: Managed # UnmanagedをManagedに変更
```

するとimage-registry Podが起動します。

```
$ oc get pods -n openshift-image-registry
NAME                                               READY   STATUS    RESTARTS   AGE
cluster-image-registry-operator-7cbb7997cd-b8hcd   1/1     Running   0          12h
image-registry-64f7dd4f74-4rsnd                    1/1     Running   0          24s
node-ca-gnh8p                                      1/1     Running   0          36d
node-ca-nfwhq                                      1/1     Running   0          36d
node-ca-ztwcf                                      1/1     Running   0          36d
```

ふたたびコンフィグを確認します。emptyDirが自動的に指定されていますが、このままではノード再起動時にデータが消えてしまいます。

```
$  oc get configs.imageregistry.operator.openshift.io/cluster -o yaml -n openshift-image-registry

spec:
  managementState: Managed
  storage:
    emptyDir: {}
    managementState: Managed
```

## Object Storageの準備

IBM Cloud Object Storageのインスタンスを作成し、サービス資格情報でHMACを有効にします。今回はバケットを自動生成させたいので、管理者権限とします。

（手順省略）

## アクセスキーのSecret登録

サービス資格情報からアクセスキーとシークレットキーをSecretとして登録します。Secret名は固定値で``image-registry-private-configuration-user``にする必要があります。

```
$ REGISTRY_STORAGE_S3_ACCESSKEY=********
$ REGISTRY_STORAGE_S3_SECRETKEY=********

$ oc create secret generic image-registry-private-configuration-user \
  --from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=${REGISTRY_STORAGE_S3_ACCESSKEY} \
  --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=${REGISTRY_STORAGE_S3_SECRETKEY} \
  -n openshift-image-registry
```

## OpenShift Container RegistryのストレージにObject Storageを指定

今回はバケットを自動生成します。ふたたびコンフィグを修正し、spec.storageを次のようにします。

```
$ oc edit configs.imageregistry.operator.openshift.io/cluster

spec:
  storage:
    s3:
      region: jp-tok-smart
      regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud
```

regionは実はいわゆるリージョンではなくLocationConstraintと呼ばれる値です。下記ドキュメントを参照してください。

> https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-classes#classes-locationconstraint

この値を間違えると、cluster-image-registry-operatorのPodに次のようなログが出力され、構成が失敗します。

```
InvalidLocationConstraint: Container storage location with specified provisioning code not available\n\tstatus code: 400``
```

regionEndpointはバケットを作成するリージョンのパブリックエンドポイントです。regionと整合するようにしてください。

> https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-endpoints#endpoints

コンフィグを確認すると、bucketキーの値が自動的に追加されています。

```
$  oc get configs.imageregistry.operator.openshift.io/cluster -o yaml

spec:
  storage:
    s3:
      bucket: kubernetes-image-registry-jp-tok-smart-ubdwhsnooeglvuqeeovdrhe
      region: jp-tok-smart
      regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud
      virtualHostedStyle: false
```

Object Storageのバケットを確認すると、自動的に作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/14a66134-3bfd-ed9e-1f36-fc15f50dbf99.png)

# 動作確認

適当にイメージをビルドします。

```
$ oc new-build https://github.com/openshift/ruby-hello-world
$ oc logs -f ruby-hello-world-1-build

Pushing image image-registry.openshift-image-registry.svc:5000/default/ruby-hello-world:latest ...
Getting image source signatures
Copying blob sha256:887b4acab8080eb53ff3149d1c0704abb6e3c4e23fac754cbad9187b1949d7a7
Copying blob sha256:63bd373e1b3d95cbcc689e3a23a210192da99d041a0bfe0036174239ceb85302
Copying blob sha256:f0ae454850a78759fbe98a9a9a4ef80ec09ee189226fa5cd67778ed84917a33e
Copying blob sha256:912f3cdd2f77aae8e25fd62b5068d3bfc1277955bb95df4967cccbece3232050
Copying blob sha256:78d31a8e24beb2a6b73efa62afc140a28f6b7c2357b142162549f3bed5f1f40b
Copying blob sha256:053724d29990664154df415f4b3da5ce8bb20a0651f52a16a35963280770cb85
Copying blob sha256:a5a42a7c82e59752265d35bd150cdfa73f9cc54f9a175ff758f394b5ba892a1f
Copying blob sha256:7bdbb90c88bc145cadec43dbcfbb2ac785b3ea52e318d1af1acbafb330dbcd63
Copying config sha256:62d87a2e5e98a09efdf0b7d2f1bc9ba79d0a51f9a4a37daede384f7fdf3737dd
Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/default/ruby-hello-world@sha256:f90aa21067a5a028cda99541fb6abb24b0a8c057ae90ceb475501155c497da67
Push successful
```

バケットの中を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/f60a7a8c-c658-a335-fe08-f46c5c3cd54d.png)

無事保存されました。

# 次回

せっかくSatelliteを使っているので、次回はSatellite Linkを使ってよりセキュアにObject Storageを使ってみようと思います。

https://qiita.com/teruq/items/24eec0f4b37f441bad65