Helm 包管理器:Kubernetes 应用分发与模板化
Helm 包管理器:Kubernetes 应用分发与模板化
Helm 是 Kubernetes 生态中的包管理器,类似于 CentOS 的 yum 或 Ubuntu 的 apt。它解决了复杂应用的部署、升级与管理难题,通过 Chart 将一组 Kubernetes 资源定义封装为可复用、可参数化的软件包,实现一键分发、模板化部署和版本控制。
什么是 Helm?
在没有 Helm 时,部署一个应用需要手动维护多个 YAML 文件(Deployment、Service、ConfigMap等),环境差异导致配置散落,版本追踪困难。Helm 提供了:
- 应用分发:将 K8s 资源打包为 Chart,通过仓库共享。
- 模板化:抽离可变参数,通过
values.yaml注入,实现“一份代码,多环境部署”。 - 生命周期管理:通过 Release 跟踪每次安装、升级、回滚的状态。
Helm 由 CNCF 维护,是生产环境中 Kubernetes 应用交付的事实标准。
核心概念
理解 Helm 必须掌握以下四个核心概念:
-
Chart
包含创建 Kubernetes 应用所需全部资源定义的 包。Chart 是一个目录,内有自描述文件(Chart.yaml)、模板(templates/)和默认值(values.yaml)。 -
Repository
存放和共享 Chart 的 仓库。官方维护了https://hub.helm.sh(现已重定向至 Artifact Hub),也可以自建私有仓库。 -
Release
在 Kubernetes 集群上运行的一个 Chart 实例。通过helm install创建,同一 Chart 可安装多个 Release(如dev-mysql和prod-mysql)。 -
Values
可配置参数,用于填充模板中的占位符。通过values.yaml文件默认值,安装时可用--set或自定义 values 文件覆盖,实现环境差异化。
安装 Helm
Helm 采用客户端-服务端架构,Helm v3 移除了 Tiller 服务端,仅需安装客户端二进制文件即可。
Linux / macOS(脚本安装)
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
Windows(包管理)
# Chocolatey
choco install kubernetes-helm
# Scoop
scoop install helm
验证安装
helm version --short
确保已配置好 kubectl 上下文且能访问目标集群,Helm 将自动使用当前上下文。
使用 Helm 仓库
添加官方仓库
# 添加 Bitnami 仓库(常用 Chart 来源)
helm repo add bitnami https://charts.bitnami.com/bitnami
# 更新本地仓库缓存
helm repo update
搜索 Chart
helm search repo bitnami/mysql
# 列出仓库中所有 Chart
helm search repo bitnami
查看 Chart 详细信息
helm show chart bitnami/mysql
helm show readme bitnami/mysql
helm show values bitnami/mysql # 所有可用配置项
安装和管理 Release
安装 Release
# 基本安装,Release 名为 my-app
helm install my-app bitnami/nginx
# 指定命名空间
helm install my-app bitnami/nginx -n production
# 使用自定义 values 文件
helm install my-app bitnami/nginx -f custom-values.yaml
# 命令行直接设置个别值
helm install my-app bitnami/nginx --set service.type=NodePort
安装成功后,命令会输出访问信息、状态说明。
查看 Release
# 列出当前命名空间下的 Release
helm list
# 查看指定 Release 的详细信息(包括部署资源和用户自定义 Values)
helm get all my-app
# 查看 Values 配置
helm get values my-app
升级 Release
修改 values.yaml 或使用 --set 后执行升级:
helm upgrade my-app bitnami/nginx -f new-values.yaml
升级会触发资源更新,并自动保存历史版本以便回滚。
回滚 Release
# 查看历史版本
helm history my-app
# 回滚到上一个版本
helm rollback my-app
# 回滚到指定 REVISION
helm rollback my-app 2
卸载 Release
helm uninstall my-app
# 保留历史记录以便审计(默认保留)
# 彻底清除记录:--no-hooks 禁用钩子,--keep-history 禁用?
# 实际删除记录可加 --no-hooks
Chart 结构详解
一个标准 Chart 目录结构如下:
mychart/
├── Chart.yaml # Chart 元数据(名称、版本、描述等)
├── values.yaml # 默认配置值,模板的占位符取值来源
├── templates/ # 模板文件,渲染生成 Kubernetes 资源清单
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # 命名模板/辅助函数(局部复用)
│ ├── NOTES.txt # 安装后显示的使用帮助
│ └── ...
├── charts/ # 依赖的子 Chart(或通过 Chart.lock 管理)
├── .helmignore # 打包时忽略的文件列表
└── README.md
Chart.yaml
apiVersion: v2
name: my-app
description: A simple application
type: application # application 或 library
version: 0.1.0 # Chart 自身版本
appVersion: "1.16.0" # 应用版本
values.yaml
定义可配置参数,例如:
replicaCount: 2
image:
repository: myapp
tag: latest
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
Helm 模板化基础
模板文件采用 Go Template 语法,并注入 Helm 内置对象和自定义 Values。
基本占位符
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deploy
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
此处 . 是上下文,.Values 对应 values.yaml 内容;.Release 包含 Release 相关信息;.Chart 引用 Chart.yaml 中的元数据。
常用函数与管道
# upper 转大写
{{ .Values.appName | upper | quote }}
# default 提供默认值
image: "{{ .Values.image.repository | default "nginx" }}"
条件控制
{{- if .Values.persistence.enabled }}
volumes:
- name: data
persistentVolumeClaim:
claimName: {{ .Release.Name }}-pvc
{{- end }}
{{- 移除模板生成的空白行。
循环与范围
containers:
{{- range .Values.containers }}
- name: {{ .name }}
image: {{ .image }}
{{- end }}
与之对应的 values 可能是:
containers:
- name: app
image: app:v1
- name: sidecar
image: sidecar:v2
命名模板(_helpers.tpl)
定义可复用片段:
{{/* 定义全限定名 */}}
{{- define "mychart.fullname" -}}
{{- .Release.Name }}-{{ .Chart.Name }}
{{- end }}
在 deployment.yaml 中使用:
name: {{ include "mychart.fullname" . }}
自定义 Chart:从零开始
1. 创建 Chart 骨架
helm create my-first-chart
cd my-first-chart
生成标准目录结构,包含基础部署模板与 Nginx 示例。
2. 清理预设内容(可选)
删除 templates/ 下你不想要的模板,或直接重置。
3. 编写核心模板
以部署一个简单 Python 应用为例,修改 values.yaml:
replicaCount: 1
image:
repository: "myorg/python-app"
tag: "1.0.0"
service:
type: ClusterIP
port: 5000
在 templates/ 创建 deployment.yaml 和 service.yaml,使用模板变量。
4. 本地验证渲染结果
# 模拟渲染,输出所有生成的 YAML 到控制台
helm template ./my-first-chart
# 使用特定 values 文件验证
helm template ./my-first-chart -f path/to/values.yaml
5. 安装调试
helm install test-release ./my-first-chart --dry-run --debug
--dry-run 不会实际部署,但会输出提交给 K8s 的完整资源清单;--debug 给出详细日志。
6. 打包与分发
# 打成 .tgz 包
helm package ./my-first-chart
# 可以推送到 Chart 仓库(需要配置),或直接通过文件安装
helm install my-app my-first-chart-0.1.0.tgz
最佳实践与技巧
-
版本管理
始终在Chart.yaml中增加version并记录变动。使用helm package生成的包名自动包含版本号。 -
依赖管理
复杂应用常依赖其他 Chart(如数据库),使用dependencies字段或在Chart.yaml中定义,配合helm dependency update下载子 Chart。 -
密钥与安全
敏感信息(密码、Token)不应直接写入values.yaml,可使用 Kubernetes Secret 并配合模板函数lookup,或者通过外部密钥管理工具(如helm-secrets插件结合SOPS)处理加密。 -
保持模板简洁
将复杂逻辑抽离为命名模板,利用_helpers.tpl复用。避免过多条件嵌套,可读性优先。 -
使用
NOTES.txt提供指引
安装完成后自动输出使用说明、访问 URL、下一步操作,提升体验。 -
升级策略
生产环境升级前先用helm diff插件对比变更,避免意外覆盖。
总结
Helm 通过 Chart 打包、模板化配置和 Release 管理 极大简化了 Kubernetes 应用的部署流程。从搜索社区仓库到自定义私有 Chart,从基础安装到多环境参数化,掌握 Helm 已经成为云原生运维和开发者的必备技能。初学者应从理解核心概念开始,逐步实践 helm create、本地渲染、安装调试,最终构建符合团队规范的 Chart 并纳入 CI/CD 流程。