はじめに
先日、OKEでoci-secrets-store-csi-driver-providerがサポートされました。
これは、Oracle Cloud InfrastructureのKey Management ServiceであるOCI Vaultというサービスを利用してOKE上のアプリのSecretを管理する仕組みです。
これを試してみたいと思います。
OKEの環境構築
OKEの構築はこちらを参考に行なってください。
OCI Secrets Store CSI Driver Providerのインストール
ここではOCI Secrets Store CSI Driver Providerのインストールを行います。
これは、Kubernetes Secrets Store CSI Driverの仕組みを利用して、OCI Vaultに保存されているSecretを取得し、CSIドライバーでPodにマウントできるものです。
OCI Secrets Store CSI Driver Providerは、GCR(GitHub Container Registry)にコンテナイメージがアップロードされています。
この記事では、このイメージを利用してインストールを行います。(別途自前でビルドすることも可能です)
Helmレポジトリの追加
helm repo add oci-provider https://oracle-samples.github.io/oci-secrets-store-csi-driver-provider/charts
インストール
以下のコマンドでoci-secrets-store-csi-driver-providerをインストールします。
helm install oci-provider oci-provider/oci-secrets-store-csi-driver-provider --namespace kube-system
以下のように表示されればOKです。
Release "oci-provider" has been upgraded. Happy Helming!
NAME: oci-provider
LAST DEPLOYED: Mon Feb 6 07:16:23 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
The Secrets Store CSI Driver and the provider are getting deployed to your cluster.
Verify DaemonSets readiness:
kubectl get daemonset \
--namespace kube-system \
--selector='app.kubernetes.io/name in (oci-secrets-store-csi-driver-provider, secrets-store-csi-driver)'
表示されたVerify DaemonSets readiness
のコマンドを実行し、Podの状態を確認します。
kubectl get daemonset \
--namespace kube-system \
--selector='app.kubernetes.io/name in (oci-secrets-store-csi-driver-provider, secrets-store-csi-driver)'
以下のようにRunning
状態になっていれば問題ありません。
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
oci-provider-secrets-store-csi-driver 1 1 1 1 1 kubernetes.io/os=linux 3m20s
oci-secrets-store-csi-driver-provider 1 1 1 1 1 <none> 3m20s
これでoci-secrets-store-csi-driver-providerのインストールは完了です。
インスタンス・プリンシパルの設定
OKE上のoci-secrets-store-csi-driver-providerからOCI Vaultのクレデンシャルが参照可能になるように権限を追加する必要があります。
この記事では、インスタンス・プリンシパルという仕組みを利用して、Worker NodeからOCI Vaultのクレデンシャルが参照できるように設定します。
結果的にはPodからOCI Vaultを参照できるようになります。
インスタンス・プリンシパルの仕組みや設定の際のスクリーンショットは今回は割愛しますが、詳細はドキュメントやこちらの手順を参考にしてください。
今回設定する動的グループとポリシーは以下の通りです。
項目 | 値 | 説明 |
---|---|---|
動的グループ | Any {instance.compartment.id = <compartment-ocid>} | コンパートメント内のすべてのコンピュートを対象。本来はもっとスコープを狭くしますが、今回は全てを対象にします |
ポリシー | allow dynamic-group <dynamic-group-name> to use secret-family in compartment | 動的グループに含まれるコンピュートがVaultを利用可能にするポリシー |
これでインスタンス・プリンシパルの設定は完了です。
OCI VaultでのSecretの作成
ここでは、アプリケーションで参照させるためのSecretをOCI Vaultに登録します。
OCIコンソールから以下のようにクリックしていきます。
ボールトの作成
をクリックします。
名前を入力し、(ikanogazoudehaoke
)ボールトの作成
をクリックします。
作成したOCI VaultのOCIDは後ほど利用するので、コピーしてメモ帳などに記録しておいてください。
キーの作成
をクリックします。
名前を入力し、(以下の画像ではoke
)キーの作成
をクリックします。
画面左側にあるシークレット
をクリックします。
シークレットの作成
をクリックします。
以下のパラメータを入力し、シークレットの作成
をクリックします。
項目 | 値 |
---|---|
名前 | oke |
暗号化キー | oke |
シークレット・コンテンツ | 任意の値(この値をPodから参照します) |
以上で、Secretの作成は完了です。
動作確認
ここまでで、oci-secrets-store-csi-driver-providerが利用可能になっているため、実際に動作確認をしていきます。
まずは、Podから参照するためのSecret Providerの設定を行います。
今回はレポジトリ内のサンプルManifestを利用します。
deploy/example/secret-provider-class.yaml
を以下のように編集します。
#
# OCI Secrets Store CSI Driver Provider
#
# Copyright (c) 2022 Oracle America, Inc. and its affiliates.
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
# SecretProviderClass is a custom resource to provide driver configurations and
# provider-specific parameters to the CSI driver.
#
# On pod start and restart, the driver will communicate with the provider to retrieve the secret content
# from the external Secrets Store you have specified in the SecretProviderClass resource.
#
# For more information check: https://secrets-store-csi-driver.sigs.k8s.io/getting-started/usage.html
#
# This SecretProviderClass is used as a reference example of how to configure the OCI Vault provider.
# Each SecretProviderClass enumerates secrets to mount into the pod.
# So, multiple SecretProviderClass resources could exist in a single Kubernetes cluster.
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: test-oci-provider-class # SecretProviderClass name is referenced from pod definition
spec:
provider: oci # `provider` value is used as the provider socket name, must be constant
parameters:
# Each secret could be identified with `name` and either `stage` or `versionNumber`.
# If both `stage` and `versionNumber` are omitted, default stage CURRENT is used.
# Secret names could not be duplicated, since `name` field is used as a file name during the mounting.
secrets: |
- name: oke # OCI Vaultに登録したシークレット名
vaultId: <前手順でメモしたOCI VaultのOCID>
authType: instance
このManifestを適用します。
kubectl apply -f deploy/example/secret-provider-class.yaml
次にサンプルのPodをデプロイします。今回はnginxを利用します。
特に変更する箇所はありません。
#
# OCI Secrets Store CSI Driver Provider
#
# Copyright (c) 2022 Oracle America, Inc. and its affiliates.
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
# This Deployment is used as a reference example of how to mount secrets into the pod
# via Secrets Store CSI Driver and OCI Vault Provider.
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
volumeMounts:
- name: 'some-creds'
mountPath: '/mnt/secrets-store' # => Podのマウントパス
readOnly: true
volumes:
- name: some-creds
csi:
driver: 'secrets-store.csi.k8s.io'
readOnly: true
volumeAttributes:
secretProviderClass: 'test-oci-provider-class' # => 先ほど作成したSecretProviderClassの名前
kubectl apply -f deploy/example/app.deployment.yaml
これでデプロイは完了です。
実際にPodからOCI Vaultに格納したシークレットが参照できているかどうかを確認します。
Podの名前を取得します。
[opc@user]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-5fd7f7876d-dqpf8 1/1 Running 0 10s
Pod内にSSHします。
[opc@user]$ kubectl exec -it nginx-5fd7f7876d-dqpf8 -- bin/sh
マウントしたパスを確認します。
/ $ cd /mnt/secrets-store
中身を確認します。
/mnt/secrets-store $ cat oke
aaaa
先ほど登録したSecretの内容が登録されていますね!!
まとめ
このようにoci-secrets-store-csi-driver-providerを利用するとOKE上のアプリケーションから簡単にOCI Vaultで管理しているSecretを参照することができます。
これによって、セキュアにアプリケーションのクレデンシャルが管理できますね!!
参考資料