4. Helm values.yaml 结构:全局参数与镜像参数定义规范

在 Helm Chart 中,values.yaml 是用户与 Chart 交互的核心接口。一个设计良好的 values.yaml 结构,能够大幅降低运维复杂度,尤其在需要统一管理镜像拉取加速配置的场景下,全局参数与镜像参数的合理分层至关重要。本章将深入解析这两类参数的定义规范、层级关系及最佳实践。

4.1 全局参数 vs 镜像参数:职责分离

全局参数(Global Parameters)作用于整个 Release 或跨多个组件,而镜像参数(Image Parameters)仅控制单个容器的镜像拉取行为。错误的参数层级会导致配置冲突或覆盖失效。

维度 全局参数 镜像参数
作用域 所有组件 / 子 Chart 单个 Deployment / StatefulSet
典型字段 global.imageRegistry, global.imagePullSecrets, global.proxy image.repository, image.tag, image.pullPolicy
覆盖优先级 低(作为默认值) 高(显式指定时覆盖全局)
加速配置 全局镜像仓库镜像、全局拉取凭证 单组件镜像地址、拉取超时、重试策略
设计原则:全局参数提供“基线配置”,镜像参数提供“局部覆盖”。在镜像拉取加速场景中,全局参数通常用于指定统一的镜像仓库 Mirror 地址,而镜像参数用于标记哪些组件需要跳过加速或使用特定加速通道。

4.2 标准 values.yaml 层级结构

以下是一个面向镜像拉取加速场景的推荐 values.yaml 骨架,包含全局段和镜像段:

# ============================================
# 全局配置段(作用于所有组件)
# ============================================
global:
  # 全局镜像仓库镜像(Mirror)地址
  imageRegistry: "mirror.example.com"
  # 全局镜像拉取凭证
  imagePullSecrets:
    - name: regcred-global
  # 全局代理配置(用于拉取外网镜像)
  proxy:
    httpProxy: "http://proxy.example.com:8080"
    httpsProxy: "http://proxy.example.com:8080"
    noProxy: "localhost,127.0.0.1,.cluster.local"
  # 全局拉取加速开关
  imagePullAcceleration:
    enabled: true
    cacheTTL: "24h"
    concurrency: 5

# ============================================
# 组件配置段(每个组件独立定义)
# ============================================
componentA:
  enabled: true
  image:
    repository: "nginx"
    tag: "1.25.3-alpine"
    pullPolicy: "IfNotPresent"
    # 组件级镜像仓库覆盖(优先级高于 global.imageRegistry)
    registry: "docker.io"
    # 组件级拉取凭证覆盖
    pullSecrets:
      - name: regcred-componentA
    # 组件级加速配置
    acceleration:
      enabled: true
      # 使用全局 Mirror 还是自定义 Mirror
      mirrorType: "global"   # 可选: global / custom / none
      customMirror: ""       # 当 mirrorType=custom 时填写

componentB:
  enabled: true
  image:
    repository: "redis"
    tag: "7.2.4"
    pullPolicy: "Always"
    registry: ""             # 留空则使用全局 registry
    pullSecrets: []          # 空列表则使用全局 secrets
    acceleration:
      enabled: false         # 该组件跳过加速
      mirrorType: "none"
关键规范:
  • 全局字段统一放在 global 键下,Helm 内置支持 .Values.global 在子 Chart 间传递。
  • 镜像参数使用 image 子对象,包含 repository、tag、pullPolicy 三个必选字段。
  • 加速配置独立为 acceleration 子对象,不与镜像地址混在一起,便于后期扩展。
  • 组件级字段为空时,模板逻辑应回退到全局值,而非直接报错。

4.3 镜像参数定义规范详解

镜像参数是 Helm Chart 中最常被修改的配置项,其定义规范直接影响拉取加速的灵活性和可维护性。

4.3.1 核心字段规范

字段 类型 默认值 说明
image.repository string 无 镜像名称,不含 Registry 部分,例如 nginx、myapp/backend
image.tag string latest 镜像标签,生产环境应避免使用 latest
image.pullPolicy string IfNotPresent 拉取策略:Always、IfNotPresent、Never
image.registry string 继承 global.imageRegistry 镜像仓库地址,例如 docker.io、registry.cn-hangzhou.aliyuncs.com
image.pullSecrets list 继承 global.imagePullSecrets 拉取凭证列表,每个元素包含 name 字段
image.digest string 无 镜像摘要(SHA256),优先级高于 tag,用于不可变部署

4.3.2 加速专用字段规范

字段 类型 默认值 说明
acceleration.enabled bool true 是否对该组件启用镜像拉取加速
acceleration.mirrorType string global 镜像源类型:global(使用全局 Mirror)、custom(自定义)、none(直连)
acceleration.customMirror string "" 当 mirrorType=custom 时,指定自定义 Mirror 地址
acceleration.prefetch bool false 是否在部署前预拉取该镜像到所有节点
acceleration.timeout int 300 拉取超时时间(秒)

4.4 全局参数与镜像参数的合并逻辑

理解 Helm 的 values 合并顺序,是避免配置冲突的关键。以下 SVG 图展示了从全局到组件的参数解析流程:

全局与镜像参数合并逻辑流程 用户 values.yaml / --set 输入 Chart 内置全局默认值 (global.*) Helm 内置合并:用户值 → 覆盖 → 全局默认值 生成 .Values.global 最终对象 组件模板渲染 (componentA.image.*) 组件级字段是否显式定义? 是 → 使用组件值;否 → 回退到 global 对应字段 组件最终镜像配置 全局默认镜像配置
常见陷阱:
  • 空字符串 vs 未定义:在 values.yaml 中显式设置 registry: "" 会被 Helm 视为“有值(空字符串)”,不会触发回退逻辑。应使用 registry: null 或直接删除该字段。
  • 列表合并行为:pullSecrets 是列表类型,Helm 默认不会递归合并列表,组件级列表会完全覆盖全局列表。如需追加,需在模板中使用 concat 函数。
  • 布尔值覆盖:当全局 acceleration.enabled=true,组件显式设为 false 时,组件级值优先。

4.5 最佳实践:加速场景下的 values 设计模式

4.5.1 分层覆盖模式

推荐使用三层覆盖结构,确保灵活性与可维护性:

  1. Chart 内置默认值(values.yaml):定义最安全的基线配置,例如 global.imageRegistry: "k8s.gcr.io"。
  2. 环境级覆盖(values-production.yaml):针对生产环境统一修改全局加速参数,例如 global.imageRegistry: "mirror.company.com"。
  3. 组件级覆盖(--set 或独立 values):针对特定组件的特殊需求,例如某个第三方组件必须从原始仓库拉取。

4.5.2 加速配置的模板辅助函数

在 _helpers.tpl 中定义辅助函数,统一处理镜像地址拼接和加速逻辑:

{{- define "common.image" -}}
{{- $registry := .Values.global.imageRegistry -}}
{{- if .Values.image.registry -}}
  {{- $registry = .Values.image.registry -}}
{{- end -}}
{{- if and .Values.acceleration.enabled (eq .Values.acceleration.mirrorType "custom") -}}
  {{- $registry = .Values.acceleration.customMirror -}}
{{- end -}}
{{- if $registry -}}
  {{- printf "%s/%s:%s" $registry .Values.image.repository .Values.image.tag -}}
{{- else -}}
  {{- printf "%s:%s" .Values.image.repository .Values.image.tag -}}
{{- end -}}
{{- end -}}
使用示例:在 Deployment 模板中调用 {{ include "common.image" . }},即可自动根据全局/组件/加速配置生成最终的镜像地址。

4.6 参数定义规范检查清单

检查项 规范要求 违规后果
全局字段命名 必须使用 global 作为顶级键 子 Chart 无法继承,配置失效
镜像仓库字段 registry 与 repository 分离 镜像地址拼接困难,加速配置混乱
加速开关 每个组件独立 acceleration.enabled 无法精细化控制,全量加速可能引发问题
空值处理 使用 null 而非空字符串表示“未定义” Helm 不会回退到全局默认值
凭证管理 全局凭证与组件凭证分离,组件凭证优先 拉取凭证冲突导致 ImagePullBackOff
文档注释 每个字段上方添加 # 注释说明用途和可选值 运维人员难以理解配置含义,增加排障成本