Helm 是 Kubernetes 的包管理工具,类似于 apt 之于 Ubuntu、pip 之于 Python。它帮助你将一组 K8s 资源打包成一个可分发、可版本化的 Chart。
1. 为什么需要 Helm
部署一个复杂应用(如 WordPress)可能需要 Deployment、Service、ConfigMap、Secret、PersistentVolumeClaim、Ingress 等多个 YAML 文件。Helm 可以将这些文件打包成一个 Chart,一键安装、升级、回滚。
- 模板化 — 用模板 + values.yaml 实现不同环境的差异化部署
- 依赖管理 — Chart 可以依赖其他 Chart(如 WordPress 依赖 MySQL)
- 一键安装 —
helm install一次部署整个应用栈 - 版本与回滚 — 自动记录发布历史,一键回滚
2. 安装 Helm
# 下载官方安装脚本
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
# 验证安装
helm version
Helm 3 移除了 Tiller 服务端组件,不再需要初始化操作,安全模型更简单。
3. 基础操作
3.1 添加仓库
# 添加官方稳定仓库
helm repo add stable https://charts.helm.sh/stable
# 添加 Bitnami 仓库(常用)
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新仓库缓存
helm repo update
# 搜索 Chart
helm search repo nginx
helm search repo mysql --max-col-width 30
3.2 安装第一个应用
# 安装 Nginx
helm install my-nginx bitnami/nginx
# 查看 Release 列表
helm list
# 查看 Release 状态
helm status my-nginx
3.3 自定义参数
# 通过 --set 命令行覆盖参数
helm install my-nginx bitnami/nginx \
--set service.type=NodePort \
--set replicaCount=2
# 通过 values.yaml 文件覆盖参数
helm install my-nginx bitnami/nginx -f my-values.yaml
3.4 升级与回滚
# 升级(更新镜像或参数)
helm upgrade my-nginx bitnami/nginx --set replicaCount=3
# 查看发布历史
helm history my-nginx
# 回滚到上一版本
helm rollback my-nginx
# 回滚到指定版本
helm rollback my-nginx 1
4. 核心概念
| 概念 | 说明 |
|---|---|
| Chart | Helm 包的基本单位,包含模板、默认值、元数据 |
| values.yaml | Chart 的默认参数值 |
| Release | Chart 的一个运行实例,每次 install 创建一个 |
| Repository | Chart 的存储仓库 |
| Template | 使用 Go template 语法的 K8s 资源模板 |
5. 编写自定义 Chart
5.1 创建 Chart 骨架
helm create myapp
# myapp/
# ├── Chart.yaml # Chart 元数据
# ├── values.yaml # 默认值
# ├── charts/ # 依赖 Chart
# └── templates/ # 模板文件
# ├── deployment.yaml
# ├── service.yaml
# ├── ingress.yaml
# └── _helpers.tpl
5.2 Chart.yaml
apiVersion: v2
name: myapp
description: 我的应用 Helm Chart
type: application
version: 0.1.0 # Chart 版本
appVersion: "1.25" # 应用版本(如 Nginx 版本)
5.3 templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "myapp.fullname" . }}
labels:
{{- include "myapp.labels" . | nindent 4 }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{- include "myapp.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "myapp.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
5.4 values.yaml
replicaCount: 2
image:
repository: nginx
tag: "1.25"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
5.5 测试与打包
# 语法检查(不实际部署)
helm lint myapp/
# 模拟安装,查看生成的 K8s 资源
helm install myapp myapp/ --dry-run --debug
# 实际安装
helm install myapp-release myapp/
# 打包成 tgz
helm package myapp/
6. 常用 Helm 命令速查
| 命令 | 说明 |
|---|---|
| helm search repo <keyword> | 搜索仓库中的 Chart |
| helm install <release> <chart> | 安装 Chart |
| helm upgrade <release> <chart> | 升级 Release |
| helm uninstall <release> | 卸载 Release |
| helm list | 列出所有 Release |
| helm history <release> | 查看发布历史 |
| helm rollback <release> <revision> | 回滚到指定版本 |
| helm pull <chart> | 下载 Chart 到本地 |
7. 完整部署流程
# 1. 添加仓库并更新
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
# 2. 查看可配置参数
helm show values bitnami/nginx
# 3. 生成默认 values.yaml 并修改
helm show values bitnami/nginx > my-values.yaml
vim my-values.yaml # 按需修改
# 4. 安装
helm install my-nginx bitnami/nginx -f my-values.yaml
# 5. 验证
helm status my-nginx
kubectl get pods,svc -l app.kubernetes.io/name=nginx
# 6. 升级
helm upgrade my-nginx bitnami/nginx -f my-values.yaml
# 7. 卸载
helm uninstall my-nginx