1. Helm 与 Values 概述

Helm 是 Kubernetes 生态中最流行的包管理器,它通过 Chart 将一组 Kubernetes 资源模板打包、版本化并发布到集群中。在生产环境中,不同集群(开发、测试、生产)往往需要同一套应用定义但配置不同,Helm 的 Values 参数化设计 正是解决这一问题的核心机制。

1.1 什么是 Helm

Helm 由客户端 CLI 和服务器端组件 Tiller(v2)或直接与 Kubernetes API 交互(v3)组成。它把 Kubernetes 资源(Deployment、Service、ConfigMap 等)组织成可复用的 Chart,支持模板渲染、依赖管理和版本回滚。

特性 说明
包管理 类似 apt/yum,但面向 Kubernetes 资源
模板引擎 基于 Go template 实现动态渲染
版本控制 支持 release 升级、回滚、历史记录
依赖管理 Chart 可依赖其他 Chart,自动解析

1.2 Chart 目录结构

一个标准的 Helm Chart 目录结构如下:

my-chart/
├── Chart.yaml          # Chart 元数据(名称、版本、描述)
├── values.yaml         # 默认参数值
├── values.schema.json  # (可选)参数校验 JSON Schema
├── charts/             # 子 Chart 依赖
├── templates/          # Go template 资源模板
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── _helpers.tpl    # 模板辅助函数
│   └── NOTES.txt       # 安装后提示信息
└── README.md
关键点:templates/ 目录下的 YAML 文件使用 Go template 语法,通过 .Values 对象引用 values.yaml 中定义的参数。这种分离使得模板逻辑与配置数据解耦。

1.3 Values 文件的作用

Values 文件是 Helm 参数化设计的核心。它定义了模板中所有可变参数的默认值,用户可以在安装或升级时通过 --values 或 --set 覆盖这些值。

典型的 values.yaml 示例:

replicaCount: 3

image:
  repository: nginx
  tag: "1.25"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

resources:
  limits:
    cpu: 500m
    memory: 512Mi
  requests:
    cpu: 200m
    memory: 256Mi

ingress:
  enabled: false
  host: example.com

在模板中通过 {{ .Values.replicaCount }} 引用参数,Helm 渲染时会将 values.yaml 中的值注入模板。

1.4 为什么需要参数化设计

没有参数化时,每个环境需要维护一套完整的 YAML 副本,修改一个参数就要同步所有文件。参数化设计带来以下收益:

  • 配置复用:同一 Chart 通过不同 values 文件适配开发、测试、生产环境
  • 减少重复:模板只写一次,参数通过 values 文件注入
  • 环境隔离:敏感参数(密码、密钥)通过外部 values 注入,不写入模板
  • 版本化管理:values 文件可纳入 Git,实现配置变更可追溯
  • 团队协作:开发人员关注模板逻辑,运维人员关注 values 配置
核心价值:参数化设计将“应用定义”与“环境配置”分离,使得一套 Chart 可以驱动任意数量的集群,大幅降低多环境维护成本。

1.5 Helm Values 参数化架构

下图展示了 Helm 参数化设计的核心流程:Chart 模板作为静态骨架,Values 文件提供动态数据,两者在 Helm 引擎中合并渲染出最终的 Kubernetes 资源清单。

Helm Values 参数化架构图 Helm Values 参数化架构 Chart 模板 templates/deployment.yaml templates/service.yaml templates/_helpers.tpl Values 文件 values.yaml(默认值) --values prod.yaml --set image.tag=1.26 Helm 渲染引擎 Go Template + Values 合并 Kubernetes 资源清单 模板定义资源结构 Values 提供环境差异 输出完整 YAML 直接 apply 到集群

1.6 多环境配置复用示例

假设有一个 Web 应用,需要部署到开发、测试、生产三个集群。通过参数化设计,只需维护一个 Chart,配合三个 values 文件:

参数 dev-values.yaml staging-values.yaml prod-values.yaml
replicaCount 1 2 5
resources.limits.cpu 200m 500m 2
ingress.enabled false true true
ingress.host — staging.example.com www.example.com

部署命令:

# 开发环境
helm install my-app ./my-chart -f dev-values.yaml

# 测试环境
helm install my-app ./my-chart -f staging-values.yaml

# 生产环境
helm install my-app ./my-chart -f prod-values.yaml
注意:values 文件中的敏感信息(如数据库密码)不应直接写入 Git 仓库。建议使用 Helm 的 --set 参数、外部 Secret 存储或 Helm Secrets 插件管理敏感数据。

1.7 本章小结