使用Artifacthub公开Helm Chart部署K8s服务时,如何通过Vault注入敏感信息
使用Vault向ArtifactHub Helm Chart注入敏感信息的实现方法
前提条件
- 已部署并配置Vault集群,且启用Kubernetes认证方法
- Kubernetes集群已完成与Vault的身份验证绑定(含服务账户关联、权限策略配置)
- 已了解目标ArtifactHub Helm Chart的values结构,明确需要注入敏感信息的字段
方法一:Vault Sidecar Injector自动注入(官方推荐)
通过Mutating Webhook自动为Pod注入Vault Agent Sidecar,拉取Vault敏感数据并挂载到容器内,无需手动管理Secret生命周期。
步骤1:配置Vault与K8s的认证及权限
- 启用Kubernetes认证:
vault auth enable kubernetes - 配置K8s集群信息(替换
<K8S_API_SERVER>和CA证书路径):vault write auth/kubernetes/config \ kubernetes_host="https://<K8S_API_SERVER>:6443" \ kubernetes_ca_cert=@/path/to/k8s-ca.crt - 创建Vault访问策略(示例:允许读取
secret/data/myapp/*路径),保存为app-policy.hcl:
加载策略:path "secret/data/myapp/*" { capabilities = ["read"] }vault policy write myapp-policy app-policy.hcl - 绑定K8s服务账户到该策略(假设Helm使用的服务账户为
myapp-sa,命名空间myapp-ns):vault write auth/kubernetes/role/myapp-role \ bound_service_account_names=myapp-sa \ bound_service_account_namespaces=myapp-ns \ policies=myapp-policy \ ttl=24h
步骤2:修改Helm values触发Sidecar注入
在自定义values.yaml中添加Pod注解,触发Vault注入:
podAnnotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "myapp-role" # 将Vault中secret/data/myapp/db的内容注入到容器/opt/secrets/db文件 vault.hashicorp.com/agent-inject-secret-db: "secret/data/myapp/db" # 自定义注入文件的模板格式 vault.hashicorp.com/agent-inject-template-db: | {{- with secret "secret/data/myapp/db" -}} username: {{ .Data.data.username }} password: {{ .Data.data.password }} {{- end -}} # 设置注入文件的路径、权限和所有者 vault.hashicorp.com/agent-inject-file-db: "/opt/secrets/db" vault.hashicorp.com/agent-inject-perms-db: "0640" vault.hashicorp.com/agent-inject-owner-db: "root:root"
执行Helm安装/升级:
helm upgrade --install myapp <artifacthub-chart-name> -f custom-values.yaml -n myapp-ns
步骤3:验证注入效果
进入Pod检查Sidecar容器和敏感文件:
kubectl exec -it myapp-xxx-xxx -n myapp-ns -- cat /opt/secrets/db
方法二:同步Vault数据到K8s Secret后由Helm引用
通过同步工具将Vault数据同步到K8s Secret,再让Helm Chart直接引用该Secret,适合不希望引入Sidecar的场景。
步骤1:使用External Secrets Operator同步Vault数据
- 创建SecretStore指向Vault(命名空间
myapp-ns):apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: vault-secret-store namespace: myapp-ns spec: provider: vault: server: "https://vault.example.com:8200" path: "secret" version: "v2" auth: kubernetes: mountPath: "auth/kubernetes" role: "myapp-role" serviceAccountRef: name: myapp-sa - 创建ExternalSecret同步Vault数据到K8s Secret:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: myapp-db-secret namespace: myapp-ns spec: secretStoreRef: name: vault-secret-store kind: SecretStore target: name: myapp-db-secret data: - secretKey: username remoteRef: key: secret/data/myapp/db property: username - secretKey: password remoteRef: key: secret/data/myapp/db property: password
步骤2:修改Helm values引用同步后的Secret
根据Chart的配置结构,将敏感字段指向K8s Secret的key:
database: username: valueFrom: secretKeyRef: name: myapp-db-secret key: username password: valueFrom: secretKeyRef: name: myapp-db-secret key: password
执行Helm安装/升级即可。
关键注意事项
- 遵循最小权限原则,Vault策略仅授予应用所需的敏感数据路径访问权限
- Sidecar注入方式支持自动凭证轮换,无需手动更新Secret
- 同步方式需确保同步工具(如External Secrets Operator)的高可用性,避免Secret失效
- 部分ArtifactHub公开Chart可能需要自定义模板支持Secret引用,需提前查阅Chart文档确认
内容的提问来源于stack exchange,提问作者tobias
相关产品推荐
相关产品推荐

