4. Helm Chart 基础:Chart 结构、模板语法、Values 文件、依赖管理

Helm Chart 是 Kubernetes 应用的打包格式,本质是一个按约定组织的文件集合。理解 Chart 的内部结构、模板渲染机制、Values 注入方式以及依赖管理,是开发网络拓扑感知调度器插件的前提。本章从这四个维度展开,为后续编写调度器 Helm Chart 奠定基础。

4.1 Chart 标准目录结构

一个标准的 Helm Chart 目录遵循以下约定,每个文件和目录都有明确的职责:

路径 / 文件 是否必须 作用说明
Chart.yaml 是 Chart 元数据:名称、版本、API 版本、描述、关键字等
values.yaml 是 默认配置值,供模板引用,用户可覆盖
templates/ 是 存放 Go 模板文件,渲染后生成 Kubernetes 资源清单
charts/ 否 子 Chart 或依赖 Chart 的存放目录
crds/ 否 自定义资源定义(CRD),在模板渲染前安装
templates/NOTES.txt 否 安装成功后向用户显示的说明文本
templates/_helpers.tpl 否 模板辅助函数定义,可被其他模板引用
调度器插件场景提示: 网络拓扑感知调度器通常需要注册 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration,这些资源应放在 templates/ 目录下;如果涉及自定义调度器 CRD,则必须放在 crds/ 目录,避免模板渲染顺序问题。
Helm Chart 标准目录结构 my-scheduler-chart/ Chart.yaml values.yaml templates/ charts/ deployment.yaml service.yaml _helpers.tpl NOTES.txt 📌 关键约定 • templates/ 目录下的所有 .yaml/.tpl 文件都会被 Helm 引擎渲染 • crds/ 目录中的 CRD 在模板渲染前安装,适用于调度器自定义资源 • charts/ 目录存放依赖 Chart,由 helm dependency update 自动填充

4.2 模板语法核心

Helm 使用 Go 模板引擎(text/template)配合 Sprig 函数库进行资源渲染。以下是最常用的模板语法元素:

4.2.1 基本指令

语法 说明 示例
{{ .Values.key }} 引用 values.yaml 中的值 replicas: {{ .Values.replicaCount }}
{{ .Release.Name }} 内置对象,当前 Release 名称 name: {{ .Release.Name }}-scheduler
{{ .Chart.Name }} 内置对象,Chart 名称 app.kubernetes.io/name: {{ .Chart.Name }}
{{- if condition -}} ... {{- end -}} 条件判断,- 用于消除空白 {{- if .Values.webhook.enabled }} ... {{- end }}
{{- range $i, $v := .Values.nodes -}} ... {{- end -}} 循环遍历列表或字典 {{- range .Values.topologyZones }} ... {{- end }}
{{ .Values.nested.key | default "fallback" }} 管道函数,提供默认值 port: {{ .Values.service.port | default 80 }}

4.2.2 辅助模板与命名模板

在 _helpers.tpl 中定义可复用的命名模板,避免重复代码:

{{- /* 定义命名模板:生成完整的资源名称 */ -}}
{{- define "scheduler.fullname" -}}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}

{{- /* 定义命名模板:通用标签 */ -}}
{{- define "scheduler.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
{{- end -}}

在 deployment.yaml 中引用:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "scheduler.fullname" . }}
  labels:
    {{- include "scheduler.labels" . | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
💡 调度器开发技巧: 网络拓扑感知调度器通常需要注入多个环境变量(如节点拓扑标签、网络延迟阈值)。建议在 _helpers.tpl 中定义 scheduler.envVars 命名模板,集中管理环境变量配置,便于维护和测试。

4.3 Values 文件与值注入机制

values.yaml 是 Chart 的默认配置入口。Helm 支持多层值覆盖,优先级从低到高依次为:

  1. Chart 内置 values.yaml —— 最低优先级,作为默认值
  2. 父 Chart 的 values.yaml —— 当 Chart 作为子 Chart 时生效
  3. 用户提供的 -f 文件 —— 可指定多个 YAML 文件,后覆盖前
  4. 命令行 --set 参数 —— 最高优先级,直接覆盖特定键

以下是一个面向网络拓扑调度器的 values.yaml 示例:

# 调度器基础配置
replicaCount: 2
image:
  repository: myregistry/scheduler-plugin
  tag: "1.0.0"
  pullPolicy: IfNotPresent

# 网络拓扑感知配置
topology:
  enabled: true
  zoneLabel: "topology.kubernetes.io/zone"
  latencyThresholdMs: 10
  bandwidthThresholdMbps: 1000

# Webhook 配置(用于动态更新拓扑信息)
webhook:
  enabled: true
  port: 9443
  certManager:
    enabled: false

# 资源限制
resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "2"
    memory: "2Gi"
⚠️ 常见陷阱: 当使用 --set 设置嵌套值时,必须使用逗号分隔路径,例如 --set topology.latencyThresholdMs=5。如果值包含特殊字符(如逗号、括号),建议使用 --set-json 或 -f 文件方式注入。

4.4 依赖管理

当调度器插件依赖其他 Chart(如 cert-manager、prometheus-operator)时,需要在 Chart.yaml 中声明依赖关系。

4.4.1 声明依赖

在 Chart.yaml 的 dependencies 字段中定义:

apiVersion: v2
name: network-aware-scheduler
version: 0.1.0
appVersion: "1.0"
description: "网络拓扑感知调度器插件"

dependencies:
  - name: cert-manager
    version: "~1.12.0"
    repository: "https://charts.jetstack.io"
    condition: webhook.certManager.enabled
    alias: cert-manager
  - name: prometheus
    version: "~15.0.0"
    repository: "https://prometheus-community.github.io/helm-charts"
    condition: monitoring.enabled

4.4.2 依赖管理命令

命令 作用
helm dependency update 根据 Chart.yaml 下载依赖到 charts/ 目录,并生成 Chart.lock 锁定版本
helm dependency build 从 Chart.lock 重建依赖,确保版本一致性
helm dependency list 列出当前 Chart 的所有依赖及其状态

4.4.3 子 Chart 值覆盖

父 Chart 可以通过 values.yaml 中的嵌套键覆盖子 Chart 的配置:

# 父 Chart values.yaml
cert-manager:
  installCRDs: true
  replicaCount: 1

monitoring:
  enabled: false
🔗 调度器依赖实践: 网络拓扑感知调度器通常依赖 cert-manager 管理 Webhook 证书。建议在 values.yaml 中通过 webhook.certManager.enabled 条件控制是否安装 cert-manager,避免强制依赖。同时,使用 alias 字段避免子 Chart 名称冲突。
Helm 依赖管理与值覆盖流程 父 Chart (network-aware-scheduler) 子 Chart: cert-manager 子 Chart: prometheus 值覆盖优先级(从低到高) 子 Chart 默认值 → 父 Chart values.yaml 嵌套键 → 用户 -f 文件 → --set 参数 条件控制示例 Chart.yaml 中 condition: webhook.certManager.enabled 当 .Values.webhook.certManager.enabled = false 时,跳过 cert-manager 安装

4.5 本章小结

  • Chart 结构 遵循约定优于配置原则,templates/、values.yaml、Chart.yaml 是核心三要素。
  • 模板语法 以 Go 模板为基础,结合 Sprig 函数和命名模板机制,实现动态资源生成。
  • Values 文件 支持多层覆盖,合理组织 values 结构可提升 Chart 的可配置性和复用性。
  • 依赖管理 通过 dependencies 字段声明,配合条件控制和别名机制,实现灵活的组合部署。