一、Helm 是什么?为什么需要它?
K8s 是强大的容器编排平台,但部署复杂应用时(如包含 Web 服务、数据库、缓存等多个组件的系统),需要编写大量 YAML 文件,管理成本高。Helm 就是为简化 K8s 应用部署而生的工具,它被称为 “K8s 的包管理器”,类似 Ubuntu 的apt
或 Mac 的brew
。
二、Helm 如何工作?核心概念解析
Chart(图表)
- Helm 的基本单位,是一组 YAML 文件的集合,描述了一个或多个 K8s 资源(如 Deployment、Service、ConfigMap 等)。
- 类比:一个 Chart 就像手机应用商店里的 “APP 安装包”,包含了应用运行所需的所有组件和配置。
Release(发布)
- Chart 的实例化结果。同一个 Chart 可以在集群中部署多次,每次部署都是一个 Release,就像同一 APP 可以在多部手机上安装,每个安装都是独立的。
Values(配置值)
- 用于自定义 Chart 的参数。例如,Chart 中定义了数据库密码为变量,通过 Values 可以传入实际密码,避免硬编码。
- 类比:安装 APP 时的 “个性化设置”,如选择安装路径、是否创建桌面图标等。
三、Helm vs 直接使用 kubectl:优势在哪?
场景 | 直接用 kubectl | 用 Helm |
---|---|---|
复杂应用部署 | 需要手动编写 / 管理多个 YAML 文件,易出错。 | 一键安装预定义的 Chart,自动处理依赖关系。 |
配置管理 | 配置硬编码在 YAML 中,难以复用和修改。 | 通过 Values 文件灵活配置,支持环境变量。 |
版本控制 | 手动记录 YAML 变更,回滚困难。 | 自动记录 Release 历史,支持一键回滚到任意版本。 |
依赖管理 | 需要手动确保组件顺序(如先部署 DB 再部署 APP) | Chart 中定义依赖关系,自动按顺序部署。 |
四、实战案例:用 Helm 部署 WordPress
假设你想部署一个 WordPress 博客,包含 Web 服务和 MySQL 数据库:
- 不用 Helm:需要编写至少 4 个 YAML 文件(WordPress Deployment、Service,MySQL StatefulSet、PVC),还要处理数据库初始化、密码配置等细节。
- 用 Helm:只需一行命令:
bash
helm repo add bitnami https://charts.bitnami.com/bitnami # 添加官方仓库 helm install my-blog bitnami/wordpress # 安装WordPress Chart
Helm 会自动:- 创建 MySQL 数据库并配置持久化存储;
- 部署 WordPress 应用并连接到数据库;
- 生成随机密码并保存为 Secret;
- 创建 Service 暴露 WordPress 服务。
五、Helm 的进阶能力:模板与钩子
模板引擎
- Helm 使用 Go 模板语言,允许在 Chart 中定义动态配置。例如:
# values.yaml replicas: 3 # deployment.yaml replicas: {{ .Values.replicas }} # 自动从values中获取值
- 类比:手机 APP 安装时的 “自定义选项”,如选择安装语言、分辨率等。
- Helm 使用 Go 模板语言,允许在 Chart 中定义动态配置。例如:
钩子(Hooks)
- 允许在特定阶段执行自定义操作,如部署前执行数据库迁移、删除前备份数据等。
- 类比:手机 APP 安装前的 “权限申请” 或卸载前的 “数据备份提示”。
一、Helm 安装准备
1. 安装 Helm 客户端
- macOS(使用 Homebrew):
brew install helm
- Linux(使用脚本):
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
- Windows(使用 Chocolatey):
choco install kubernetes-helm
2. 验证安装
helm version
# 输出类似:version.BuildInfo{Version:"v3.12.0", ...}
二、使用 Helm 安装应用
1. 添加官方仓库
Helm 通过 仓库(Repository) 管理 Charts,类似 npm 或 Maven 的仓库:
helm repo add bitnami https://charts.bitnami.com/bitnami # 添加 Bitnami 官方仓库
helm repo update # 更新仓库索引
2. 搜索可用 Charts
helm search repo wordpress # 搜索 WordPress 相关 Charts
# 输出类似:
# NAME CHART VERSION APP VERSION DESCRIPTION
# bitnami/wordpress 15.0.0 6.2.2 WordPress is the world's most popular blogging ...
3. 安装 Chart
以安装 WordPress 为例:
helm install my-blog bitnami/wordpress # 安装名为 my-blog 的 WordPress 实例
- 关键参数:
--version 15.0.0
:指定 Chart 版本--values my-values.yaml
:使用自定义配置文件--set service.type=LoadBalancer
:临时覆盖配置值
4. 查看安装状态
helm list # 查看所有已安装的 Releases
helm status my-blog # 查看特定 Release 的详细信息
kubectl get pods # 验证 Pod 是否正常运行
三、自定义配置(Values 文件)
1. 创建自定义 Values 文件
复制默认配置并修改:
helm show values bitnami/wordpress > my-values.yaml
vi my-values.yaml # 编辑配置,例如修改数据库密码、服务类型等
2. 使用自定义配置安装
bash
helm install my-blog bitnami/wordpress -f my-values.yaml
3. 常见配置示例
# my-values.yaml
wordpressUsername: admin
wordpressPassword: my-strong-password # 自定义 WordPress 密码
service:
type: NodePort # 将服务类型改为 NodePort
persistence:
size: 20Gi # 增加持久化存储大小
四、升级与回滚应用
1. 升级应用
helm upgrade my-blog bitnami/wordpress --set wordpressPassword=new-password # 升级并修改密码
2. 查看历史版本
helm history my-blog
# 输出类似:
# REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
# 1 Mon Jul 10 12:00:00 2023 superseded wordpress-15.0.0 6.2.2 Install complete
# 2 Mon Jul 10 12:30:00 2023 deployed wordpress-15.1.0 6.2.2 Upgrade complete
3. 回滚到指定版本
helm rollback my-blog 1 # 回滚到版本 1
五、管理 Helm 仓库
1. 添加自定义仓库
helm repo add my-repo https://my-company.com/charts
2. 查看已添加的仓库
helm repo list
3. 更新仓库索引
helm repo update # 每次使用前建议更新
六、创建自己的 Chart
1. 初始化 Chart 项目
helm create my-app # 创建名为 my-app 的 Chart 模板
2. Chart 目录结构
my-app/
├── charts/ # 依赖的子 Charts
├── templates/ # YAML 模板文件
│ ├── deployment.yaml
│ ├── service.yaml
│ └── _helpers.tpl # 模板辅助函数
├── Chart.yaml # Chart 元数据(名称、版本等)
└── values.yaml # 默认配置值
3. 编写模板(示例)
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-app
spec:
replicas: {{ .Values.replicas }} # 从 values.yaml 获取副本数
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.service.port }}
4. 打包 Chart
helm package my-app # 生成 my-app-0.1.0.tgz 包
5. 安装本地 Chart
helm install my-release ./my-app
七、常用 Helm 命令速查表
命令 | 作用 |
---|---|
helm install release chart |
安装 Chart 为一个 Release |
helm upgrade release chart |
升级 Release |
helm uninstall release |
卸载 Release |
helm search repo keyword |
在仓库中搜索 Chart |
helm show values chart |
查看 Chart 的默认配置值 |
helm dependency update chart |
更新 Chart 的依赖 |
helm lint chart |
检查 Chart 语法错误 |
helm template chart |
渲染 Chart 模板(不安装) |
八、最佳实践
- 使用 Values 文件:避免在命令行中使用大量
--set
参数,将配置保存在文件中便于版本控制。 - 命名规范:Release 名称和 Chart 名称保持语义化(如
my-prod-api
)。 - 版本控制:将自定义 Values 文件和 Chart 代码纳入 Git 管理。
- 测试先行:使用
helm install --dry-run
预渲染模板,确保配置正确。 - 清理不再使用的 Releases:定期
helm uninstall
不再需要的应用。
总结:Helm 是 K8s 的 “应用增强器”
- Helm 的定位:简化 K8s 应用的部署、升级和管理,尤其适合复杂的分布式系统。
- 与 K8s 的关系:K8s 提供容器编排能力,Helm 提供应用层面的封装和管理,二者结合就像 “操作系统”+“应用商店”,让用户更高效地使用 K8s。
通过 Helm,开发者可以将精力集中在业务逻辑上,而不是复杂的 K8s 配置,真正实现 “一键部署,全家无忧”!