使用Managed Identity集成Azure Key Vault与AKS并将密钥暴露为环境变量
根因说明
你遇到的secret "foobar-secret" not found报错,是因为Azure Key Vault CSI驱动默认关闭了将Key Vault密钥同步为Kubernetes原生Secret的功能,你配置的secretObjects字段只有在功能开启时才会生效,且需要对应RBAC权限支持。使用Managed Identity场景不需要配置nodePublishSecretRef,该参数仅适用于服务主体认证模式。
解决方案(无需改启动脚本,原生支持环境变量注入)
1. 开启CSI驱动Secret同步功能
如果你是用Helm安装的Azure CSI Secrets Store Provider,执行更新命令开启同步开关:
helm upgrade csi-secrets-store-provider-azure csi-secrets-store-provider-azure/csi-secrets-store-provider-azure \ --namespace kube-system \ --set secrets-store-csi-driver.syncSecret.enabled=true
2. 配置CSI驱动的RBAC权限
给CSI驱动的服务账号授予创建、更新Secret的权限,新建rbac.yaml并部署:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: secrets-store-sync-role rules: - apiGroups: [""] resources: ["secrets"] verbs: ["create", "update", "patch", "get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: secrets-store-sync-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: secrets-store-sync-role subjects: - kind: ServiceAccount name: secrets-store-csi-driver namespace: kube-system
部署命令:kubectl apply -f rbac.yaml
3. 优化SecretProviderClass配置
将你现有SPC的apiVersion升级为稳定版,避免版本兼容问题:
apiVersion: secrets-store.csi.x-k8s.io/v1 # 替换原v1alpha1 kind: SecretProviderClass metadata: name: spc-keyvault spec: provider: azure secretObjects: - secretName: foobar-secret data: - key: foobar objectName: foobar type: Opaque parameters: keyvaultName: "$keyvault" usePodIdentity: "true" useVMManagedIdentity: "false" userAssignedIdentityID: "" objects: | array: - objectName: foobar objectType: secret resourceGroup: "$resourceGroup" subscriptionId: "$subId" tenantId: "$tenantId"
4. 重新部署验证
删除旧的SPC和Pod,重新部署更新后的SPC和你的原Pod配置,等待Pod启动后执行kubectl get secret foobar-secret即可看到自动创建的Secret,环境变量会自动注入成功。
轻量替代方案(无需改CSI驱动配置)
如果不想调整CSI驱动的全局配置,可以直接通过容器启动命令读取挂载的密钥注入环境变量,修改你的pod.yaml的containers字段即可:
containers: - name: nginx image: nginx command: ["/bin/sh", "-c"] args: ["export SECRET=$(cat /mnt/secrets-store/foobar) && nginx -g 'daemon off;'"] volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true
该方案不需要依赖Secret同步功能,也不需要提前创建Kubernetes原生Secret。
内容的提问来源于stack exchange,提问作者Gerb
相关产品推荐
相关产品推荐

