如何从Azure Key Vault创建多字段Kubernetes Secret(AKS环境)
嘿,我来帮你搞定这个需求!要在AKS里创建混合了硬编码值和Azure Key Vault密码的Secret,最靠谱的方式是用External Secrets Operator (ESO)——它专门用来对接外部密钥存储,完美适配你的场景。下面是一步步的实操指南:
前提条件
- 你已经有运行中的AKS集群,并且集群通过托管身份(Managed Identity)获得了访问目标Azure Key Vault的权限(确保Key Vault的访问策略里给这个MI分配了
Secret Get权限) - 已经在AKS集群里安装了External Secrets Operator(用Helm安装最方便,比如
helm repo add external-secrets https://charts.external-secrets.io然后helm install external-secrets external-secrets/external-secrets)
步骤1:配置SecretStore(建立AKS与Key Vault的连接)
首先创建一个SecretStore资源,它相当于ESO和Key Vault之间的“连接配置”。示例YAML如下,记得替换成你的实际信息:
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: azure-kv-store namespace: default # 换成你要创建Secret的命名空间 spec: provider: azure: vaultUrl: "https://your-keyvault-name.vault.azure.net/" # 你的Key Vault地址 authType: ManagedIdentity managedIdentityClientID: "your-mi-client-id" # 有权限访问Key Vault的托管身份客户端ID
这个配置用托管身份做认证,完全不用硬编码任何凭据,安全又省心。
步骤2:创建ExternalSecret(生成目标Secret)
接下来创建ExternalSecret——这是核心,它会告诉ESO:要生成的Secret长什么样,哪些字段来自Key Vault,哪些是硬编码的。完全贴合你的需求的示例如下:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: my-external-secret spec: # 指定用刚才创建的SecretStore连接Key Vault secretStoreRef: name: azure-kv-store kind: SecretStore # 定义最终生成的Kubernetes Secret的结构 target: name: my-external-secret # 最终Secret的名字,和你要的一致 template: type: Opaque metadata: # 加上你要求的标签(注意你原示例里是mylable,我保持了拼写一致) labels: mylable: external # 加上你要求的注解 annotations: myannotation: external # 混合硬编码字段和Key Vault拉取的字段 data: name: "credentials" # 硬编码的name字段 url: "https://example.com" # 硬编码的url字段 username: "user" # 硬编码的username字段 password: "{{ .passwordFromKV }}" # 引用从Key Vault拉取的密码 # 定义从Key Vault拉取的密钥映射 data: - secretKey: passwordFromKV remoteRef: key: your-password-key-name # 替换成你Key Vault里存储密码的密钥名称
重点说明:
target.template完全复刻了你要的Secret格式,包括标签、注解和所有字段data部分把Key Vault里的密码密钥映射成passwordFromKV,然后在模板里用双大括号引用它,ESO会自动替换成真实的密码值- 当Key Vault里的密码更新时,ESO会自动同步到AKS的Secret里,不用手动操作
步骤3:验证结果
创建完上面两个资源后,等个几十秒让ESO同步,然后用这个命令查看生成的Secret:
kubectl get secret my-external-secret -o yaml
你会看到生成的Secret完全符合你给出的目标格式,password字段已经自动填充了Key Vault里的内容。
备选方案:手动创建(不推荐)
如果你暂时不想用Operator,也可以用Azure CLI手动拉取密码然后创建Secret,但这种方式不能自动同步Key Vault的更新,适合临时场景:
# 先从Key Vault拉取密码 PASSWORD=$(az keyvault secret show --name your-password-key-name --vault-name your-keyvault-name --query value -o tsv) # 创建带硬编码字段、标签和注解的Secret kubectl create secret generic my-external-secret \ --from-literal=name=credentials \ --from-literal=url=https://example.com \ --from-literal=username=user \ --from-literal=password=$PASSWORD \ --annotation myannotation=external \ --label mylable=external
但还是强烈推荐用ESO,毕竟自动同步才是生产环境的最佳实践。
内容的提问来源于stack exchange,提问作者Michael Chudinov
相关产品推荐
相关产品推荐

