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 比较
- 没有安装/卸载的原子操作
- 无法追踪"当前集群里装了什么"
- 回滚需要手动记录旧配置
这还只是一个简单的 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 ──────►│ 回滚资源 │ │ │
三大核心概念
Helm 2 vs Helm 3:废除 Tiller
Helm 3 于 2019 年 11 月发布,移除了 Helm 2 中饱受诟病的服务端组件 Tiller。
| 特性 | Helm 2 | Helm 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 于 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
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
尝试使用以下命令在本地 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
核心术语速查
Helm 通过 Chart 打包、Values 参数化和 Release 历史管理解决了 K8s 大量 YAML 难以维护的痛点。Helm 3 废除了 Tiller,成为纯客户端工具,安全性和简洁性大幅提升。掌握 helm repo add/update、helm search、helm install/uninstall 是 Helm 使用的基础。下一章将深入 Chart 的内部结构。