痛点: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 时代的——已不适用。

推荐阅读

下一篇:Service Mesh——什么时候真的需要它。