3.1 Helm 架构:从客户端到集群的三层协作

Helm 是 Kubernetes 生态中最成熟的包管理工具,其核心价值在于将复杂的 Kubernetes 资源定义抽象为可配置、可版本化、可复用的 Chart。理解 Helm 的架构是掌握后续所有调优与削峰操作的基础。

Helm 采用 客户端-库-集群 三层架构,部署时无需在集群内安装服务端组件(Tiller 已在 Helm v3 中移除),所有操作通过客户端直接调用 Kubernetes API 完成。

架构要点: Helm v3 移除了服务端 Tiller,客户端直接通过 kubeconfig 与 Kubernetes API Server 交互,安全性更高,权限模型更清晰。
Helm v3 架构:客户端直连 API Server Helm Client CLI 工具 Chart 解析 / 渲染 Chart 仓库 索引 / 下载 / 缓存 values.yaml Kubernetes API Server 资源创建 / 更新 / 删除 Deployment / Service / ConfigMap ... 无服务端组件 直接调用 API Release 状态 存储在 Secret 中

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 文件的层级结构与覆盖优先级:

  1. Chart 内置的 values.yaml — 最低优先级,作为默认值。
  2. 父 Chart 的 values.yaml — 当存在依赖关系时,父 Chart 的值可以覆盖子 Chart。
  3. 用户自定义 -f values-custom.yaml — 通过 --values 或 -f 指定外部文件。
  4. 命令行 --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 文件统一管理这些参数,可以在不同环境(开发、预发、生产)之间快速切换资源配比,实现冷启动阶段的资源削峰。
Values 文件覆盖优先级(从低到高) 1. Chart 内置 values.yaml(默认值) 2. 父 Chart values.yaml(子 Chart 依赖覆盖) 3. 用户自定义 -f values-custom.yaml 4. 命令行 --set 参数(最高优先级)

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 输出,是排查模板问题的首选方法。