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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:02:26