技术文章2026 年 7 月 21 日约 3 分钟

Kubernetes Helm 配置:用 values 管理多环境发布

用 Helm 管理多环境发布:模板化消除重复,values 承载差异,保持 Chart 直白可维护。

手写 N 份几乎一样的 Deployment YAML 是 K8s 运维的第一大痛点。Helm 把 YAML 模板化,一份 Chart 配多个 values 文件,就能管 dev/test/prod。但 Helm 也是把双刃剑:模板写复杂了,没人能看懂。这篇文章讲怎么用,以及怎么保持克制。

#最小 Chart 结构

text
charts/demo-api/
├── Chart.yaml          # 名称、版本、依赖
├── values.yaml         # 默认值
└── templates/
    ├── deployment.yaml
    ├── service.yaml
    └── _helpers.tpl    # 公共模板片段

templates/deployment.yaml 里用模板指令引用 values:

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "demo-api.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          resources:
            {{- toYaml .Values.resources | nindent 12 }}

{{ .Values.xxx }} 取 values 里的值,toYaml ... | nindent 12 把嵌套结构原样渲染并缩进——这是渲染多行配置(resources、affinity)的标准写法。include "demo-api.fullname" . 生成规范命名,避免每个模板各写各的名字。

#多环境:values 文件分层

yaml
# values.yaml(默认,开发)
replicaCount: 1
image:
  repository: ghcr.io/acme/demo-api
  tag: dev
resources:
  requests: {cpu: 50m, memory: 64Mi}
  limits: {cpu: 200m, memory: 256Mi}

# values-prod.yaml(覆盖生产)
replicaCount: 3
image:
  tag: 1.2.0
resources:
  requests: {cpu: 200m, memory: 256Mi}
  limits: {cpu: 1, memory: 1Gi}

发布时 -f 叠加 values 文件(后写的覆盖先写的):

bash
helm lint ./charts/demo-api                      # 语法检查
helm template demo-api ./charts/demo-api -f values-prod.yaml   # 渲染看结果
helm upgrade --install demo-api ./charts/demo-api \
  -n production --create-namespace -f values-prod.yaml

发布前必须 helm template 看一眼渲染结果。我见过不止一次:values 里某个键拼错,Helm 不报错,渲染出来的 YAML 静默缺了字段,kubectl apply 才暴露。template 一眼能看出 replicas 是不是 3、镜像 tag 对不对。

#模板别写成天书

Helm 的模板函数很强大,但越强大越要克制。我的原则:

  • 模板里只做「取值 + 简单的条件/循环」:{{- if .Values.autoscaling.enabled }}、{{- range .Values.extraEnv }}。
  • 业务逻辑放应用代码,不放模板。有人用 Helm 模板实现复杂的配置计算,Chart 变成没人敢动的黑盒。
  • 常用片段抽进 _helpers.tpl(如 fullname、labels),保持各模板一致。
  • helm lint 和 helm template 进 CI,合并前就挡住低级错误。

#Secret 别放进 values

values 文件通常进 Git,所以里面不能放真实密码。两个选择:

  • 敏感配置用 valueFrom.secretKeyRef 引用集群里已有的 Secret,values 里只放 Secret 名。
  • 用 External Secrets Operator / Vault 把外部密钥同步成集群 Secret,Helm 只管引用。

我在项目里见过 values-prod.yaml 里躺着数据库明文口令,原因是「先跑起来再说」。等它被同步到公共 Git 仓库,就变成了安全事件。values 里出现任何明文凭据,都按事故处理。

#回滚和版本管理

Helm 每次 upgrade 都会记录一个 release 版本:

bash
helm history demo-api -n production
helm rollback demo-api <revision> -n production
helm get values demo-api -n production   # 看当前生效的 values

发布前把 Chart 版本、values 文件、镜像版本三者一起记录(比如写进 release notes),回滚时才能回答「上一版到底是什么配置」。Helm 默认保留最近 10 个 release 记录,--history-max 可以调。

#经验

Helm 的正确用法是「用模板消除重复,不消除差异」:环境差异(副本数、资源、镜像 tag、域名)进 values,结构差异(有没有 HPA、有没有 ingress)用 if 条件控制,剩下的全部保持直白。Chart 是给人维护的,不是展示模板技巧的。如果发现 Chart 里某个表达式要读三遍才懂,那就是过度设计了。

写于 2026 年 7 月 21 日

栏目
技术文章
约
3 分钟
字数
2.4K
阅读
206

本文为原创记录,转载请注明出处。如果这篇替你省了时间,欢迎留言说说你踩到的坑。

同题 · related

留言 · remarks

00 条

还没有留言,来说点什么吧。

Kubernetes Helm 配置:用 values 管理多环境发布 · LXH·BLOG