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 中使用逗号分隔多个值,逗号本身需要转义(\,)。对于复杂配置建议使用 -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
多个 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 代码(templates/、Chart.yaml)和环境配置(values-*.yaml)分开管理。Chart 代码存入应用仓库,环境配置存入独立的"配置仓库"或"GitOps 仓库",两者用不同的 CI/CD pipeline 管理,互不影响。
Helm Values 系统采用深度合并策略,覆盖优先级从低到高:Chart 默认值 → 父 Chart values → -f 文件 → --set。多环境管理最佳实践是维护一个 base values.yaml 加上各环境专用的覆盖文件。global 是特殊键,父子 Chart 均可访问。生产环境中应使用固定版本号而非 latest,并将配置与代码分离存入 Git 进行版本管理。