别再手写一堆 yaml 了:用 Helm 把应用打包成可复用 Chart
【摘要】 K8s 一个应用要写 Deployment/Service/Ingress 好几份 yaml,多环境复制粘贴易错。这篇用 Helm 把应用打包成 Chart,讲清 Chart 结构、values.yaml 抽参数、模板写法和 install/upgrade/rollback,让一套模板多环境复用。
在 K8s 里跑一个应用,少说要写 Deployment、Service、Ingress 三四份 yaml。环境一多(dev/test/prod),复制粘贴改来改去,出错是迟早的事。Helm 就是解决这个的:把应用打包成一个 Chart,参数抽到 values.yaml,模板里用变量渲染,一套模板多环境通用。这篇带你打一个能装的 Chart。

一、Chart 长什么样
helm create mychart 会生成标准骨架,核心就这几样:
mychart/
├── Chart.yaml # 元信息:名称、版本
├── values.yaml # 参数默认值(镜像、副本数、端口…)
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # 公共模板片段
└── charts/ # 依赖的子 chart(可选)
二、参数抽到 values.yaml
所有"因环境而异"的值都放这里:
replicaCount: 2
image:
repository: my-registry/blog-api
tag: "1.4.0"
service:
port: 8080
type: ClusterIP
ingress:
enabled: true
host: blog.example.com
三、模板怎么写
模板是带 Go template 语法的 yaml,{{ .Values.xxx }} 会被渲染成实际值,{{ .Release.Name }} 是每次安装的名字:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-api
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}-api
template:
metadata:
labels:
app: {{ .Release.Name }}-api
spec:
containers:
- name: api
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
切到测试环境只需覆盖参数,不动模板:
helm install blog-test ./mychart \
--set replicaCount=1 \
--set ingress.host=test.blog.example.com
四、常用操作
helm install blog-prod ./mychart -f prod-values.yaml
helm upgrade blog-prod ./mychart -f prod-values.yaml # 改了模板/参数后升级
helm rollback blog-prod 1 # 升坏了回滚到版本1
helm list # 看已发布
helm uninstall blog-prod # 卸载
五、踩过的坑
- 模板缩进错一个空格就渲染失败:yaml 对缩进极敏感,写模板时多用
helm template先本地渲染预览,再 install。 .Values里数字被当字符串:port: 8080在 yaml 是数字,但拼进字符串要{{ .Values.service.port }}没问题;用引号包起来更稳:"{{ .Values.image.tag }}"。- 三大环境都写死在模板:正确做法是一份模板 + 三份
values(dev/test/prod),用-f指定,而不是复制三套 yaml。 - 忘了
--namespace:跨命名空间部署要显式指定,否则装到 default。
| 动作 | 命令要点 |
|---|---|
| 预览渲染 | helm template ./mychart |
| 安装 | helm install <名> ./mychart -f values.yaml |
| 升级 | helm upgrade <名> ./mychart |
| 回滚 | helm rollback <名> <版本> |
小结
Helm 的本质是把"一堆易变的 yaml"变成"一份模板 + 一份参数"。参数(镜像、副本、域名)和模板(结构)分离后,多环境部署就从"复制粘贴改数字"变成"传不同的 values 文件"。配合 helm template 预览和 rollback 兜底,部署 K8s 应用的安全感和可维护性都上了一个台阶。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)