HashiCorp Vault替换现有Helm Chart中k8s Secrets的最优方案
Helm Chart 接入 Vault 密钥改造及免修改父Chart方案
以下方案均兼容k3s集群,不需要每次升级上游父Chart时修改原生模板代码:
基于BanzaiCloud bank-vaults Mutating Webhook无侵入改造
该方案无需改动上游Chart的任何模板逻辑,借助Webhook的动态注入能力实现密钥替换,适配绝大多数开源Helm Chart:
- 主流开源Chart(如官方Elasticsearch Chart)均支持自定义Pod/工作负载注解、自定义环境变量配置,你只需要在安装/升级Chart时的values.yaml中添加对应配置即可:
elasticsearch: statefulset: annotations: vault.security.banzaicloud.io/vault-addr: "https://vault.vault.svc:8200" vault.security.banzaicloud.io/vault-role: "elasticsearch" env: - name: ELASTIC_PASSWORD value: "vault:secret/data/elasticsearch#password"
- 原理是Mutating Webhook会在Pod创建阶段自动识别
vault:开头的环境变量值,拉取Vault对应密钥后替换为真实值,原生Chart的Secret相关逻辑可以保留作为兜底,互不冲突。
基于Vault Sidecar Injector免改模板改造
同样不需要修改上游Chart模板,借助开源Chart普遍支持的额外配置项实现注入:
- 直接在values.yaml中配置Sidecar注入注解、额外存储卷挂载即可,示例配置如下:
elasticsearch: podAnnotations: vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: "elasticsearch" vault.hashicorp.com/agent-inject-secret-es-config: "secret/data/elasticsearch" vault.hashicorp.com/agent-inject-template-es-config: | {{- with secret "secret/data/elasticsearch" -}} elasticsearch.password: {{ .Data.data.password }} {{- end }} extraVolumeMounts: - name: vault-secrets mountPath: /usr/share/elasticsearch/config/secrets extraVolumes: - name: vault-secrets emptyDir: {}
- 如果所用的Chart没有提供
extraVolumes这类通用扩展配置,可以搭配Helm原生的Post Renderer功能,对渲染完成的资源做二次修改,全程不需要触碰父Chart代码。
Helm原生模板覆写方案
如果上述注入方案不满足你的定制化需求,可以使用Helm原生能力实现逻辑覆写:
- 命名模板覆写:如果上游父Chart的Secret逻辑是用可复用的命名模板定义的,你可以在自己的伞形Chart(Umbrella Chart)中定义同名模板,Helm渲染时会优先使用你定义的模板内容,覆盖父Chart的原有逻辑。
- 资源补丁覆写:使用Helm 3.1+支持的Post Renderer功能,搭配kustomize做资源补丁,可直接删除渲染出来的原生Secret资源,替换为你需要的Vault注入逻辑,每次升级Chart时补丁会自动生效,无需修改父Chart。
k3s集群自带kustomize二进制,不需要额外安装组件即可直接配置Post Renderer调用。
内容的提问来源于stack exchange,提问作者g0pher
相关产品推荐
相关产品推荐

