4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OKEでoci-secrets-store-csi-driver-providerを使ってみよう

Last updated at Posted at 2023-02-06

はじめに

先日、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コンソールから以下のようにクリックしていきます。

スクリーンショット 2023-02-06 16.42.00.png

ボールトの作成をクリックします。

名前を入力し、(ikanogazoudehaoke)ボールトの作成をクリックします。

スクリーンショット 2023-02-06 16.43.15.png

作成したOCI VaultのOCIDは後ほど利用するので、コピーしてメモ帳などに記録しておいてください。

スクリーンショット 2023-02-06 16.59.34.png

キーの作成をクリックします。

名前を入力し、(以下の画像ではoke)キーの作成をクリックします。

スクリーンショット 2023-02-06 16.49.16.png

画面左側にあるシークレットをクリックします。

スクリーンショット 2023-02-06 16.50.04.png

シークレットの作成をクリックします。

以下のパラメータを入力し、シークレットの作成をクリックします。

項目
名前 oke
暗号化キー oke
シークレット・コンテンツ 任意の値(この値をPodから参照します)

スクリーンショット 2023-02-06 16.51.54.png

以上で、Secretの作成は完了です。

動作確認

ここまでで、oci-secrets-store-csi-driver-providerが利用可能になっているため、実際に動作確認をしていきます。

まずは、Podから参照するためのSecret Providerの設定を行います。
今回はレポジトリ内のサンプルManifestを利用します。

deploy/example/secret-provider-class.yamlを以下のように編集します。

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を利用します。
特に変更する箇所はありません。

app.deployment.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/
#

# 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を参照することができます。
これによって、セキュアにアプリケーションのクレデンシャルが管理できますね!!

参考資料

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?