你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure Red Hat OpenShift 上使用适用于机密存储 CSI 驱动程序的 Azure 密钥保管库提供程序

通过适用于机密存储 CSI 驱动程序的 Azure 密钥保管库提供程序,可获取 Azure 密钥保管库实例中存储的机密内容,并使用机密存储 CSI 驱动程序将这些内容装载到 Kubernetes Pod 中。 本文介绍如何在 Azure Red Hat OpenShift 上使用适用于机密存储 CSI 驱动程序的 Azure 密钥保管库提供程序。

注意

作为本文中介绍的开源解决方案的替代方法,可以使用 Azure Arc 来管理 ARO 群集及其适用于机密存储 CSI 驱动程序的 Azure Key Vault 提供程序扩展。 此方法完全受 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