はじめに
以前にOKEでoci-secrets-store-csi-driver-providerを使ってみようという記事を書きました。
この記事では、OCI Vaultに格納したシークレットをPodにマウントして利用するということを解説しました。
ただ、実際にはコンテナアプリケーションやミドルウェアなどの仕組みで環境変数からクレデンシャルを読み取ることを強制していたり、またはその方が都合がいいケースもあると思います。
そこで、今回はoci-secrets-store-csi-driver-providerを利用してKubernetes SecretとOCI Vaultのシークレットを同期させる方法を見ていきます。
環境の構築
今回は割愛し、oci-secrets-store-csi-driver-providerがインストールされているところからやっていきます。
環境構築については前回の記事をご覧ください。
oci-secrets-store-csi-driver-providerの再インストール
OCI VaultとKubernetes Secretを同期するためのsyncSecret
はオプションになるので、インストール時に有効化するフラグを設定する必要があります。
前回はHelmでインストールを行いましたが、今回もHelmを利用して再インストールしたいと思います。
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の内容を少し変える必要があります。
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
という名前の環境変数として読み込みます。
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のユースケースがさらに広がりますね!!
参考資料