Share via


在 Azure Red Hat OpenShift 上使用適用于秘密存放區 CSI 驅動程式的 Azure 金鑰保存庫 提供者

Azure 金鑰保存庫 秘密存放區 CSI 驅動程式提供者可讓您取得儲存在 Azure 金鑰保存庫 實例 中的 秘密內容,並使用 秘密存放區 CSI 驅動程式 將它們掛接至 Kubernetes Pod。 本文說明如何在 Azure Red Hat OpenShift 上使用適用于秘密存放區 CSI 驅動程式的 Azure 金鑰保存庫 提供者。

注意

作為本文所呈現開放原始碼解決方案的替代方案,您可以使用 Azure Arc 來管理您的 ARO 叢集,以及其 Azure 金鑰保存庫 Provider for Secrets Store CSI 驅動程式擴充功能 。 Microsoft 完全支援此方法,建議不要使用下列開放原始碼解決方案。

必要條件

需要下列必要條件:

設定環境變數

設定將在此程式中使用的下列變數:

export KEYVAULT_RESOURCE_GROUP=${AZR_RESOURCE_GROUP:-"openshift"}
export KEYVAULT_LOCATION=${AZR_RESOURCE_LOCATION:-"eastus"}
export KEYVAULT_NAME=secret-store-$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
export AZ_TENANT_ID=$(az account show -o tsv --query tenantId)

安裝 Kubernetes 秘密存放區 CSI 驅動程式

  1. 建立 ARO 專案;您將將 CSI 驅動程式部署到此專案中:

    oc new-project k8s-secrets-store-csi
    
  2. 設定 SecurityCoNtextConstraints 以允許 CSI 驅動程式執行 (否則,CSI 驅動程式將無法建立 Pod):

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. 將秘密存放區 CSI 驅動程式新增至 Helm 存放庫:

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. 更新 Helm 存放庫:

    helm repo update
    
  5. 安裝秘密存放區 CSI 驅動程式:

    helm install -n k8s-secrets-store-csi csi-secrets-store \
       secrets-store-csi-driver/secrets-store-csi-driver \
       --version v1.3.1 \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers"
    

    您可以選擇性地將下列參數新增至上述命令,以啟用秘密的自動調整:

    --set "syncSecret.enabled=true" --set "enableSecretRotation=true"

  6. 確認 CSI 驅動程式精靈集正在執行:

    kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
    

    執行上述命令之後,您應該會看到下列內容:

    NAME                                               READY   STATUS    RESTARTS   AGE
     csi-secrets-store-secrets-store-csi-driver-cl7dv   3/3     Running   0          57s
     csi-secrets-store-secrets-store-csi-driver-gbz27   3/3     Running   0          57s
    

部署適用于秘密存放區 CSI 驅動程式的 Azure 金鑰保存庫 提供者

  1. 新增 Azure Helm 存放庫:

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. 更新本機 Helm 存放庫:

    helm repo update
    
  3. 安裝 Azure 金鑰保存庫 CSI 提供者:

    helm install -n k8s-secrets-store-csi azure-csi-provider \
       csi-secrets-store-provider-azure/csi-secrets-store-provider-azure \
       --set linux.privileged=true --set secrets-store-csi-driver.install=false \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers" \
       --version=v1.4.1
    
  4. 設定 SecurityCoNtextConstraints 以允許 CSI 驅動程式執行:

    oc adm policy add-scc-to-user privileged \
       system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
    

建立金鑰保存庫和秘密

  1. 為您的應用程式建立命名空間。

    oc new-project my-application
    
  2. 在您的資源群組中建立包含 ARO 的 Azure 金鑰保存庫。

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. 在金鑰保存庫中建立秘密。

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. 建立金鑰保存庫的服務主體。

    注意

    如果您在建立服務主體時收到錯誤,您可能需要將 Azure CLI 升級至最新版本。

    export SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --skip-assignment --name http://$KEYVAULT_NAME --query 'password' -otsv)"
    export SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name http://$KEYVAULT_NAME --query '[0].appId' -otsv)"
    
  5. 設定服務主體的存取原則。

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. 建立和標記 Kubernetes 用來存取金鑰保存庫的秘密。

    kubectl create secret generic secrets-store-creds \
       -n my-application \
       --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} \
       --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
    kubectl -n my-application label secret \
       secrets-store-creds secrets-store.csi.k8s.io/used=true
    

部署使用 CSI 驅動程式的應用程式

  1. SecretProviderClass建立 ,以授與此秘密的存取權:

    cat <<EOF | kubectl apply -f -
     apiVersion: secrets-store.csi.x-k8s.io/v1
     kind: SecretProviderClass
     metadata:
       name: azure-kvname
       namespace: my-application
     spec:
       provider: azure
       parameters:
         usePodIdentity: "false"
         useVMManagedIdentity: "false"
         userAssignedIdentityID: ""
         keyvaultName: "${KEYVAULT_NAME}"
         objects: |
           array:
             - |
               objectName: secret1
               objectType: secret
               objectVersion: ""
         tenantId: "${AZ_TENANT_ID}"
    EOF
    
  2. 建立使用在上一個步驟中建立的 SecretProviderClass Pod:

    cat <<EOF | kubectl apply -f -
     kind: Pod
     apiVersion: v1
     metadata:
       name: busybox-secrets-store-inline
       namespace: my-application
     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: "azure-kvname"
             nodePublishSecretRef:
               name: secrets-store-creds
    EOF
    
  3. 檢查是否已掛接秘密:

    kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
    

    輸出應該符合下列專案:

    secret1
    
  4. 列印秘密:

    kubectl exec busybox-secrets-store-inline \
       -- cat /mnt/secrets-store/secret1
    

    輸出應該符合下列專案:

    Hello
    

清理

卸載金鑰保存庫提供者和 CSI 驅動程式。

卸載金鑰保存庫提供者

  1. 卸載 Helm 圖表:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. 刪除應用程式:

    oc delete project my-application
    
  3. 刪除 Azure 金鑰保存庫:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. 刪除服務主體:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

卸載 Kubernetes 秘密存放區 CSI 驅動程式

  1. 刪除秘密存放區 CSI 驅動程式:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. 刪除 SecurityCoNtextConstraints:

    oc adm policy remove-scc-from-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver