Chapter 04

Values 管理

掌握 Helm Values 系统的完整机制:层次覆盖规则、多 values 文件合并、全局变量与多环境配置管理最佳实践。

Values 覆盖优先级

Helm 的 Values 系统允许多层覆盖,优先级从低到高依次为:

Values 覆盖优先级(从低到高)

   Chart 内置 values.yaml       ← 最低优先级,默认值
   父 Chart 的 values.yaml       ← 父 Chart 覆盖子 Chart 的值
   -f / --values 指定文件         ← 多个 -f 按顺序合并,后面的覆盖前面
   --set-file 指定文件内容         ← 将文件内容作为 string 值
   --set-string 强制字符串         ← 值强制为字符串类型
   --set 键值对                  ← 最高优先级

values.yaml 层次结构

Values 支持任意层次嵌套,在模板中用 . 访问路径。

# values.yaml

# 字符串
appName: my-web-app

# 数字
replicaCount: 2

# 布尔
debugMode: false

# 嵌套对象(map)
image:
  repository: myregistry.io/myapp
  tag: "1.2.3"
  pullPolicy: IfNotPresent

# 列表(slice)
envVars:
  - name: LOG_LEVEL
    value: info
  - name: DB_HOST
    value: postgres-svc

# 深度嵌套
database:
  primary:
    host: pg-primary.default.svc.cluster.local
    port: 5432
    name: myapp
  replicas:
    - pg-replica-0.default.svc.cluster.local
    - pg-replica-1.default.svc.cluster.local
# 在模板中引用
appName: {{ .Values.appName }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
dbHost: {{ .Values.database.primary.host }}

--set 命令行覆盖

# 覆盖简单值
helm install myapp ./chart --set replicaCount=3

# 覆盖嵌套值(用 . 分隔路径)
helm install myapp ./chart --set image.tag=v2.0.0

# 多个 --set
helm install myapp ./chart \
  --set replicaCount=3 \
  --set image.tag=v2.0.0 \
  --set service.type=LoadBalancer

# 覆盖列表中的元素(下标从 0 开始)
helm install myapp ./chart --set envVars[0].value=debug

# 设置整个列表(逗号分隔)
helm install myapp ./chart --set hostnames={host1.example.com,host2.example.com}

# 值中含逗号时用 --set-string 或转义
helm install myapp ./chart --set-string config.annotations.key="value,with,commas"

# --set-file:从文件读取 values(适合大型配置)
helm install myapp ./chart --set-file config.nginx=nginx.conf
--set 的注意事项

--set 中使用逗号分隔多个值,逗号本身需要转义(\,)。对于复杂配置建议使用 -f values.yaml 文件,更清晰且支持版本控制。密码等敏感信息不要用 --set,会记录在 shell 历史和 helm history 中,应使用 K8s Secret 或 Vault。

--values/-f:指定 Values 文件

# 使用自定义 values 文件覆盖默认值
helm install myapp ./chart -f values-prod.yaml

# 可以指定多个 -f,后面的覆盖前面的(深度合并)
helm install myapp ./chart \
  -f values-base.yaml \
  -f values-prod.yaml \
  -f values-secrets.yaml

# 升级时同样使用 -f
helm upgrade myapp ./chart -f values-prod.yaml
深度合并(Deep Merge)

多个 values 文件使用深度合并而非完全替换。例如 base 文件定义了 image.repository,prod 文件只需覆盖 image.tag,base 中的 image.repository 仍然有效。这让分层配置管理变得简单。

多环境 Values 文件管理

推荐的多环境目录结构

myapp/                        # Chart 目录
├── Chart.yaml
├── values.yaml               # 基础默认值
└── templates/

deploy/                       # 部署配置(可独立 Git 仓库)
├── values-dev.yaml           # 开发环境覆盖
├── values-staging.yaml       # 预发布环境覆盖
└── values-prod.yaml          # 生产环境覆盖
# values.yaml(基础默认值)
replicaCount: 1
image:
  repository: myregistry.io/myapp
  tag: "latest"
resources:
  requests:
    cpu: 50m
    memory: 64Mi
autoscaling:
  enabled: false
# values-dev.yaml(开发环境覆盖)
replicaCount: 1
image:
  tag: "dev-latest"
ingress:
  enabled: true
  hosts:
    - host: myapp-dev.internal.example.com
      paths:
        - path: /
          pathType: Prefix
# values-prod.yaml(生产环境覆盖)
replicaCount: 3
image:
  tag: "1.5.2"              # 生产环境使用固定版本
resources:
  requests:
    cpu: 200m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 20
ingress:
  enabled: true
  hosts:
    - host: myapp.example.com
      paths:
        - path: /
          pathType: Prefix
# 部署到开发环境
helm upgrade --install myapp-dev ./chart \
  -f deploy/values-dev.yaml \
  --namespace dev --create-namespace

# 部署到生产环境
helm upgrade --install myapp-prod ./chart \
  -f deploy/values-prod.yaml \
  --namespace production --create-namespace

子 Chart Values 覆盖

当 Chart 有子 Chart 依赖时,父 Chart 的 values.yaml 可以覆盖子 Chart 的 values。

# 父 Chart 的 values.yaml:覆盖子 Chart 的值
# 子 Chart 名称作为顶层 key

postgresql:                          # 子 Chart 名称
  enabled: true
  auth:
    postgresPassword: mypassword
  primary:
    persistence:
      size: 10Gi

redis:                                # 另一个子 Chart
  enabled: true
  auth:
    enabled: false

global Values:跨 Chart 共享

# global 是一个特殊的顶层 key
# 父 Chart 和所有子 Chart 都能访问
global:
  imageRegistry: myregistry.io
  imagePullSecrets:
    - registry-secret
  storageClass: fast-ssd
  env: production
# 子 Chart 模板中访问 global 值
image: "{{ .Values.global.imageRegistry }}/myapp:{{ .Values.image.tag }}"
{{- if .Values.global.imagePullSecrets }}
imagePullSecrets:
  {{- range .Values.global.imagePullSecrets }}
  - name: {{ . }}
  {{- end }}
{{- end }}

查看已安装 Release 的 Values

# 查看用户提供的 values(--set 和 -f 的内容)
helm get values myapp

# 查看所有 values(包括 Chart 默认值)
helm get values myapp --all

# 查看指定 Revision 的 values
helm get values myapp --revision 3

# 输出为 YAML 格式(默认)或 JSON
helm get values myapp --output json
实战建议:分离 Chart 与配置

将 Chart 代码(templates/、Chart.yaml)和环境配置(values-*.yaml)分开管理。Chart 代码存入应用仓库,环境配置存入独立的"配置仓库"或"GitOps 仓库",两者用不同的 CI/CD pipeline 管理,互不影响。

本章小结

Helm Values 系统采用深度合并策略,覆盖优先级从低到高:Chart 默认值 → 父 Chart values → -f 文件 → --set。多环境管理最佳实践是维护一个 base values.yaml 加上各环境专用的覆盖文件。global 是特殊键,父子 Chart 均可访问。生产环境中应使用固定版本号而非 latest,并将配置与代码分离存入 Git 进行版本管理。