針對 Azure Kubernetes Service (AKS) 上適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者進行設定與疑難排解的選項

遵循在 AKS 叢集中使用適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者 (部分機器翻譯) 和提供身分識別以存取 AKS 中適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者 (部分機器翻譯) 中的步驟。 完成這些步驟之後,您可以套用額外的設定或執行疑難排解。

設定選項

啟用和停用自動輪替

注意

啟用適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者時,即會更新 Pod 掛接與在 SecretProviderClasssecretObjects 欄位中定義的 Kubernetes 祕密。 其會根據您定義的輪替輪詢間隔,定期輪詢變更。 預設的輪替輪詢間隔是「兩分鐘」

注意

初始 Pod 部署之後,在外部祕密存放區中更新祕密時,Kubernetes 祕密和 Pod 掛接均會根據應用程式取用祕密資料的方式定期更新。

將 Kubernetes 祕密掛接為磁碟區:使用祕密存放區 CSI 驅動程式的自動輪替和同步 K8s 祕密功能。 應用程式必須監看已掛接 Kubernetes 祕密磁碟區中的變更。 當 CSI 驅動程式更新 Kubernetes 祕密時,對應的磁碟區內容也會自動更新。

應用程式會從容器檔案系統中讀取資料:使用祕密存放區 CSI 驅動程式的輪替功能。 應用程式必須監看 CSI 驅動程式所掛接磁碟區中的檔案變更。

使用環境變數的 Kubernetes 秘密:重新啟動 Pod 以取得最新秘密作為環境變數。 使用重新載入器之類的工具來監看已同步 Kubernetes 秘密的變更,並在 Pod 上執行輪流升級。

在新的 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
    

指定自訂輪替間隔

  • 使用 az aks addon update (部分機器翻譯) 命令搭配 rotation-poll-interval 參數,指定自訂輪替間隔。

    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
    

如果您已經使用 SecretProviderClass,您可以更新附加元件,而不先使用 az aks addon enable 來停用它,而不指定 enable-secret-rotation 參數。

使用 Kubernetes 秘密同步掛接的內容

注意

本節中的 YAML 範例並不完整。 您必須修改這些範例,以支援您選擇來存取金鑰保存庫身分識別的方法。 如需詳細資料,請參閱提供身分識別來存取適用於祕密存放區 CSI 驅動程式的 Azure Key Vault 提供者 (部分機器翻譯)。

您可能想要建立 Kubernetes 祕密來鏡像設定已掛接的祕密內容。 您的祕密會在您啟動 Pod 以掛接它們之後進行同步。 當您刪除取用祕密的 Pod 時,也會刪除 Kubernetes 祕密。

  • 在建立 SecretProviderClass 以定義 Kubernetes 祕密所需的狀態時,使用 secretObjects 欄位來將掛接的內容與 Kubernetes 祕密同步,如下列範例 YAML 所示。

    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)
    

    注意

    確定 secretObjects 欄位中的 objectName 符合已掛接內容的檔案名稱。 如果您改用 objectAlias,其應該符合物件別名。

設定環境變數以參考 Kubernetes 秘密

注意

範例 YAML 示範如何透過 env 變數和 volume/volumeMount 存取祕密。 此範例供說明之用。 一般應用程式會使用其中一種方法。 不過,請注意,為了讓祕密可透過 env 變數取得,必須先由至少一個 Pod 掛接。

  • 在 Pod 中建立環境變數,以參考新建立的 Kubernetes 秘密,如下列範例 YAML 所示。

    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 提供,但預設不會在 Pod 外部公開此連接埠。

  • 使用 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 提供,但預設不會在 Pod 外部公開此連接埠。

  • 使用 kubectl port-forward,透過 localhost 存取計量。

    kubectl port-forward -n kube-system ds/aks-secrets-store-csi-driver 8095:8095 &
    curl localhost:8095/metrics
    
祕密存放區 CSI 驅動程式所提供的計量
計量 描述 標籤
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 os, provider=<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 針對 Pod 輪替祕密存放區內容所花費的時間分佈。 os_type=<runtime os>

從開放原始碼移轉至由 AKS 管理的祕密存放區 CSI 驅動程式

  1. 使用下列 helm delete 命令,解除安裝開放原始碼祕密存放區 CSI 驅動程式。

    helm delete <release name>
    

    注意

    如果您已使用部署 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 提供者,請參閱下列資源: