你当前正在访问 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 支持,推荐代替以下开源解决方案。
先决条件
需要以下先决条件:
- Azure Red Hat OpenShift 群集(请参阅创建 Azure Red Hat OpenShift 群集了解详细信息。)
- Azure CLI(已登录)
- Helm 3.x CLI
设置环境变量
设置将在整个过程中使用的以下变量:
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 驱动程序
创建 ARO 项目;你将 CSI 驱动程序部署到此项目中:
oc new-project k8s-secrets-store-csi
设置 SecurityContextConstraints 以允许 CSI 驱动程序运行(否则,CSI 驱动程序将无法创建 Pod):
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
将机密存储 CSI 驱动程序添加到 Helm 存储库:
helm repo add secrets-store-csi-driver \ https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
更新 Helm 存储库:
helm repo update
安装机密存储 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"
验证 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 密钥保管库提供程序
添加 Azure Helm 存储库:
helm repo add csi-secrets-store-provider-azure \ https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
更新本地 Helm 存储库:
helm repo update
安装 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
设置 SecurityContextConstraints 以允许 CSI 驱动程序运行:
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
创建密钥保管库和机密
创建应用程序的命名空间。
oc new-project my-application
在包含 ARO 的资源组中创建 Azure 密钥保管库。
az keyvault create -n ${KEYVAULT_NAME} \ -g ${KEYVAULT_RESOURCE_GROUP} \ --location ${KEYVAULT_LOCATION}
在密钥保管库中创建机密。
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
创建密钥保管库的服务主体。
注意
如果在创建服务主体时收到错误,可能需要将 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)"
设置服务主体的访问策略。
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
创建并标记用于访问密钥保管库的 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 驱动程序的应用程序
创建
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
创建使用上一步中创建的
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
检查是否已装载机密:
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
输出应与以下结果相符:
secret1
打印机密:
kubectl exec busybox-secrets-store-inline \ -- cat /mnt/secrets-store/secret1
输出应与以下结果相符:
Hello
清理
卸载密钥保管库提供程序和 CSI 驱动程序。
卸载密钥保管库提供程序
卸载 Helm 图表:
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
删除应用:
oc delete project my-application
删除 Azure 密钥保管库:
az keyvault delete -n ${KEYVAULT_NAME}
删除服务主体:
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
卸载 Kubernetes 机密存储 CSI 驱动程序
删除机密存储 CSI 驱动程序:
helm uninstall -n k8s-secrets-store-csi csi-secrets-store oc delete project k8s-secrets-store-csi
删除 SecurityContextConstraints:
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver