Kubernetes部署YAML中获取Azure Key Vault密钥的方法
实现AKS工作负载从Azure Key Vault读取密钥作为环境变量
推荐使用官方维护的 Secrets Store CSI Driver + Azure Key Vault 提供程序 实现,全程无需在YAML中硬编码敏感值,步骤如下:
前置准备
- 已在AKS集群启用Secrets Store CSI Driver组件及Azure Key Vault扩展
- 集群工作负载使用的托管标识/服务主体,已被授予目标Key Vault的
Key Vault Secrets User角色,拥有密钥读取权限 - 已经将ServiceBus连接字符串作为Secret对象存入Azure Key Vault,记好该Secret在Key Vault中的对象名称
步骤1:创建SecretProviderClass自定义资源
该资源用于定义集群和Key Vault的对接规则,会自动将Key Vault中的密钥同步为Kubernetes原生Secret资源,供工作负载引用:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kv-secrets namespace: default # 替换成你Deployment所在的命名空间 spec: provider: azure parameters: usePodIdentity: "false" useVMManagedIdentity: "true" # 使用集群/节点级托管标识设为true,用服务主体可调整对应参数 userAssignedIdentityID: "" # 填写使用的用户分配托管标识客户端ID,用系统分配托管标识留空即可 keyvaultName: "<YOUR-KEYVAULT-NAME>" # 替换为你的Azure Key Vault实例名称 cloudName: "AzurePublicCloud" objects: | array: - | objectName: "<YOUR-SERVICEBUS-SECRET-NAME-IN-KV>" # 替换为Key Vault中存储ServiceBus连接串的Secret名称 objectType: secret objectVersion: "" # 留空默认使用最新版本密钥 tenantId: "<YOUR-AAD-TENANT-ID>" # 替换为你的Azure AD租户ID # 该配置会将Key Vault密钥同步为K8s原生Secret,支持以环境变量形式注入容器 secretObjects: - secretName: servicebus-secret type: Opaque data: - objectName: "<YOUR-SERVICEBUS-SECRET-NAME-IN-KV>" # 和上方objects中定义的objectName保持一致 key: SERVICEBUS_CONNECTIONSTRING # 同步后K8s Secret内的键名,和容器要读取的环境变量名对应
步骤2:修改Deployment配置替换硬编码
将原硬编码环境变量的部分替换为CSI卷挂载+Secret引用,修改后的完整Deployment YAML如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - image: nginx name: nginx env: - name: SERVICEBUS_CONNECTIONSTRING valueFrom: secretKeyRef: name: servicebus-secret # 和SecretProviderClass中secretObjects定义的secretName保持一致 key: SERVICEBUS_CONNECTIONSTRING # 和secretObjects中data定义的key保持一致 volumeMounts: - name: kv-secrets-volume mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: kv-secrets-volume csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "azure-kv-secrets" # 和创建的SecretProviderClass名称一致
注意事项
- 你贴出的明文ServiceBus连接字符串已经存在泄露风险,请第一时间到Azure门户轮换对应ServiceBus命名空间的共享访问密钥,避免未授权访问。
- 所有带
<>占位符的参数请替换为实际环境的配置值,确保命名空间、资源名称前后一致。 - 部署后Pod启动时CSI驱动会自动从Key Vault拉取最新密钥,同步到K8s Secret后注入容器环境变量,全程不需要手动创建Secret对象。
内容的提问来源于stack exchange,提问作者cva
相关产品推荐
相关产品推荐

