oci-secrets-store-csi-driver-providerでKubernetes Secretと同期する方法

# はじめに

以前に[OKEでoci-secrets-store-csi-driver-providerを使ってみよう](https://qiita.com/takuya_0301/items/2f96837e331120e88a26)という記事を書きました。
この記事では、OCI Vaultに格納したシークレットをPodにマウントして利用するということを解説しました。
ただ、実際にはコンテナアプリケーションやミドルウェアなどの仕組みで環境変数からクレデンシャルを読み取ることを強制していたり、またはその方が都合がいいケースもあると思います。

そこで、今回はoci-secrets-store-csi-driver-providerを利用してKubernetes SecretとOCI Vaultのシークレットを同期させる方法を見ていきます。

# 環境の構築

今回は割愛し、oci-secrets-store-csi-driver-providerがインストールされているところからやっていきます。
環境構築については[前回の記事](https://qiita.com/takuya_0301/items/2f96837e331120e88a26)をご覧ください。

# oci-secrets-store-csi-driver-providerの再インストール

OCI VaultとKubernetes Secretを同期するための`syncSecret`はオプションになるので、インストール時に有効化するフラグを設定する必要があります。
前回はHelmでインストールを行いましたが、今回もHelmを利用して再インストールしたいと思います。

```sh
helm upgrade --install oci-provider oci-provider/oci-secrets-store-csi-driver-provider --namespace kube-system --set secrets-store-csi-driver.syncSecret.enabled=true
```

これで再インストールは完了です。

# SecretProviderClassの編集

`syncSecret`を利用するためには前回定義したSecretProviderClassの内容を少し変える必要があります。

```yaml
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: test-oci-provider-class 
spec:
  provider: oci
  secretObjects:
    - secretName: sample-secret  ## ここにSync対象のKubernetes Secret名を指定
      type: Opaque ## Kubernetes Secretのデータタイプを指定
      data:
        - key: some-creds # Kubernetes Secretのキー名
          objectName: oke # Sync対象のVaultのシークレット名
  parameters:
    secrets: |
      - name: oke
        stage: LATEST
    vaultId: <OCI VaultのOCID>
    authType: instance
```

これをapplyします。

# Pod側の設定

Pod側にも少し変更が必要です。
今回は同期対象のKubernetes　Secretを`SECRET_DATA`という名前の環境変数として読み込みます。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
        - name: nginx
          image: nginx:1.21.4-alpine
          ports:
            - containerPort: 80
          resources:
            limits:
              memory: 128Mi
              cpu: 200m
          env:
            - name: SECRET_DATA ## 従来通りのSecretの定義
              valueFrom:
                secretKeyRef:
                  name: sample-secret
                  key: some-creds
          volumeMounts:   ## 必ずマウントが必要
            - name: sample-secret
              mountPath: '/mnt/secrets-store'  
              readOnly: true
        volumes: ## 必ずマウントが必要
        - name: sample-secret
          csi:
            driver: 'secrets-store.csi.k8s.io'
            readOnly: true
            volumeAttributes:
              secretProviderClass: 'test-oci-provider-class' 
```

ポイントはcsi-driver-providerを利用しているので、ボリュームマウントの定義が必要だということです。
OCI Vaultのシークレットそのものは、ボリュームとしてマウントされていて、その内容をKubernetes Secretとして同期します。
ちなみにこのManifestをapplyすると、定義した名前でKubernetes Secretが自動的に作成されます。

# まとめ

以上が、oci-secrets-store-csi-driver-providerを利用してKubernetes SecretとOCI Vaultのシークレットを同期する方法です。
これを利用すると、oci-secrets-store-csi-driver-providerのユースケースがさらに広がりますね！！

# 参考資料

https://qiita.com/takuya_0301/items/2f96837e331120e88a26

https://github.com/oracle-samples/oci-secrets-store-csi-driver-provider/blob/main/GettingStarted.md#secrets-sync

https://secrets-store-csi-driver.sigs.k8s.io/topics/sync-as-kubernetes-secret.html

https://secrets-store-csi-driver.sigs.k8s.io/topics/set-as-env-var.html