Azure Kubernetes Service (AKS) のシークレット ストア CSI ドライバー用の Azure Key Vault プロバイダーに関する構成とトラブルシューティングのオプション

AKS クラスターでシークレット ストア CSI ドライバーのために Azure Key Vault プロバイダーを使用する」と AKS のシークレット ストア CSI ドライバー用の Azure Key Vault プロバイダーへのアクセス ID の提供に関する記事にある手順に従います。 これらの手順を完了したら、追加の構成を適用するか、トラブルシューティングを実行できます。

構成オプション

自動ローテーションを有効または無効にする

Note

シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーが有効になっていると、SecretProviderClasssecretObjects フィールドで定義されているポッド マウントと Kubernetes シークレットが更新されます。 これは、定義したローテーション ポーリング間隔に基づいて、定期的に変更をポーリングすることで行います。 既定のローテーション ポーリング間隔は 2 分です。

Note

ポッドの初期デプロイ後に外部シークレット ストアでシークレットが更新されると、アプリケーションがシークレット データを消費する状況に応じて、Kubernetes シークレットとポッド マウントが定期的に更新されます。

Kubernetes シークレットをボリュームとしてマウントする: シークレット ストア CSI ドライバーの自動ローテーションと K8s シークレットの同期機能を使用します。 アプリケーションは、マウントされた Kubernetes Secret ボリュームからの変更を監視する必要があります。 CSI ドライバーが Kubernetes シークレットを更新すると、対応するボリュームの内容も自動的に更新されます。

アプリケーションが、コンテナーのファイルシステムからデータを読み取る: シークレット ストア CSI ドライバーのローテーション機能を使用します。 アプリケーションは、CSI ドライバーによってマウントされたボリュームからのファイル変更を監視する必要があります。

環境変数に Kubernetes シークレット を使用する: ポッドを再起動して、環境変数として最新のシークレットを取得します。 Reloader などのツールを使用して、同期された Kubernetes シークレットの変更を監視し、ポッドでローリング アップグレードを実行します。

新しい AKS クラスターで自動ローテーションを有効にする

  • az aks create コマンドを使用して新しいクラスターでシークレットの自動ローテーションを有効にし、enable-secret-rotation アドオンを有効にします。

    az aks create -n myAKSCluster2 -g myResourceGroup --enable-addons azure-keyvault-secrets-provider --enable-secret-rotation
    

既存の AKS クラスターで自動ローテーションを有効にする

  • az aks addon update コマンドと enable-secret-rotation パラメーターを使って、既存のクラスターを更新し、シークレットの自動ローテーションを有効にします。

    az aks addon update -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider --enable-secret-rotation
    

カスタム ローテーション間隔の指定

  • rotation-poll-interval パラメータを指定した az aks addon update コマンドを使用して、カスタム ローテーション間隔を指定します。

    az aks addon update -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider --enable-secret-rotation --rotation-poll-interval 5m
    

自動ローテーションを無効にする

自動ローテーションを無効にするには、まずアドオンを無効にする必要があります。 その後、enable-secret-rotation パラメータを指定せずにアドオンを再度有効にすることができます。

  1. az aks addon disable コマンドを使用してシークレット プロバイダー アドオンを無効にします。

    az aks addon disable -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider
    
  2. az aks addon enable コマンドを使用して、enable-secret-rotation パラメータを指定せずにシークレット プロバイダー アドオンを再度有効にします。

    az aks addon enable -g myResourceGroup -n myAKSCluster2 -a azure-keyvault-secrets-provider
    

マウントされたコンテンツを Kubernetes シークレットと同期する

Note

このセクションの YAML の例は不完全です。 キー コンテナー ID への選択したアクセス方法をサポートするために、それらを変更する必要があります。 詳細については、「シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーにアクセスする ID を指定する」を参照してください。

マウントしたシークレットのコンテンツをミラー化するために、Kubernetes のシークレットを作成する必要がある場合があります。 シークレットは、ポッドを起動してマウントした後に同期されます。 シークレットを消費するポッドを削除すると、Kubernetes シークレットも削除されます。

  • 次の YAML の例に示すように、SecretProviderClass を作成するときに secretObjects フィールドを使用してマウントされたコンテンツを Kubernetes シークレットと同期し、Kubernetes シークレットの目的の状態を定義します。

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: azure-sync
    spec:
      provider: azure
      secretObjects:                              # [OPTIONAL] SecretObjects defines the desired state of synced Kubernetes secret objects
      - data:
        - key: username                           # data field to populate
          objectName: foo1                        # name of the mounted content to sync; this could be the object name or the object alias
        secretName: foosecret                     # name of the Kubernetes secret object
        type: Opaque                              # type of Kubernetes secret object (for example, Opaque, kubernetes.io/tls)
    

    Note

    secretObjects フィールドの objectName が、マウントされたコンテンツのファイル名と一致することを確認します。 objectAlias を代わりに使用する場合は、オブジェクトの別名と一致する必要があります。

Kubernetes シークレットを参照する環境変数を設定する

Note

この例の YAML では、環境変数と volume/volumeMount を使ってシークレットにアクセスする方法を示します。 これは説明のためのものです。 一般的なアプリケーションでは、1 つの方法またはもう一方を使用します。 ただし、環境変数を介してシークレットを使用できるようにするには、まず少なくとも 1 つのポッドでマウントする必要があることに注意してください。

  • 次の YAML の例に示すように、ポッドに環境変数を設定して、新しく作成した Kubernetes シークレットを参照します。

    kind: Pod
    apiVersion: v1
    metadata:
      name: busybox-secrets-store-inline
    spec:
      containers:
        - name: busybox
          image: registry.k8s.io/e2e-test-images/busybox:1.29-1
          command:
            - "/bin/sleep"
            - "10000"
          volumeMounts:
          - name: secrets-store01-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
          env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: foosecret
                key: username
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-sync"
    

メトリックにアクセスする

Azure Key Vault プロバイダー

メトリックはポート 8898 から Prometheus 経由で提供されますが、このポートは既定ではポッドの外部に公開されません。

  • kubectl port-forward を使って localhost でメトリックにアクセスします。

    kubectl port-forward -n kube-system ds/aks-secrets-store-provider-azure 8898:8898 & curl localhost:8898/metrics
    
シークレット ストア CSI ドライバー用 Azure Key Vault プロバイダーが提供するメトリック
メトリック 説明 タグ
keyvault_request キー コンテナーからの取得にかかった時間の分布。 os_type=<runtime os>provider=azureobject_name=<keyvault object name>object_type=<keyvault object type>error=<error if failed>
grpc_request gRPC 要求からの取得にかかった時間の分布。 os_type=<runtime os>provider=azuregrpc_method=<rpc full method>grpc_code=<grpc status code>grpc_message=<grpc status message>

シークレット ストア CSI ドライバー

メトリックはポート 8095 で提供されますが、このポートは既定ではポッドの外部に公開されません。

  • kubectl port-forward を使って localhost でメトリックにアクセスします。

    kubectl port-forward -n kube-system ds/aks-secrets-store-csi-driver 8095:8095 &
    curl localhost:8095/metrics
    
Secrets Store CSI Driver によって提供されるメトリック
メトリック 説明 タグ
total_node_publish 成功したボリューム マウント要求の合計数。 os_type=<runtime os>provider=<provider name>
total_node_unpublish 成功したボリューム マウント解除要求の合計数。 os_type=<runtime os>
total_node_publish_error エラーがあったボリューム マウント要求の合計数。 os_type=<runtime os>provider=<provider name>error_type=<error code>
total_node_unpublish_error エラーがあったボリューム マウント解除要求の合計数。 os_type=<runtime os>
total_sync_k8s_secret 同期された Kubernetes シークレットの総数。 os_type=<runtime osprovider=<provider name>
sync_k8s_secret_duration_sec Kubernetes シークレットの同期にかかった時間の分布。 os_type=<runtime os>
total_rotation_reconcile ローテーションの調整の合計数。 os_type=<runtime os>rotated=<true or false>
total_rotation_reconcile_error エラーがあったローテーションの調整の合計数。 os_type=<runtime os>rotated=<true or false>error_type=<error code>
total_rotation_reconcile_error ポッドのシークレット ストアのコンテンツをローテーションするためにかかった時間の分布。 os_type=<runtime os>

オープンソースから AKS マネージドのシークレット ストア CSI ドライバーに移行する

  1. 次の helm delete コマンドを使用して、オープンソースのシークレット ストア CSI ドライバーをアンインストールします。

    helm delete <release name>
    

    Note

    デプロイ YAML を使用してドライバーとプロバイダーをインストールした場合は、次の kubectl delete コマンドを使用してコンポーネントを削除できます。

    # Delete AKV provider pods from Linux nodes
    kubectl delete -f https://raw.githubusercontent.com/Azure/secrets-store-csi-driver-provider-azure/master/deployment/provider-azure-installer.yaml
    
    # Delete AKV provider pods from Windows nodes
    kubectl delete -f https://raw.githubusercontent.com/Azure/secrets-store-csi-driver-provider-azure/master/deployment/provider-azure-installer-windows.yaml
    
  2. az aks enable-addons コマンドを使用して、この機能で既存の AKS クラスターをアップグレードします。

    az aks enable-addons --addons azure-keyvault-secrets-provider --name myAKSCluster --resource-group myResourceGroup
    

トラブルシューティング

トラブルシューティングの手順については、「シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーのトラブルシューティング」を参照してください。

次のステップ

シークレット ストア CSI ドライバー用 Azure Key Vault プロバイダーの詳細については、次のリソースを参照してください。