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

Azure Keyvault与AKS集群同步Secret及Pod环境变量配置问题

问题分析与修正方案

一、立即解决ContainerCreation错误

你的Deployment YAML中volumeMounts配置位置错误,它应当放在容器(containers)的spec内部,而非与containers同级,这是导致Pod创建失败的直接原因。

修正后的Deployment容器部分配置:

containers:
  - name: test-microservice
    image: cntrregistry-location/testmsr:v2.0.0
    imagePullPolicy: Always
    ports:
      - containerPort: 8183
    volumeMounts:  # 移至container内部
    - name: secrets-store01-inline
      mountPath: "/mnt/secrets-store"
      readOnly: true

二、两种方式将Keyvault Secret转为环境变量

方案1:直接从挂载文件读取(无需创建K8s Secret)

CSI驱动会将Keyvault中的Secret以文件形式挂载到/mnt/secrets-store/TESTTOKEN路径下,你可以通过容器启动命令读取文件内容并设置为环境变量:

containers:
  - name: test-microservice
    image: cntrregistry-location/testmsr:v2.0.0
    imagePullPolicy: Always
    ports:
      - containerPort: 8183
    volumeMounts:
    - name: secrets-store01-inline
      mountPath: "/mnt/secrets-store"
      readOnly: true
    command: ["/bin/sh", "-c"]
    args: ["export TESTTOKEN=$(cat /mnt/secrets-store/TESTTOKEN) && java -jar your-app.jar"]

将java -jar your-app.jar替换为你的微服务实际启动命令。

方案2:同步为K8s Secret后用secretKeyRef(推荐)

通过修改SecretProviderClass配置,让CSI驱动自动将Keyvault Secret同步为K8s Secret,之后即可用标准的secretKeyRef方式引用。

步骤1:修改SecretProviderClass

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-user-msi
  namespace: myspace
spec:
  provider: azure
  parameters:
    usePodIdentity: "false"
    useVMManagedIdentity: "true"         
    userAssignedIdentityID: "abcd-123"   
    keyvaultName: "my-kv-app"        
    cloudName: ""                          
    objects:  |
      array:
        - |
          objectName: TESTTOKEN
          objectType: secret              
          objectVersion: ""               
    tenantId: "12345_tenant_id"
  secretObjects:  # 添加同步K8s Secret的配置
  - data:
    - key: TESTTOKEN
      objectName: TESTTOKEN
    secretName: test-token-k8s-secret  # 自动创建的K8s Secret名称
    type: Opaque

步骤2:修改Deployment的env配置

引用同步后的K8s Secret:

env:
  - name: TESTTOKEN
    valueFrom:
      secretKeyRef:
        name: test-token-k8s-secret  # 与SecretProviderClass中secretName一致
        key: TESTTOKEN

三、核心疑问解答

1. Secret同步流程

  • Pod创建时,CSI驱动根据SecretProviderClass配置,通过指定的托管身份访问Azure Keyvault拉取目标Secret。
  • 若配置了secretObjects,驱动会将拉取到的Secret同步为K8s Secret存储在集群,同时以文件形式挂载到Pod指定路径;若未配置,则仅完成文件挂载,不创建K8s Secret。

2. 能否作为环境变量使用

可以,两种方式:

  • 从挂载的文件中读取并设置(方案1)。
  • 同步为K8s Secret后,通过secretKeyRef引用(方案2,符合K8s最佳实践)。

3. K8s Secret是否必须创建

不是必须的。直接从挂载文件读取环境变量无需创建K8s Secret;若要使用secretKeyRef或envFrom方式引用,则需通过SecretProviderClass的secretObjects配置让驱动自动创建。

4. 能否直接从Keyvault获取Secret

是的,CSI驱动会直接与Azure Keyvault交互拉取Secret,无需手动创建K8s Secret,所有同步操作由驱动自动完成。

内容的提问来源于stack exchange,提问作者user14013917

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:23:13