Chapter 01

Helm 简介与快速开始

理解 K8s 直接管理 YAML 的痛点,掌握 Helm 三大核心概念 Chart/Release/Repository,安装 Helm CLI 并完成第一个应用部署。

Kubernetes 部署的痛点

假设你要在 K8s 上部署一个完整的 WordPress 应用,需要手写以下 YAML 文件:

WordPress 所需资源

  • Deployment(WordPress)
  • Deployment(MySQL)
  • Service(WordPress)
  • Service(MySQL)
  • Ingress
  • PersistentVolumeClaim × 2
  • Secret(数据库密码)
  • ConfigMap
  • ServiceAccount
  • HorizontalPodAutoscaler

没有 Helm 时的困境

  • 10+ 个 YAML 文件散落各处
  • dev/staging/prod 环境需要维护三套
  • 版本更新需要手动 diff 比较
  • 没有安装/卸载的原子操作
  • 无法追踪"当前集群里装了什么"
  • 回滚需要手动记录旧配置
YAML 地狱

这还只是一个简单的 WordPress。一个典型的微服务系统可能包含 20+ 个服务,每个服务 5-10 个 K8s 资源,共计 100-200 个 YAML 文件。手工维护这些文件是一场噩梦。

Helm 的解决方案

Helm 是 Kubernetes 的包管理器,类比 Linux 的 apt/yum 或 Node.js 的 npm。它将一组相关的 K8s YAML 文件打包为 Chart,通过 Go 模板实现参数化配置,用 Release 跟踪每次安装。

Helm 工作原理

  开发者                    Helm CLI                 Kubernetes
                                                        
     ├─ helm install myapp ──►  │  渲染模板               
        values.yaml              (Go Template)          
                               ├──── kubectl apply ─────►│  创建资源
                                                        
                                 记录 Release 历史       
                                 (存入 K8s Secret)      
                                                        
     ├─ helm rollback myapp 1 ► │  读取历史 Release        
                               ├──── 还原旧版 YAML ──────►│  回滚资源
                                                        

三大核心概念

Chart
Helm 的"包"。一个 Chart 是描述一组相关 K8s 资源的文件集合,包含 YAML 模板、默认配置值(values.yaml)和元数据(Chart.yaml)。可以把它类比为 npm 的 package.json + 源代码。
Release
Chart 在集群中的一次安装实例。同一个 Chart 可以在同一集群安装多次(不同 Release 名称),例如 mysql-dev 和 mysql-prod。每个 Release 都有独立的历史版本记录。
Repository(仓库)
存储和分发 Chart 的服务器。类似 Docker Registry 存储镜像。官方推荐使用 Artifact Hub 搜索公共 Chart,企业可自建 Chart Museum 或使用 OCI 注册表。
Values
传递给 Chart 模板的配置参数。Chart 自带 values.yaml 定义默认值,安装时可通过 --set 或 --values/-f 覆盖。这使同一个 Chart 能适配不同环境。
Template
Chart 中使用 Go 模板语法编写的 K8s YAML 文件(存放在 templates/ 目录)。helm install 时,Helm 用 Values 渲染模板,生成最终的 K8s 资源清单。

Helm 2 vs Helm 3:废除 Tiller

Helm 3 于 2019 年 11 月发布,移除了 Helm 2 中饱受诟病的服务端组件 Tiller

特性Helm 2Helm 3(当前版本)
服务端组件 需要在集群内安装 Tiller Pod 无服务端,纯客户端
安全性 Tiller 默认拥有 cluster-admin 权限,安全风险大 使用 kubeconfig 的用户权限,更安全
Release 存储 存储在 Tiller 所在 Namespace 的 ConfigMap 存储在 Release 所在 Namespace 的 Secret
CRD 处理 需要手动处理 crds/ 目录自动安装
命名空间支持 Tiller 管理所有 Namespace Release 属于指定 Namespace
JSON Schema 验证 不支持 支持 values.schema.json
Helm 2 已停止维护

Helm 2 于 2020 年 11 月停止支持。如果你还在使用 Helm 2,请务必迁移到 Helm 3。本教程仅覆盖 Helm 3。

安装 Helm CLI

Helm 是纯客户端工具,只需下载一个二进制文件即可。

# macOS(推荐 Homebrew)
brew install helm

# Linux(官方安装脚本)
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod +x get_helm.sh
./get_helm.sh

# Windows(Chocolatey)
choco install kubernetes-helm

# 验证安装
helm version
# 输出:version.BuildInfo{Version:"v3.14.0", ...}

添加 Chart 仓库

# 添加官方 Bitnami 仓库(包含 1000+ 高质量 Chart)
helm repo add bitnami https://charts.bitnami.com/bitnami

# 添加 Ingress-Nginx 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 更新本地仓库索引缓存
helm repo update

# 查看已添加的仓库
helm repo list

# 在仓库中搜索 Chart
helm search repo nginx

# 在 Artifact Hub(公共注册表)搜索
helm search hub wordpress
Artifact Hub

artifacthub.io 是 CNCF 托管的公共 Chart 搜索平台,汇聚了来自数百个仓库的 Chart。搜索任何软件(如 redis、postgresql、grafana)都能找到对应的 Helm Chart。

helm install:部署第一个 Chart

# 语法:helm install [release名称] [chart名称] [flags]

# 安装 nginx(使用 bitnami 仓库)
helm install my-nginx bitnami/nginx

# 指定 Namespace 安装(Namespace 必须已存在)
helm install my-nginx bitnami/nginx --namespace web --create-namespace

# 安装时覆盖 values
helm install my-nginx bitnami/nginx \
  --set replicaCount=2 \
  --set service.type=ClusterIP

# 查看安装结果
helm list
helm status my-nginx

# 查看 Chart 可配置的所有 values
helm show values bitnami/nginx

# 卸载
helm uninstall my-nginx

helm search:探索 Chart

# 搜索仓库中的 Chart(已添加的仓库)
helm search repo redis

# 查看所有可用版本
helm search repo bitnami/redis --versions

# 查看 Chart 详细信息
helm show chart bitnami/redis

# 查看 Chart 的 README
helm show readme bitnami/redis

# 查看所有信息(chart + values + readme)
helm show all bitnami/redis
实战:部署 PostgreSQL

尝试使用以下命令在本地 minikube 或 kind 集群部署 PostgreSQL:

# 创建命名空间
kubectl create namespace database

# 查看可配置的 values
helm show values bitnami/postgresql | head -60

# 安装 PostgreSQL
helm install pg bitnami/postgresql \
  --namespace database \
  --set auth.postgresPassword=mypassword \
  --set primary.persistence.size=5Gi

# 查看部署状态
helm status pg --namespace database
kubectl get pods -n database

# 验证数据库可访问
kubectl exec -it -n database pg-postgresql-0 -- psql -U postgres

核心术语速查

Chart
Helm 应用包。包含模板(templates/)、默认值(values.yaml)和元数据(Chart.yaml)。类比 npm 包或 apt 软件包。
Release
Chart 在 K8s 集群中的一次安装实例。有唯一名称,记录完整安装历史,支持升级和回滚。
Repository
Chart 的存储和分发服务器。公共仓库如 Artifact Hub,私有仓库如 Chart Museum 或 OCI Registry。
Values
Chart 的配置参数,在 values.yaml 中定义默认值,安装/升级时可覆盖。是 Helm 实现多环境部署的核心机制。
Template
templates/ 目录下的 Go 模板文件,Helm 渲染后生成 K8s YAML。可以引用 Values 和内置对象(.Release、.Chart 等)。
Revision
Release 的版本号,从 1 开始递增。每次 helm upgrade 都会产生新 Revision,helm rollback 可以回退到指定 Revision。
Artifact Hub
CNCF 托管的公共 Helm Chart 发现平台(artifacthub.io)。聚合了来自社区的数千个 Chart,可搜索、查看说明和配置参数。
本章小结

Helm 通过 Chart 打包、Values 参数化和 Release 历史管理解决了 K8s 大量 YAML 难以维护的痛点。Helm 3 废除了 Tiller,成为纯客户端工具,安全性和简洁性大幅提升。掌握 helm repo add/update、helm search、helm install/uninstall 是 Helm 使用的基础。下一章将深入 Chart 的内部结构。