痛点:yaml 复制粘贴
dev / staging / prod 三个环境,几乎一样的 Deployment + Service + Ingress——手动维护三份是地狱。
Helm 解决的是 K8s yaml 的模板化 + 版本化 + 分发。
Chart 结构
mychart/
├── Chart.yaml # 元信息(name / version / appVersion)
├── values.yaml # 默认参数
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ └── _helpers.tpl # 模板片段复用
└── charts/ # 依赖的子 chart
templates/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "mychart.fullname" . }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.appName }}
template:
metadata:
labels:
app: {{ .Values.appName }}
spec:
containers:
- name: app
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
values.yaml(默认值):
appName: webapp
replicaCount: 1
image:
repository: ghcr.io/me/webapp
tag: latest
安装 / 升级 / 回滚
helm install webapp ./mychart # 第一次
helm upgrade webapp ./mychart # 升级
helm upgrade webapp ./mychart -f values-prod.yaml # 用环境特定配置
helm rollback webapp 3 # 回到第 3 个 revision
helm uninstall webapp
helm list
helm history webapp
values 分层
values-dev.yaml:
replicaCount: 1
image: { tag: dev }
values-prod.yaml:
replicaCount: 3
image: { tag: 1.4.2 }
ingress:
hosts: [app.wadely.com]
部署:
helm upgrade --install webapp ./mychart \
-f values.yaml -f values-prod.yaml \
--namespace prod
后面的 values 文件覆盖前面——形成"基础 + 环境差异"的分层。
公共 chart 仓库
社区主流 chart 仓库:
- Artifact Hub — 跨仓库聚合搜索
- Bitnami (postgres / redis / kafka 等明星 chart)
- 各厂商官方(ingress-nginx / cert-manager / Prometheus 等)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install pg bitnami/postgresql -f values.yaml
⚠ 用第三方 chart 前审一遍 values.yaml——默认值可能不安全(弱口令、暴露公网)。
依赖(subcharts)
Chart.yaml:
dependencies:
- name: postgresql
version: 15.x.x
repository: https://charts.bitnami.com/bitnami
helm dependency update
Helm vs Kustomize
社区常争论。简单分:
| 维度 | Helm | Kustomize |
|---|---|---|
| 模式 | 模板({{ }}) |
覆盖(patch) |
| 学习曲线 | 较陡 | 较平 |
| 复杂逻辑 | 强(条件 / 循环) | 弱 |
| 版本化分发 | 强(chart 仓库 / OCI) | 弱(靠 git) |
| 适合场景 | 第三方包分发 / 复杂应用 | 简单的多环境差异 |
很多团队两个一起用:第三方包用 Helm,自家应用用 Kustomize。
Helm v2 → v3
Helm 3 在 2019 年发布,移除了 Tiller(v2 的服务端组件)。今天看到的所有 Helm 教程默认都是 v3。如果遇到提到 Tiller 的资料,那是 v2 时代的——已不适用。
推荐阅读
- Helm 官方文档 — 必读 Chart Template Guide
- Artifact Hub — 找 chart
- Kustomize — Helm 的另一选择
- Helm Best Practices
- Bitnami Charts — 阅读源码学怎么写 chart
下一篇:Service Mesh——什么时候真的需要它。