云原生交付(01):Helm 与包管理——Chart 结构、模板、版本管理、多环境部署
更新时间:2026-09-01。本文是
cloud/delivery/云原生交付第 01 篇,在 交付索引下。Helm 是 Kubernetes 的包管理器,把应用打包成 Chart,支持模板渲染、版本回滚、依赖管理。理解 Helm 才能高效管理多环境部署。
本文要回答的问题
- Chart 是什么?Chart 目录结构?
- Helm 模板怎么写?常用函数和语法?
- values.yaml 怎么覆盖配置?多环境怎么管理?
- 依赖管理怎么用?
一、Helm 基础
bash
# Helm 是 K8s 的包管理器
# chart:打包好的应用,包含模板和默认配置
# release:chart 在集群中的一个实例
# repository:chart 仓库,存多个 chart
# 常用命令
helm search repo nginx # 搜索 chart
helm install my-nginx nginx/nginx # 安装
helm list # 列 release
helm upgrade my-nginx nginx/nginx # 升级
helm rollback my-nginx 1 # 回滚到版本 1
helm uninstall my-nginx # 卸载二、Chart 目录结构
my-chart/
├── Chart.yaml # chart 元信息(名称、版本、描述)
├── values.yaml # 默认值
├── values-prod.yaml # 生产环境值(可选)
├── README.md # 说明
├── templates/ # Kubernetes 模板
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # 辅助模板(命名)
│ └── NOTES.txt # 安装后提示
└── charts/ # 依赖 chartChart.yaml:
yaml
apiVersion: v2
name: my-app
version: 1.0.0
appVersion: "1.0.0"
description: "My application"
dependencies:
- name: redis
version: "17.x"
repository: "https://charts.bitnami.com/bitnami"三、模板语法
go
# 模板变量引用
name: {{ .Release.Name }}-my-app
# 从 values.yaml 读取
replicas: {{ .Values.replicas }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
# 条件判断
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
# ...
{{ end }}
# 循环
{{ range .Values.env }}
- name: {{ .name }}
value: {{ .value }}
{{ end }}
# 模板函数
# upper:转大写
# lower:转小写
# trim:去空格
# nindent:缩进
# include:包含模板
# include "my-app.fullname" .
{{ include "my-app.fullname" . | nindent 4 }}
# 管道
image: "{{ .Values.image.repository | default "nginx" }}:{{ .Values.image.tag | default "latest" }}"例子:deployment 模板
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
app: {{ include "my-app.name" . }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ include "my-app.name" . }}
template:
metadata:
labels:
app: {{ include "my-app.name" . }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{ toYaml .Values.resources | indent 12 }}四、多环境部署
yaml
# values.yaml(默认)
replicas: 1
image:
repository: my-app
tag: latest
resources:
requests:
cpu: 100m
memory: 128Mi
# values-dev.yaml(开发环境)
replicas: 1
resources:
requests:
cpu: 50m
memory: 64Mi
# values-prod.yaml(生产环境)
replicas: 3
resources:
requests:
cpu: 500m
memory: 512Mi
ingress:
enabled: true安装不同环境:
bash
# 开发环境
helm install my-app-dev ./my-chart -f values-dev.yaml
# 生产环境
helm install my-app-prod ./my-chart -f values-prod.yaml命令行覆盖值:
bash
# 单个值覆盖
helm install my-app ./my-chart --set replicas=5 --set image.tag=v2.0.0
# 多个值文件,后面的覆盖前面的
helm install my-app ./my-chart -f values.yaml -f values-prod.yaml五、依赖管理
yaml
# Chart.yaml 依赖
dependencies:
- name: redis
version: ">=17.0.0 <18.0.0"
repository: "https://charts.bitnami.com/bitnami"
- name: mysql
version: ">=9.0.0 <10.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: mysql.enabled更新依赖:
bash
# 更新依赖到 charts/ 目录
helm dependency update
# 更新后:
# charts/redis-17.11.3.tgz
# charts/mysql-9.4.0.tgz条件依赖:
yaml
# 用户可以关闭依赖
helm install my-app --set mysql.enabled=false六、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| 模板渲染失败 | 安装报错,语法错误 | helm template --debug 本地测试 |
| 缩进不对 | YAML 语法错误 | 用 indent X 或 nindent X |
| 多环境值覆盖不对 | 后值没有覆盖前值 | values 文件顺序:默认在前,环境配置在后 |
| 依赖版本冲突 | 依赖版本不兼容 | 统一版本范围,升级依赖 |
| 版本回滚不对 | 回滚后配置不对 | 每次升级都生成新版本,版本对应配置 |
相关与延伸
下一篇:CI/CD 流水线——代码→构建→测试→部署、缓存策略、流水线加速、发布策略;K8s 存储,见 存储与 PV/PVC。
一句话总结
Helm 包管理:Chart 是打包格式,包含模板和默认 values;模板用 Go template 语法,支持条件判断、循环、函数;多环境通过多个 values 文件管理,后文件覆盖前文件;依赖管理在 Chart.yaml 定义,helm dependency update 拉取到 charts 目录;常用命令:install/upgrade/rollback/uninstall;本地调试用 helm template --debug 预览渲染结果。