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 图展示了从全局到组件的参数解析流程:
常见陷阱:
- 空字符串 vs 未定义:在 values.yaml 中显式设置
registry: ""会被 Helm 视为“有值(空字符串)”,不会触发回退逻辑。应使用registry: null或直接删除该字段。 - 列表合并行为:
pullSecrets是列表类型,Helm 默认不会递归合并列表,组件级列表会完全覆盖全局列表。如需追加,需在模板中使用concat函数。 - 布尔值覆盖:当全局
acceleration.enabled=true,组件显式设为false时,组件级值优先。
4.5 最佳实践:加速场景下的 values 设计模式
4.5.1 分层覆盖模式
推荐使用三层覆盖结构,确保灵活性与可维护性:
- Chart 内置默认值(values.yaml):定义最安全的基线配置,例如
global.imageRegistry: "k8s.gcr.io"。 - 环境级覆盖(values-production.yaml):针对生产环境统一修改全局加速参数,例如
global.imageRegistry: "mirror.company.com"。 - 组件级覆盖(--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 |
| 文档注释 | 每个字段上方添加 # 注释说明用途和可选值 |
运维人员难以理解配置含义,增加排障成本 |