别再手写一堆 yaml 了:用 Helm 把应用打包成可复用 Chart

举报
茉莉风铃 发表于 2026/09/24 10:43:38 2026/09/24
【摘要】 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。
image.png

一、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)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。