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 资源清单。
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 插件管理敏感数据。