IBM Cloud: Secrets Manager内の任意のsecretをKubernetes Services/OpenShift Servicesに連携する

# 1. はじめに

IBM Cloud Kubernetes Services(IKS)/IBM Cloud Red Hat OpenShift Services(ROKS)では、IBM Cloud Secrets Manageで管理されている以下のsecretをIKS/ROKS上のsecretとして連携することが可能である。

- Arbitrary secrets hold one string value.
- IAM credentials hold an IAM API key.
- Username and password secrets hold a username and password as two separate values.
- Key values hold JSON values.

（参考リンク）

- https://cloud.ibm.com/docs/openshift?topic=openshift-secrets&locale=en#non-tls
- https://cloud.ibm.com/docs/containers?topic=containers-secrets&locale=en#non-tls

上記IBM Cloud docs上ではCLIでSecrets ManagerのCRNを指定することで連携処理を実施しているが、IBM Cloud Portal上でもUIで同様のことは実施可能なので、本稿ではUIを使って実施してみる。

# 2. IAMで権限付与

IBM Cloud Red Hat OpenShift ServicesからSecrets Managerを呼び出す必要があるため、IAMにて以下のような認可を事前に構成しておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/56e19892-be07-b022-4b2b-87ba753a6a24.png)

# 3. OpenShift projectの作成

今回は、`syasuda`というproject(namespace)を作成し、そこにSecrets Manager上のsecretを連携することにする。

```
$ oc new-project syasuda
Now using project "syasuda" on server "https://c115-e.jp-tok.containers.cloud.ibm.com:31149".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app rails-postgresql-example

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.43 -- /agnhost serve-hostname


$ oc get secrets -n syasuda
NAME                       TYPE                                  DATA   AGE
builder-dockercfg-rvwzp    kubernetes.io/dockercfg               1      53s
builder-token-vb9gm        kubernetes.io/service-account-token   4      53s
default-dockercfg-ks5p4    kubernetes.io/dockercfg               1      53s
default-token-86sdh        kubernetes.io/service-account-token   4      53s
deployer-dockercfg-l6lhj   kubernetes.io/dockercfg               1      53s
deployer-token-g9ksk       kubernetes.io/service-account-token   4      53s

```

# 4. secretの作成と、ROKSへの連携

以下の操作に従い、Secrets Managerでsecretを作成する

1. Add ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a57a7f01-c8b5-6162-488f-388650cf3282.png)
2. 今回はSecrets Manager上で管理するusername/passwordをIBM Cloud Red Hat OpenShift Servicesに連携したいので、ここでは`User credentails`を選択する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a3f694e9-99a1-af23-d9ac-4a6d86333afb.png)
3. secretの名前を設定![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/1a8877da-0590-8e90-7426-96fad7be7c1d.png)
4. credential情報を入力。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fc555087-ec8a-0b8d-6911-c5a221b4cc66.png)
5. まとめ ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fc0c8df0-90fb-417b-9e19-864ff77355e4.png)


ROKSに上記のsecretを連携する。

- ROKSの管理画面から、Ingress -> Secretsと移動し、`Create`を押下。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/3c2fd839-7cbc-1918-cd8a-5836c600d7cb.png)
- 連携するSecretを指定する。先ほど作成したProject/Namespaceにこのsecretを連携したいので、`Namespace`を適切に入力することを忘れないようにする（今回の場合は`syasuda`)。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/331e2e1c-8927-63f0-aef9-2c6e65849847.png)
- 追加された。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d0af00e9-95d9-922c-c4bb-f045869b8165.png)


以下でROKS上に連携されたことを確認する。

```
$ oc get secrets -n syasuda
NAME                       TYPE                                  DATA   AGE
builder-dockercfg-rvwzp    kubernetes.io/dockercfg               1      6m52s
builder-token-vb9gm        kubernetes.io/service-account-token   4      6m52s
default-dockercfg-ks5p4    kubernetes.io/dockercfg               1      6m52s
default-token-86sdh        kubernetes.io/service-account-token   4      6m52s
deployer-dockercfg-l6lhj   kubernetes.io/dockercfg               1      6m52s
deployer-token-g9ksk       kubernetes.io/service-account-token   4      6m52s
syasuda-test-secret        Opaque                                2      41s

$ oc get secrets syasuda-test-secret -n syasuda -o yaml
apiVersion: v1
data:
  password: emFxMTJ3c3g=
  username: c3lhc3VkYQ==
kind: Secret
metadata:
  annotations:
    ingress.cloud.ibm.com/cert-source: ibm
  creationTimestamp: "2024-03-05T09:45:00Z"
  name: syasuda-test-secret
  namespace: syasuda
  resourceVersion: "1711335"
  uid: ab9cef53-93e8-4527-87a1-d6453d3a67a9
type: Opaque

$ oc get secrets syasuda-test-secret -n syasuda -o jsonpath='{.data.username}'| base64 -d
syasuda

$ oc get secrets syasuda-test-secret -n syasuda -o jsonpath='{.data.password}'| base64 -d
zaq12wsx
```

# 5. Secrets Manager上でのsecretのRotate

- Secrets Manager上で、先ほど作成したsecretをRotateする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ae186990-2966-79de-a845-6b952714ac5b.png)
- 今回は、もう少し長めのパスワードを設定して、`Rotate`を押下。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/138c3332-a855-66f7-ff50-bbf8f399fe7f.png)

```txt:これだけだとROKSにはまだ反映されない
$ oc get secrets syasuda-test-secret -n syasuda -o jsonpath='{.data.password}'| base64 -d
zaq12wsx
```
```txt:更新処理を実施すると反映された。
$ ibmcloud oc ingress secret update --cluster xxxxxxxxx --name syasuda-test-secret --namespace syasuda
OK

$ oc get secrets syasuda-test-secret -n syasuda -o jsonpath='{.data.password}'| base64 -d
zaq12wsxCDE#$RFV
``