Kubernetes Helm 配置:用 values 管理多环境发布
用 Helm 管理多环境发布:模板化消除重复,values 承载差异,保持 Chart 直白可维护。
手写 N 份几乎一样的 Deployment YAML 是 K8s 运维的第一大痛点。Helm 把 YAML 模板化,一份 Chart 配多个 values 文件,就能管 dev/test/prod。但 Helm 也是把双刃剑:模板写复杂了,没人能看懂。这篇文章讲怎么用,以及怎么保持克制。
#最小 Chart 结构
charts/demo-api/
├── Chart.yaml # 名称、版本、依赖
├── values.yaml # 默认值
└── templates/
├── deployment.yaml
├── service.yaml
└── _helpers.tpl # 公共模板片段templates/deployment.yaml 里用模板指令引用 values:
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 文件分层
# 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 文件(后写的覆盖先写的):
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 版本:
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
- DevOps 运维中 AI 那些事把 AI 放进运维的真实分工:从服务器硬件、网络、GPU、内存,到虚拟化、Kubernetes、应用构建、CI/CD、可观测性、资源分配,再到 AI 自身的部署与算力调度。讲清楚哪些活它能接、边界划在哪、以及我踩过的那些坑。
- ArgoCD 实战:用 GitOps 把 CI/CD 部署搬进 Kubernetes从安装、Application 声明到 App of Apps 与 CI 配合,把 GitOps 部署体系在 Kubernetes 上落地,并复盘真实事故。
- Kubernetes 滚动发布与回滚:保障 CI/CD 变更安全滚动发布、暂停继续与回滚的标准动作,以及一次真实发布事故的完整复盘。
留言 · remarks
00 条还没有留言,来说点什么吧。