如何将Azure Key Vault中的密钥传入Kubernetes部署文件?
从Azure Key Vault往AKS Deployment注入环境变量的两种方案
方案一:Azure Pipeline里直接替换Deployment文件的占位符
这是最贴合你当前流水线流程的方式,步骤简单直接:
- 把Key Vault里的密钥拉到Pipeline变量中
在Pipeline的YAML里添加AzureKeyVault任务,配置你的Azure订阅、Key Vault名称,指定要拉取的目标密钥(也可以直接拉取全部)。示例配置:- task: AzureKeyVault@2 inputs: azureSubscription: '你的Azure订阅服务连接' KeyVaultName: '你的Key Vault名称' SecretsFilter: 'Development_variableFromAzure,URLS_variableFromAzure' # 精准拉取需要的密钥 RunAsPreJob: false - 替换Deployment.yaml里的占位符
用Pipeline的Replace Tokens插件即可,配置目标文件为**/deployment.yaml,令牌格式设为自定义的${开头、}结尾,插件会自动把Pipeline中从Key Vault拉取到的变量值替换进去。
要是不想用插件,写个PowerShell脚本也能搞定:(Get-Content ./deployment.yaml) -replace '${Development_variableFromAzure}', "$(Development_variableFromAzure)" ` -replace '${URLS_variableFromAzure}', "$(URLS_variableFromAzure)" | Set-Content ./deployment.yaml - 正常部署到AKS
接着用Azure CLI任务执行kubectl apply -f deployment.yaml即可,替换后的部署文件里已经是真实的密钥值。
方案二:用AKS的Key Vault Secrets Provider(生产环境推荐)
这种方式不用在Pipeline里触碰敏感数据,让AKS直接和Key Vault对接,安全性更高:
- 给AKS启用Secrets Provider附加组件
用Azure CLI执行以下命令:az aks enable-addons --addons azure-keyvault-secrets-provider --name 你的AKS集群名 --resource-group 你的资源组名 - 创建SecretProviderClass资源
这个资源用来定义AKS需要从Key Vault同步哪些密钥,注意要给AKS的托管身份配置Key Vault的密钥读取权限。示例YAML:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: azure-kv-secrets spec: provider: azure parameters: useVMManagedIdentity: "true" userAssignedIdentityID: "你的AKS托管身份ID" keyvaultName: "你的Key Vault名称" objects: | array: - | objectName: Development_variableFromAzure objectType: secret - | objectName: URLS_variableFromAzure objectType: secret tenantId: "你的Azure租户ID" - 修改Deployment.yaml引用同步的密钥
不用再写占位符,直接通过valueFrom引用同步过来的密钥:
这样应用启动时会直接从Key Vault获取密钥,全程无需在Pipeline里处理敏感数据。containers: - name: 你的应用容器名 env: - name: ASPNETCORE_ENVIRONMENT valueFrom: secretKeyRef: name: azure-kv-secrets key: Development_variableFromAzure - name: ASPNETCORE_URLS valueFrom: secretKeyRef: name: azure-kv-secrets key: URLS_variableFromAzure 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: "azure-kv-secrets"
内容的提问来源于stack exchange,提问作者kenik
相关产品推荐
相关产品推荐

