成本GitOps窗口Helm查询优化与样本留存 - 第2节
2.1 Helm 简介:Kubernetes 的包管理器
Helm 是 Kubernetes 生态中最流行的包管理工具,其核心使命是解决 Kubernetes 原生 YAML 资源清单的重复编写、版本管理、环境差异和复杂应用编排问题。类比操作系统中的 apt/yum 或编程语言中的 npm/pip,Helm 将一组相关的 Kubernetes 资源(Deployment、Service、ConfigMap、Ingress 等)打包为一个可复用、可配置、可版本化的Chart。
核心价值:通过 Helm,运维和开发人员可以将一个包含数十个 YAML 文件的应用栈(如 WordPress + MySQL + Nginx)简化为一条命令
helm install my-wordpress bitnami/wordpress 完成部署,并通过 values.yaml 实现环境差异化配置。
Helm 的三大核心概念
| 概念 | 类比 | 说明 |
|---|---|---|
| Chart | 软件包 / 安装包 | 包含描述 Kubernetes 应用所需的所有资源定义、模板和依赖的目录结构 |
| Release | 运行实例 | Chart 在目标 Kubernetes 集群上的一次部署实例,每个 Release 有独立名称和版本 |
| Repository | 软件仓库 | 存储和分发 Chart 的 HTTP 服务器,如 ArtifactHUB、Bitnami 仓库 |
2.2 Chart 结构:标准化的应用打包规范
一个 Helm Chart 遵循固定的目录布局,这是 Helm 能够自动识别和渲染资源的基础。以下是一个典型 Chart 的完整结构:
my-chart/
├── Chart.yaml # Chart 元数据:名称、版本、API 版本、描述
├── values.yaml # 默认配置值,用户可覆盖
├── values.schema.json # (可选) values.yaml 的 JSON Schema 校验文件
├── charts/ # (可选) 子 Chart 依赖,如依赖的 MySQL Chart
├── templates/ # 核心目录:Go 模板文件,最终渲染为 Kubernetes YAML
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── ingress.yaml
│ ├── _helpers.tpl # (可选) 模板辅助函数,可被其他模板引用
│ └── tests/ # (可选) 测试 Pod 模板,用于验证 Release 是否正常
├── README.md # (可选) Chart 使用说明
└── LICENSE # (可选) 许可证文件
最佳实践:templates/ 目录下的文件名没有强制要求,但建议按资源类型命名(如 deployment.yaml、hpa.yaml)。
_helpers.tpl 以下划线开头,Helm 不会将其渲染为独立的 Kubernetes 资源,仅作为模板函数库被其他文件引用。
Chart.yaml 关键字段
| 字段 | 必填 | 示例值 | 说明 |
|---|---|---|---|
| apiVersion | 是 | v2 | Chart API 版本,Helm 3 必须使用 v2 |
| name | 是 | my-app | Chart 名称,也是 Release 默认名称的一部分 |
| version | 是 | 1.2.3 | Chart 语义化版本,用于 Release 追踪和回滚 |
| appVersion | 否 | 3.0.1 | 应用本身的版本,与 Chart 版本解耦 |
| dependencies | 否 | — | 子 Chart 依赖列表,Helm 会自动下载合并 |
2.3 模板引擎:Go Template 与 Values 注入
Helm 使用 Go 语言内置的 text/template 引擎,结合 Sprig 函数库(提供 100+ 额外模板函数),将 values.yaml 中的配置动态注入到 templates/ 下的 YAML 文件中。这是 Helm 实现“一次编写,多环境复用”的核心机制。
模板语法速览
{{- /* 这是一个模板注释,不会出现在最终输出中 */ -}}
{{- /* 输出 values.yaml 中的值 */ -}}
replicas: {{ .Values.replicaCount }}
{{- /* 带默认值的输出 */ -}}
image:
repository: {{ .Values.image.repository | default "nginx" }}
tag: {{ .Values.image.tag | default "latest" }}
{{- /* 条件判断 */ -}}
{{- if .Values.service.create }}
apiVersion: v1
kind: Service
...
{{- end }}
{{- /* 循环遍历 */ -}}
{{- range .Values.ports }}
- port: {{ .port }}
targetPort: {{ .targetPort }}
{{- end }}
{{- /* 使用 _helpers.tpl 中定义的命名模板 */ -}}
name: {{ include "my-chart.fullname" . }}
常见陷阱:模板中的缩进必须手动控制。Helm 不会自动对齐 YAML 缩进,建议使用
{{- (左侧空白修剪)和 -}}(右侧空白修剪)来控制换行和空格,避免生成无效 YAML。
2.4 Release 管理:部署、升级、回滚与删除
Release 是 Helm 在 Kubernetes 集群中管理应用生命周期的基本单位。每次 helm install 或 helm upgrade 都会生成一个新的 Release 版本,Helm 在集群的 kube-system 命名空间中保存 Release 的历史记录(默认存储在 Secret 中)。
Release 生命周期命令
| 操作 | 命令示例 | 说明 |
|---|---|---|
| 安装 | helm install my-release ./my-chart |
首次部署,生成 Release v1 |
| 升级 | helm upgrade my-release ./my-chart -f prod-values.yaml |
更新 Release 到 v2,支持 values 覆盖 |
| 回滚 | helm rollback my-release 1 |
回退到 Release v1 的状态 |
| 查看历史 | helm history my-release |
列出所有 Release 版本及状态 |
| 卸载 | helm uninstall my-release |
删除 Release 及其所有 Kubernetes 资源 |
| 列表 | helm list -n my-namespace |
查看指定命名空间下的所有 Release |
Release 版本状态机
回滚原理:Helm 3 将 Release 历史存储在 Secret 中(
sh.helm.release.v1.<release-name>.v<version>),回滚时直接复用历史版本的完整渲染结果,无需重新执行模板渲染。默认保留 10 个历史版本,可通过 --history-max 调整。
2.5 Helm 与 Kubernetes 的关系
Helm 不是 Kubernetes 的替代品,而是运行在 Kubernetes 之上的应用层管理工具。理解两者的边界和协作方式,是正确使用 Helm 的前提。
职责边界对比
| 维度 | Kubernetes | Helm |
|---|---|---|
| 抽象层级 | 基础设施编排(Pod、Service、Volume) | 应用打包与发布(Chart、Release、Values) |
| 配置方式 | 静态 YAML / kubectl 命令 | 模板 + values.yaml 动态注入 |
| 版本管理 | 无原生版本概念,依赖外部 GitOps | 内置 Release 版本号,支持回滚 |
| 依赖管理 | 手动编排多个资源 | Chart 依赖自动解析和下载 |
| 多环境 | 需要维护多套 YAML 副本 | 同一 Chart + 不同 values 文件 |
| 安装方式 | kubectl apply -f | helm install / helm upgrade |
Helm 在 Kubernetes 集群中的架构位置
关键演进:Helm 2 → Helm 3
Helm 2 需要在集群中安装 Tiller(服务端组件),Tiller 拥有集群管理员权限,存在严重安全风险。Helm 3 彻底移除 Tiller,所有操作由 Helm CLI 直接通过 kubeconfig 调用 Kubernetes API Server,权限完全由 RBAC 控制,同时引入 Release 存储在 Secret 中、Chart 库支持 OCI 镜像仓库等重大改进。
Helm 2 需要在集群中安装 Tiller(服务端组件),Tiller 拥有集群管理员权限,存在严重安全风险。Helm 3 彻底移除 Tiller,所有操作由 Helm CLI 直接通过 kubeconfig 调用 Kubernetes API Server,权限完全由 RBAC 控制,同时引入 Release 存储在 Secret 中、Chart 库支持 OCI 镜像仓库等重大改进。
Helm 3 的工作流程
- Chart 准备:开发者编写 Chart 模板和 values.yaml,或从仓库拉取已有 Chart。
- 模板渲染:Helm CLI 读取 Chart 和用户提供的 values,在本地完成 Go Template 渲染,生成完整的 Kubernetes YAML 清单。
- API 调用:Helm 通过 kubeconfig 向 Kubernetes API Server 发送
POST/PUT/DELETE请求,创建或更新资源。 - 状态记录:Helm 将 Release 元数据(版本号、渲染后的资源清单、values 快照)写入集群的 Secret 中。
- 生命周期管理:后续的 upgrade、rollback、uninstall 操作均基于 Secret 中存储的历史版本信息执行。
与 GitOps 的天然契合:Helm 的模板化能力和 Release 版本管理,使其成为 GitOps 工作流(如 ArgoCD、Flux)的首选打包工具。GitOps 工具通过监听 Git 仓库中的 Chart 和 values 变化,自动触发 helm upgrade,实现声明式持续部署。