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. 核心概念

概念说明
ChartHelm 包的基本单位,包含模板、默认值、元数据
values.yamlChart 的默认参数值
ReleaseChart 的一个运行实例,每次 install 创建一个
RepositoryChart 的存储仓库
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