如何通过SecretProviderClass借助Azure Key Vault挂载Azure文件共享?
实现通过Azure Key Vault读取凭据挂载Azure文件共享
你不能直接将azureFile的secretName指定为SecretProviderClass的名称,因为Azure CSI驱动的SecretProviderClass是用来动态生成Kubernetes Secret的中间资源,需要先让它从Key Vault拉取凭据生成符合要求的Secret,再让Azure文件卷引用这个自动生成的Secret。以下是完整实现步骤:
1. 部署Azure Key Vault Secrets Provider CSI驱动
如果集群还未安装该驱动,执行以下命令部署:
helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts helm install csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system --name=csi-secrets-store-provider-azure
2. 在Azure Key Vault中存储凭据
确保Key Vault内已存储两个必填机密:
- 存储账户名称:建议命名为
storage-account-name,值为你的Azure存储账户名称 - 存储账户访问密钥:建议命名为
storage-account-key,值为你的存储账户访问密钥
3. 创建SecretProviderClass配置
创建SecretProviderClass资源,定义从Key Vault拉取机密并生成符合Azure文件卷要求的Kubernetes Secret:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-keyvault-secret-provider spec: provider: azure parameters: usePodIdentity: "false" # 使用服务主体则设为false,用Pod Identity则设为true keyvaultName: "你的Key Vault名称" objects: | array: - | objectName: storage-account-name objectType: secret objectAlias: azurestorageaccountname # 必须用该别名,Azure文件卷要求Secret键名固定为这个 - | objectName: storage-account-key objectType: secret objectAlias: azurestorageaccountkey # 同上,固定键名要求 tenantId: "你的Azure租户ID" secretObjects: - data: - key: azurestorageaccountname objectName: storage-account-name - key: azurestorageaccountkey objectName: storage-account-key secretName: azure-file-secret # 生成的Kubernetes Secret名称,后续Azure文件卷将引用它 type: Opaque
4. 配置权限(服务主体方式)
创建拥有Key Vault机密读取权限的服务主体,将其凭据存储为Kubernetes Secret(该Secret无需提交Git,可通过CI/CD或手动创建):
apiVersion: v1 kind: Secret metadata: name: azure-secrets-store-creds namespace: default type: Opaque data: clientid: <base64编码的服务主体ID> clientsecret: <base64编码的服务主体密钥>
给Deployment使用的ServiceAccount绑定该凭据Secret:
apiVersion: v1 kind: ServiceAccount metadata: name: default namespace: default secrets: - name: azure-secrets-store-creds
5. 修改Deployment配置
在Deployment中同时配置Secrets Store CSI卷(用于生成Secret)和Azure文件卷,引用自动生成的Secret:
apiVersion: apps/v1 kind: Deployment metadata: name: your-deployment spec: replicas: 1 selector: matchLabels: app: your-app template: metadata: labels: app: your-app spec: serviceAccountName: default # 对应上面配置的ServiceAccount volumes: # 1. 定义CSI卷,从Key Vault拉取凭据并生成Secret - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "azure-keyvault-secret-provider" # 对应之前创建的SecretProviderClass名称 # 2. 定义Azure文件卷,引用自动生成的Secret - name: new-mount azureFile: secretName: azure-file-secret # 对应SecretProviderClass中secretObjects.secretName shareName: sharename123 readOnly: true containers: - name: your-container image: your-image volumeMounts: # 挂载Azure文件卷到容器指定路径 - name: new-mount mountPath: /new-folder readOnly: true
关键注意事项
SecretProviderClass的objectAlias必须设置为azurestorageaccountname和azurestorageaccountkey,这是Azure文件卷识别凭据的固定键名要求。- 不要直接将
azureFile.secretName设为SecretProviderClass的名称,两者是不同类型的资源,SecretProviderClass是生成Secret的规则定义,而非Secret本身。 - 确保服务主体(或Pod Identity)已被授予Key Vault的
Secrets User权限,能够读取目标机密。
内容的提问来源于stack exchange,提问作者dexter27
相关产品推荐
相关产品推荐

