共用方式為


使用 Azure 金鑰保存庫 Provider for Kubernetes Secrets Store CSI 驅動程式

適用於:Azure Local 22H2 上的 AKS、Windows Server 上的 AKS

Kubernetes 秘密存放區 CSI 驅動程式會透過 容器記憶體介面 (CSI) 磁碟區整合秘密存放區與 Kubernetes。 如果您整合秘密存放區 CSI 驅動程式與 Azure Arc 所啟用的 AKS,您可以將秘密、密鑰和憑證掛接為磁碟區。 然後,數據會掛接在容器的文件系統中。

使用秘密存放區 CSI 驅動程式,您也可以將金鑰保存庫與其中一個支援的提供者整合,例如 Azure 金鑰保存庫

開始之前

開始之前,請確定您有下列必要條件:

  • Azure 帳戶和訂用帳戶。
  • 使用現有工作負載叢集啟用Arc所啟用的現有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 金鑰保存庫 提供者:

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

注意

您應該在 命名空間中kube-system安裝秘密存放區 CSI 驅動程式和 Azure 金鑰保存庫 提供者。 本指南會 kube-system 針對所有實例使用 命名空間。

確認已成功安裝秘密存放區 CSI 驅動程式和 Azure 金鑰保存庫 提供者

檢查您執行中的 Pod,以確定秘密存放區 CSI 驅動程式和 Azure 金鑰保存庫 提供者是藉由執行下列命令來安裝:

  • 若要確認已安裝秘密存放區 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 金鑰保存庫 提供者,請執行此命令:

    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 金鑰保存庫 資源。 您可以使用現有的 Azure 金鑰保存庫 資源,或建立新的資源。

如果您需要建立 Azure 金鑰保存庫 資源,請執行下列命令。 請確定 az login 您已使用您的 Azure 認證執行來登入。 然後將下列值變更為您的環境:

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 中建立身分識別

使用服務主體來存取您在上一個步驟中建立的 Azure 金鑰保存庫 實例。 您應該在執行下列命令時記錄輸出。 您在後續步驟中同時使用用戶端密碼和用戶端識別碼。

執行下列命令來提供客戶端密碼:

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

執行下列命令來提供用戶端識別碼:

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

提供身分識別來存取 Azure 金鑰保存庫

使用上一個步驟中的值來設定許可權,如下列命令所示:

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

使用認證建立 Kubernetes 秘密

若要使用服務主體認證建立 Kubernetes 秘密,請執行下列命令。 將下列值取代為上一個步驟中適當的用戶端識別碼和客戶端密碼:

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 金鑰保存庫 實體中的物件:

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, 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

下一步