4. Helm 包管理基础:Helm 安装、Chart 结构、模板语法、values.yaml 配置、release 管理
Helm 是 Kubernetes 生态中最流行的包管理工具,被形象地称为“K8s 的 apt-get 或 yum”。它通过 Chart 将一组相关的 Kubernetes 资源(Deployment、Service、ConfigMap 等)打包、版本化并参数化,实现应用的标准化部署与升级。本章将围绕 Helm 的核心概念,从安装到 release 管理,构建完整的知识体系。
4.1 Helm 安装与核心组件
Helm 采用客户端-服务端架构(v3 版本已移除 Tiller,仅保留客户端)。安装方式支持二进制下载、包管理器或脚本安装。
| 安装方式 | 适用平台 | 命令/步骤 |
|---|---|---|
| 脚本安装 | Linux / macOS | curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash |
| Homebrew | macOS | brew install helm |
| Chocolatey | Windows | choco install kubernetes-helm |
| 二进制下载 | 所有平台 | 从 GitHub Releases 下载对应架构的 tar.gz 并解压至 /usr/local/bin |
验证安装: 执行
helm version 应返回类似 version.BuildInfo{Version:"v3.15.0"} 的输出。确保已配置好 kubeconfig 并拥有集群访问权限。
4.2 Chart 目录结构
一个 Helm Chart 是一个遵循标准目录结构的文件集合。使用 helm create my-chart 可快速生成脚手架。
my-chart/
├── Chart.yaml # Chart 元数据(名称、版本、描述、依赖等)
├── values.yaml # 默认配置值,供模板引用
├── charts/ # 子 Chart 依赖(手动或通过 helm dependency 管理)
├── templates/ # Go 模板文件,渲染后生成 Kubernetes 资源清单
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── _helpers.tpl # 模板辅助函数(命名、标签等)
│ └── tests/ # 测试 Pod 模板
└── .helmignore # 打包时忽略的文件模式(类似 .gitignore)
关键文件说明:
- Chart.yaml:必填字段包括
apiVersion(v2)、name、version(Chart 版本)、appVersion(应用版本)。 - values.yaml:定义所有可配置参数的默认值,是 Chart 参数化的入口。
- templates/:使用 Go 模板语法(
{{ .Values.key }})引用 values.yaml 中的值。
4.3 模板语法与 values.yaml 配置
Helm 使用 Go 模板引擎(text/template)结合 Sprig 函数库,在 templates/ 目录下的 YAML 文件中嵌入动态逻辑。核心语法包括:
- 值引用:
{{ .Values.replicaCount }}—— 从 values.yaml 中读取参数。 - 内置对象:
.Release.Name(release 名称)、.Chart.Name(Chart 名称)、.Files.Get(读取文件内容)。 - 流程控制:
{{- if .Values.enabled }} ... {{- end }}、{{- range .Values.items }} ... {{- end }}。 - 模板函数:
{{ .Values.image.repository | quote }}(管道)、{{ default "nginx" .Values.image.repository }}(默认值)。 - 命名模板:在
_helpers.tpl中定义{{- define "my-chart.labels" -}} ... {{- end }},通过{{ include "my-chart.labels" . }}复用。
常见陷阱:
- 缩进问题:模板渲染后的 YAML 必须保持正确的缩进,使用
{{- indent 4 }}或{{- nindent 4 }}控制。 - 布尔值:
true/false在 YAML 中是小写,但在模板中作为字符串时需用{{ .Values.enabled | toString }}转换。 - 特殊字符:密码等含
$、\的值建议使用--set或--values传递,避免模板转义。
values.yaml 配置示例
# values.yaml
replicaCount: 3
image:
repository: nginx
tag: "1.25"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
host: chart-example.local
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
nodeSelector: {}
tolerations: []
affinity: {}
4.4 Release 管理
Release 是 Helm 在 Kubernetes 集群中安装 Chart 后生成的运行实例。每个 release 都有一个唯一的名称,Helm 会记录其状态、版本和配置历史。
| 命令 | 功能 | 示例 |
|---|---|---|
helm install |
安装一个新的 release | helm install my-release ./my-chart |
helm upgrade |
升级一个已存在的 release | helm upgrade my-release ./my-chart -f new-values.yaml |
helm rollback |
回滚到指定版本 | helm rollback my-release 1 |
helm list |
列出所有已部署的 release | helm list -n default |
helm uninstall |
卸载 release 并删除资源 | helm uninstall my-release |
helm history |
查看 release 的版本历史 | helm history my-release |
最佳实践:
- 使用
--dry-run --debug在安装/升级前预览渲染后的 YAML,避免直接操作集群。 - 为 release 名称添加环境后缀(如
report-service-dev、report-service-prod),便于多环境管理。 - 利用
helm get values my-release查看当前 release 使用的实际配置值,用于审计或回滚参考。
4.5 实战:部署报表导出服务 Chart
结合本课程项目,我们为报表导出服务创建一个最小化 Chart。以下为关键步骤:
- 创建 Chart:
helm create report-export,删除不必要的模板文件,保留deployment.yaml、service.yaml、_helpers.tpl。 - 配置 values.yaml:定义镜像仓库、副本数、数据库连接字符串(通过 Secret 引用)、资源限制等。
- 编写模板:在
deployment.yaml中使用{{ .Values.image.repository }}:{{ .Values.image.tag }}引用镜像;使用{{- include "report-export.labels" . }}注入标签。 - 安装测试:
helm install report-export-dev ./report-export --dry-run --debug验证渲染结果。 - 升级与回滚:修改 values.yaml 后执行
helm upgrade report-export-dev ./report-export -f new-values.yaml;若失败则helm rollback report-export-dev 1。
关键命令速查:
# 安装
helm install report-export ./report-export -n report-ns --create-namespace
# 升级(仅变更部分值)
helm upgrade report-export ./report-export --set image.tag=2.0.0
# 回滚到版本 2
helm rollback report-export 2
# 查看 release 状态
helm status report-export
# 导出当前配置
helm get values report-export -o yaml > current-values.yaml