一、背景
官网: https://helm.sh/
我们针对K8S环境中,部署对应的应用,无外乎就是编写一堆yaml资源清单文件. 资源清单、依赖性少的时候,可以直接手动维护。但是,随着资源清单越来越复杂,越来越多,不同的环境切换不同的资源清单配置,如果还是手动维护,那将会是一场运维灾难。
没有Helm之前的问题:
1、手动管理YAML文件:需要手动编写和维护大量YAML文件,容易出错
2、缺乏标准化:各团队有自己的部署方式,难以统一管理
3、部署流程复杂:需要按特定顺序创建资源,容易遗漏步骤
4、环境差异处理困难:不同环境的配置需要手动修改或维护多套文件
5、回滚机制不完善:需要手动记录变更并反向操作才能回滚
Helm 是 Kubernetes 的包管理工具,相当于 Linux 系统中的 apt/yum 或 macOS 中的 homebrew。它通过将 Kubernetes 应用打包成可复用的单元(称为 Chart),简化了复杂应用的部署和管理流程。
Helm的核心原理就是: 使用go template模板语法,嵌入到K8S的资源清单yaml文件中,为yaml资源清单文件提供了动态编程能力的工具,动态生成最终部署的yaml清单文件。 并且还支持了repo仓库机制生态、依赖声明等功能。
在Kubernetes生态系统中,Helm的出现主要解决了以下几个核心问题:
1、应用管理的复杂性:Kubernetes原生资源文件(YAML)在管理复杂应用时变得冗长且难以维护,特别是当应用由多个组件组成时。
2、配置管理的挑战:没有标准化的方式来管理不同环境的配置(开发、测试、生产),导致大量重复或轻微修改的YAML文件。
3、版本控制的缺失:缺乏应用级别的版本控制机制,难以回滚到特定版本。
4、共享和复用困难:没有统一的方式打包和共享Kubernetes应用模板,各团队重复造轮子。
二、Helm核心概念
1、Chart
Chart是Helm的应用打包格式,包含了一组Kubernetes资源文件的模板和配置。Chart的结构如下:
mychart/Chart.yaml # Chart的元数据文件values.yaml # 默认配置值charts/ # 依赖的子Charttemplates/ # 模板目录deployment.yaml # 部署模板service.yaml # 服务模板... # 其他Kubernetes资源模板
类比docker里面的镜像image。
2、Release
Release是Chart在Kubernetes集群中的一次部署实例。同一个Chart可以多次安装到同一集群,每次安装都会创建一个新的Release。
类比docker当做的容器。 同一个namespace只能部署唯一名称的release, release名称不同,则可以部署多个不同的release。 (除非nodeport等端口冲突)
3、Repository (Repo)
Chart仓库是存放和共享Chart的地方。Helm客户端可以连接多个仓库来查找和下载Chart。
类比docker当中的镜像仓库, Chart也有自己的仓库进行存储,方便分发、拉取。
三、Helm常用命令
1. Chart相关命令
# 创建新Chart
helm create mychart# 打包Chart
helm package mychart# 检查Chart语法
helm lint mychart# 查看Chart模板渲染结果(不实际部署)
helm template mychart# 验证Chart是否安装成功(dry-run模式)
helm install --dry-run myrelease mychart
2. Repository相关命令
# 添加Chart仓库
helm repo add bitnami https://charts.bitnami.com/bitnami# 列出已配置的仓库
helm repo list# 更新本地仓库缓存
helm repo update# 搜索Chart
helm search repo nginx# 移除仓库
helm repo remove bitnami
3. Release相关命令
# 安装Release
helm install myrelease mychart# 列出已安装的Release
helm list# 查看Release状态
helm status myrelease# 升级Release
helm upgrade myrelease mychart# 回滚Release
helm rollback myrelease 1# 卸载Release
helm uninstall myrelease# 查看Release历史
helm history myrelease
四、实战示例
1、创建并部署一个简单的Chart
# 创建新Chart
helm create myapp# 编辑Chart配置
cd myapp
vim values.yaml # 修改副本数、镜像等配置# 安装Chart
helm install myapp-release ./myapp# 检查部署状态
kubectl get pods
helm status myapp-release
2、使用外部Chart部署应用
# 添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami# 搜索nginx Chart
helm search repo nginx# 安装nginx
helm install my-nginx bitnami/nginx# 自定义配置安装
helm install my-nginx bitnami/nginx --set service.type=LoadBalancer,replicaCount=2
3、高级配置示例
创建自定义values.yaml:
# custom-values.yaml
replicaCount: 3
image:repository: nginxtag: "1.21.0"pullPolicy: IfNotPresent
service:type: NodePortport: 80
然后使用自定义值安装:
helm install -f custom-values.yaml my-nginx bitnami/nginx
4、最佳实践
-
版本控制:将Chart和values文件纳入版本控制系统
-
环境分离:为不同环境(dev/staging/prod)维护不同的values文件
-
模板测试:使用
helm template
和--dry-run
测试模板渲染 -
依赖管理:明确声明Chart依赖关系
-
安全实践:只使用可信的Chart仓库,审查第三方Chart
-
资源命名:使用
.Release.Name
作为资源名前缀确保唯一性 -
配置默认值:为模板参数提供合理的默认值
五、总结
Helm作为Kubernetes的包管理器,极大地简化了复杂应用的部署和管理。通过模板化、版本控制和依赖管理等特性,Helm为Kubernetes应用提供了类似于Linux包管理工具的体验。掌握Helm不仅可以提高部署效率,还能实现配置的标准化和可重复性,是Kubernetes生态中不可或缺的工具。
可以方便我们直接部署和使用,也可以支持快速安装、快速回滚。
核心原理:
使用go template模板语法,嵌入到K8S的资源清单yaml文件中,为yaml资源清单文件提供了动态编程能力的工具,动态生成最终部署的yaml清单文件。 并且还支持了repo仓库机制生态、依赖声明等功能。