次の方法で共有


Kubernetes シークレット ストア CSI ドライバーに Azure Key Vault プロバイダーを使用する

適用対象: Windows Server 上の AKS

Kubernetes Secrets Store CSI ドライバーは、コンテナー ストレージ インターフェイス (CSI) ボリュームを使用してシークレット ストアを Kubernetes と統合します。 Windows Server 上の AKS と Secrets Store CSI ドライバーを統合する場合は、シークレット、キー、証明書をボリュームとしてマウントできます。 その後、データはコンテナーのファイル システムにマウントされます。

シークレット ストア CSI ドライバーを使用すると、キー コンテナーをサポートされているプロバイダー ( Azure Key Vault など) と統合することもできます。

開始する前に

開始する前に、以下の前提条件を確認してください。

  • Azure アカウントとサブスクリプション。
  • 既存のワークロード クラスターを使用した Windows Server での AKS の既存のデプロイ。 デプロイがない場合は、この AKS ホストとワークロード クラスターをデプロイするための前提条件に従ってください。
  • Linux クラスターを実行している場合は、Linux 1.16.0 以降のバージョンである必要があります。
  • Windows クラスターを実行している場合は、バージョンが Windows 1.18.0 以降である必要があります。
  • 次のインストールが完了していることを確認します。

kubectl を使用してクラスターにアクセスする

kubectlを使用してクラスターにアクセスするには、次のコマンドを実行します。 コマンドで、 -name の値を既存のクラスター名に置き換えます。 クラスター名は、指定したクラスターのkubeconfig ファイルを、kubeconfigの既定のkubectl ファイルとして使用します。

Get-AksHciCredential -name mycluster

シークレット ストア CSI ドライバーをインストールする

シークレット ストア CSI ドライバーをインストールするには、次の Helm コマンドを実行します。

helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts

次のコマンドは、シークレット ストア CSI ドライバーと Azure Key Vault プロバイダーの両方をインストールします。

helm install csi csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system

シークレット ストア CSI ドライバーと Azure Key Vault プロバイダーは、 kube-system 名前空間にインストールする必要があります。 このガイドでは、すべてのインスタンスに対して kube-system 名前空間を使用します。

シークレット ストア CSI ドライバーと Azure Key Vault プロバイダーが正常にインストールされていることを確認する

次のコマンドを実行して、実行中のポッドを調べて、シークレット ストア CSI ドライバーと Azure Key Vault プロバイダーがインストールされていることを確認します。

  • シークレット ストア CSI ドライバーがインストールされていることを確認するには、次のコマンドを実行します。

    kubectl get pods -l app=secrets-store-csi-driver -n kube-system
    

    出力例:

    NAME                             READY   STATUS    RESTARTS   AGE
    secrets-store-csi-driver-spbfq   3/3     Running   0          3h52m
    
  • Azure Key Vault プロバイダーがインストールされていることを確認するには、次のコマンドを実行します。

    kubectl get pods -l app=csi-secrets-store-provider-azure -n kube-system
    

    出力例:

    NAME                                         READY   STATUS    RESTARTS   AGE
    csi-csi-secrets-store-provider-azure-tpb4j   1/1     Running   0          3h52m
    

Azure キー コンテナーにシークレットを追加する

シークレット データを含む Azure Key Vault リソースが必要です。 既存の Azure Key Vault リソースを使用することも、新しいものを作成することもできます。

Azure Key Vault リソースを作成する必要がある場合は、次のコマンドを実行します。 Azure 資格情報を使用して az login を実行して、ログインしていることを確認します。 次に、次の値を環境に変更します。

az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l eastus

Azure Key Vault では、キー、シークレット、証明書を格納できます。 次の例では、 ExampleSecret というプレーンテキスト シークレットが構成されています。

az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSHCIExampleSecret

Azure で ID を作成する

サービス プリンシパルを使用して、前の手順で作成した Azure Key Vault インスタンスにアクセスします。 次のコマンドを実行するときに、出力を記録する必要があります。 次の手順では、クライアント シークレットとクライアント ID の両方を使用します。

次のコマンドを実行して、クライアント シークレットを指定します。

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription-id> --name http://secrets-store-test --query 'password' -otsv

次のコマンドを実行して、クライアント ID を指定します。

az ad sp show --id http://secrets-store-test --query 'appId' -otsv

Azure キー コンテナーにアクセスするための ID を指定する

次のコマンドに示すように、前の手順の値を使用してアクセス許可を設定します。

az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <client-id>

資格情報を使用して Kubernetes シークレットを作成する

サービス プリンシパルの資格情報を使用して Kubernetes シークレットを作成するには、次のコマンドを実行します。 次の値を、前の手順の適切なクライアント ID とクライアント シークレットに置き換えます。

kubectl create secret generic secrets-store-creds --from-literal clientid=<client-id> --from-literal clientsecret=<client-secret>

既定では、シークレット ストア プロバイダーはシークレットに対してウォッチをフィルター処理しました。 既定の構成でシークレットを検索するコマンドを許可するには、シークレットにラベル secrets-store.csi.k8s.io/used=true を追加します。

kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true

独自の SecretProviderClass オブジェクトを作成して適用する

Kubernetes クラスターのシークレット ストア CSI ドライバーを使用して構成するには、 SecretProviderClass カスタム リソースを作成します。 objects配列が、Azure Key Vault インスタンスに格納したオブジェクトと一致していることを確認します。

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <keyvault-name>                  # The name of the Azure key vault
  namespace: kube-system
spec:
  provider: azure
  parameters:
    keyvaultName: "<keyvault-name>"       # The name of the Azure key vault
    useVMManagedIdentity: "false"         
    userAssignedIdentityID: "false" 
    cloudName: ""                         # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud 
    objects:  |
      array:
        - |
          objectName: <secret-name>       # In this example, 'ExampleSecret'   
          objectType: secret              # Object types: secret, key or cert
          objectVersion: ""               # [OPTIONAL] object versions, default to latest if empty
    tenantId: "<tenant-id>"               # The tenant ID containing the Azure Key Vault instance

クラスターに SecretProviderClass を適用する

前の手順で作成した SecretProviderClass をデプロイするには、次のコマンドを使用します。

kubectl apply -f ./new-secretproviderclass.yaml

クラスターのデプロイ YAML ファイルを更新して適用する

クラスターで新しいカスタム リソースが使用されるようにするには、デプロイ YAML ファイルを更新します。 次に例を示します。

kind: Pod
apiVersion: v1
metadata:
  name: busybox-secrets-store-inline
spec:
  containers:
  - name: busybox
    image: k8s.gcr.io/e2e-test-images/busybox:1.29
    command:
      - "/bin/sleep"
      - "10000"
    volumeMounts:
    - name: secrets-store-inline
      mountPath: "/mnt/secrets-store"
      readOnly: true
  volumes:
    - name: secrets-store-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "<keyvault-name>"
        nodePublishSecretRef:                       # Only required when using service principal mode
          name: secrets-store-creds                 # Only required when using service principal mode

その後、更新されたデプロイ YAML ファイルをクラスターに適用します。

kubectl apply -f ./my-deployment.yaml 

シークレット ストアのデプロイを検証する

secrets-store に保持されているシークレットを表示するには、次のコマンドを実行します。

kubectl exec busybox-secrets-store-inline --namespace kube-system -- ls /mnt/secrets-store/

出力にはシークレットの名前が表示されます。 この例では、次の出力が表示されます。

ExampleSecret

secrets-store に保持されているテスト シークレットを表示するには、次のコマンドを実行します。

kubectl exec busybox-secrets-store-inline --namespace kube-system -- cat /mnt/secrets-store/ExampleSecret 

出力にはシークレットの値が表示されます。 この例では、次の出力が示されています。

MyAKSHCIExampleSecret

次のステップ