You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:27:38