成本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 实现“一次编写,多环境复用”的核心机制。

Helm 模板渲染流程 values.yaml replicaCount: 3 image.tag: "1.0" templates/deploy.yaml {{ .Values.replicaCount }} Go Template + Sprig 函数库 渲染引擎 Kubernetes YAML replicas: 3 image: app:1.0 模板中的 {{ .Values.replicaCount }} 被替换为 values.yaml 中的 3,最终生成可被 kubectl apply 的合法 YAML 支持条件判断、循环、管道函数、作用域控制等高级模板语法

模板语法速览

{{- /* 这是一个模板注释,不会出现在最终输出中 */ -}}

{{- /* 输出 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 版本状态机

Release 版本状态流转 deployed upgraded superseded failed uninstalled helm upgrade 将当前 deployed 标记为 superseded,新版本变为 deployed;helm rollback 将指定 superseded 版本重新变为 deployed
回滚原理: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 与 Kubernetes 协作架构 Helm CLI helm install/upgrade Tiller (Helm 2) 已移除,不再使用 Helm 3 直接调用 kubeconfig → API Server Kubernetes 集群 API Server Deployment Service Secret (Release) Helm 3 移除服务端 Tiller,直接通过 kubeconfig 与 Kubernetes API Server 交互,安全性更高,权限模型更清晰
关键演进:Helm 2 → Helm 3
Helm 2 需要在集群中安装 Tiller(服务端组件),Tiller 拥有集群管理员权限,存在严重安全风险。Helm 3 彻底移除 Tiller,所有操作由 Helm CLI 直接通过 kubeconfig 调用 Kubernetes API Server,权限完全由 RBAC 控制,同时引入 Release 存储在 Secret 中、Chart 库支持 OCI 镜像仓库等重大改进。

Helm 3 的工作流程

  1. Chart 准备:开发者编写 Chart 模板和 values.yaml,或从仓库拉取已有 Chart。
  2. 模板渲染:Helm CLI 读取 Chart 和用户提供的 values,在本地完成 Go Template 渲染,生成完整的 Kubernetes YAML 清单。
  3. API 调用:Helm 通过 kubeconfig 向 Kubernetes API Server 发送 POST/PUT/DELETE 请求,创建或更新资源。
  4. 状态记录:Helm 将 Release 元数据(版本号、渲染后的资源清单、values 快照)写入集群的 Secret 中。
  5. 生命周期管理:后续的 upgrade、rollback、uninstall 操作均基于 Secret 中存储的历史版本信息执行。
与 GitOps 的天然契合:Helm 的模板化能力和 Release 版本管理,使其成为 GitOps 工作流(如 ArgoCD、Flux)的首选打包工具。GitOps 工具通过监听 Git 仓库中的 Chart 和 values 变化,自动触发 helm upgrade,实现声明式持续部署。