3.1 Helm 架构:从客户端到集群的三层协作
Helm 是 Kubernetes 生态中最成熟的包管理工具,其核心价值在于将复杂的 Kubernetes 资源定义抽象为可配置、可版本化、可复用的 Chart。理解 Helm 的架构是掌握后续所有调优与削峰操作的基础。
Helm 采用 客户端-库-集群 三层架构,部署时无需在集群内安装服务端组件(Tiller 已在 Helm v3 中移除),所有操作通过客户端直接调用 Kubernetes API 完成。
架构要点: Helm v3 移除了服务端 Tiller,客户端直接通过 kubeconfig 与 Kubernetes API Server 交互,安全性更高,权限模型更清晰。
3.2 Chart 结构:标准化的应用打包规范
一个 Helm Chart 是一个遵循特定目录结构的文件集合。理解 Chart 结构是编写和调试 Helm 包的前提。以下是一个标准 Chart 的目录树及各文件/目录的作用:
| 路径 / 文件 | 是否必需 | 作用说明 |
|---|---|---|
Chart.yaml |
是 | Chart 元数据:名称、版本、API 版本、描述、依赖等 |
values.yaml |
是 | 默认配置值,模板引擎渲染时的输入参数 |
templates/ |
是 | 存放 Go 模板文件,最终生成 Kubernetes 资源清单 |
charts/ |
否 | 子 Chart 依赖目录,存放被依赖的 Chart 包 |
crds/ |
否 | 自定义资源定义(CRD),在模板渲染前安装 |
templates/NOTES.txt |
否 | 安装成功后输出的使用说明文本 |
templates/_helpers.tpl |
否 | 模板辅助函数定义,可被其他模板引用 |
templates/tests/ |
否 | 测试 Pod 模板,用于验证 Release 是否正常工作 |
最佳实践: 在
templates/ 目录中,建议按资源类型拆分文件,例如 deployment.yaml、service.yaml、ingress.yaml,便于维护和代码审查。
3.3 模板引擎:Go Template 与 Sprig 函数库
Helm 使用 Go 语言内置的 text/template 作为模板引擎,并集成了 Sprig 函数库(提供 100+ 额外模板函数)。模板引擎负责将 values.yaml 中的配置注入到 templates/ 目录下的模板文件中,生成最终的 Kubernetes 资源 YAML。
核心模板语法示例:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount | default 1 }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name }}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}"
resources:
{{- toYaml .Values.resources | nindent 12 }}
模板引擎中常用的内置对象和函数:
| 对象 / 函数 | 说明 | 示例 |
|---|---|---|
.Values |
引用 values.yaml 中的配置值 | .Values.replicaCount |
.Release |
Release 元数据(Name、Namespace、Service、Revision) | .Release.Name |
.Chart |
Chart.yaml 中的元数据 | .Chart.Version |
.Files |
访问 Chart 包内的非模板文件 | .Files.Get "config/app.conf" |
default |
为变量提供默认值 | default 3 .Values.replicas |
toYaml |
将结构体转为 YAML 格式 | toYaml .Values.resources |
nindent |
换行并缩进指定空格数 | nindent 8 |
include |
调用 _helpers.tpl 中定义的命名模板 | include "mychart.labels" . |
常见陷阱: 模板中的缩进必须严格使用空格,不能使用 Tab 键。Helm 模板引擎对缩进敏感,错误的缩进会导致生成的 YAML 格式无效。
3.4 Values 文件:配置注入的核心机制
values.yaml 是 Helm Chart 的配置入口,它定义了所有可配置参数的默认值。用户可以通过多种方式覆盖这些默认值,实现不同环境的差异化部署。
Values 文件的层级结构与覆盖优先级:
- Chart 内置的
values.yaml— 最低优先级,作为默认值。 - 父 Chart 的
values.yaml— 当存在依赖关系时,父 Chart 的值可以覆盖子 Chart。 - 用户自定义
-f values-custom.yaml— 通过--values或-f指定外部文件。 - 命令行
--set参数 — 最高优先级,直接覆盖特定键值。
一个典型的 values.yaml 文件结构:
# values.yaml
replicaCount: 3
image:
repository: nginx
tag: "1.25.3"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
ingress:
enabled: false
host: example.com
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 250m
memory: 256Mi
nodeSelector: {}
tolerations: []
affinity: {}
削峰场景提示: 在镜像供应链冷启动场景中,
resources 字段的 requests 和 limits 是资源配额调优的核心参数。通过 Values 文件统一管理这些参数,可以在不同环境(开发、预发、生产)之间快速切换资源配比,实现冷启动阶段的资源削峰。
3.5 Helm 核心操作命令速查
掌握以下命令可以快速完成 Chart 的安装、升级、回滚和卸载,是日常 DevOps 工作的基础技能。
| 命令 | 功能 | 常用参数 |
|---|---|---|
helm install |
安装一个新的 Release | --name --namespace -f --set |
helm upgrade |
升级一个已有的 Release | --install --reset-values --reuse-values |
helm rollback |
回滚到指定版本 | --recreate-pods --force |
helm uninstall |
卸载一个 Release | --keep-history |
helm list |
列出已安装的 Release | --all-namespaces --filter |
helm template |
本地渲染模板,不实际安装 | --debug -f --set |
helm lint |
检查 Chart 语法和格式 | --strict |
调试技巧: 使用
helm template --debug 可以在不实际部署的情况下查看渲染后的完整 YAML 输出,是排查模板问题的首选方法。