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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 17:43:13