如何在AKS中借助Key Vault安全管理Pod环境变量?
当然可以!完全能像你在Azure Web App里那样,用托管身份让AKS的Pod安全访问Key Vault,彻底把明文环境变量换掉。我给你一套官方推荐的成熟方案,一步步来就行:
实现方案:AKS托管身份+Key Vault CSI Driver 安全管理敏感配置
1. 给AKS托管身份配置Key Vault访问权限
首先得确保你的AKS集群托管身份(系统分配或用户分配的都可以),在Key Vault里有读取机密的权限:
- 打开Azure门户,找到你的Key Vault,进入「访问策略」页面
- 添加新的访问策略,在「机密权限」里勾选
Get和List - 「主体」选择你的AKS集群对应的托管身份
- 保存配置
2. 启用AKS的Key Vault Secrets Provider插件
这个插件是AKS官方提供的,能自动用托管身份从Key Vault拉取机密,挂载到Pod里。直接用Azure CLI启用即可:
az aks enable-addons --addons azure-keyvault-secrets-provider --name <你的AKS集群名> --resource-group <你的资源组名>
3. 创建SecretProviderClass资源
这个资源用来告诉插件:要从哪个Key Vault拉取哪些机密。比如你要把连接字符串存为Key Vault里名为MyDbConnectionString的机密,就用下面的配置:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: kv-secret-provider spec: provider: azure parameters: usePodIdentity: "false" # 用AKS系统托管身份就设为false;如果是用户托管身份则设为true keyvaultName: "<你的Key Vault名称>" objects: | array: - | objectName: MyDbConnectionString objectType: secret objectVersion: "" # 留空表示使用最新版本的机密 tenantId: "<你的Azure租户ID>"
把占位符替换成你的实际信息,然后执行kubectl apply -f <文件名>.yaml创建这个资源。
4. 修改Deployment,挂载机密并注入环境变量
现在调整你原来的Deployment配置,通过CSI卷挂载Key Vault机密,再把它转换成环境变量:
apiVersion: apps/v1 kind: Deployment metadata: name: webapp-deployment labels: app: webapp spec: replicas: 1 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: dockerimage ports: - containerPort: 80 env: - name: "ConnectionStrings__MyDbConnection" valueFrom: secretKeyRef: name: kv-secret # 和下面volume配置里的secretName对应 key: MyDbConnectionString - name: "ASPNETCORE_ENVIRONMENT" value: "Development" securityContext: allowPrivilegeEscalation: false 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: "kv-secret-provider" # 对应我们创建的SecretProviderClass名称 restartPolicy: Always
这样配置后,插件会自动用AKS托管身份去Key Vault拉取机密,把它挂载到Pod的/mnt/secrets-store目录,同时生成对应的Kubernetes Secret,最后通过valueFrom.secretKeyRef把机密注入成环境变量。
额外说明
- 如果你用的是用户分配的托管身份,需要把SecretProviderClass里的
usePodIdentity设为true,同时给Pod关联该身份(用Azure AD Pod Identity实现) - 记得先把你的数据库连接字符串存到Key Vault里,名称要和SecretProviderClass里的
objectName完全一致 - 这套逻辑和Web App的托管身份访问Key Vault完全对齐:不需要硬编码密钥,敏感配置全在Key Vault,应用自动安全获取
内容的提问来源于stack exchange,提问作者Nayden Van
相关产品推荐
相关产品推荐

