Helmfile K8s 多环境部署
bash
macOS
brew install helmfile
Linux (通过脚本)
curl -fsSL https://raw.githubusercontent.com/helmfile/helmfile/main/install.sh | bash
或前往 GitHub Releases 页面下载对应平台的二进制文件
验证安装:
```bash
helmfile --version
项目结构:一切从目录开始
一个典型的 Helmfile 项目遵循约定优于配置的原则。推荐使用以下目录布局:
myapp-deploy/
├── helmfile.yaml # 主声明文件,定义 Release 和环境
├── environments/ # 环境专属配置
│ ├── dev/
│ │ ├── values.yaml
│ │ └── secrets.yaml # 可加密的敏感信息
│ ├── staging/
│ │ └── values.yaml
│ └── prod/
│ └── values.yaml
└── charts/ # (可选) 本地 chart 目录
helmfile.yaml:描述整个应用栈的 Release 列表、每个 Release 使用的 Chart、以及环境引用规则。environments/:按环境存放差异化的 values 文件,文件名可自由定义。- 环境变量
ENVIRONMENT或命令行-e参数用于选择当前操作的目标环境。
编写主配置文件 helmfile.yaml
以下示例部署一个名为 my-app 的简单应用,包含一个后端服务和前端界面。
environments:
default:
values:
- environments/default/values.yaml
dev:
values:
- environments/dev/values.yaml
staging:
values:
- environments/staging/values.yaml
prod:
values:
- environments/prod/values.yaml
releases:
- name: backend
namespace: {{ .Environment.Name }}-backend # 通过环境名分隔命名空间
chart: bitnami/nginx
version: 15.0.0
values:
- ./config/backend-values.yaml.gotmpl # 模板 values,可使用环境变量
- {{ .Environment.Values | getOrNil "backendOverrides" | default nil }}
- name: frontend
namespace: {{ .Environment.Name }}-frontend
chart: bitnami/apache
version: 10.0.0
values:
- ./config/frontend-values.yaml.gotmpl
要点解析:
environments块定义了可用环境以及各自加载的 values 文件列表。- 每个
release代表一个 Helm Chart 的实例。 namespace字段使用模板语法{{ .Environment.Name }}动态插入环境名,保证隔离性。values支持多种来源:直接文件、模板文件(.gotmpl)、以及从环境 values 中动态提取的部分(此处用getOrNil实现可选覆盖)。
环境专属 values 文件示例
environments/dev/values.yaml
replicaCount: 1
image:
tag: "dev-latest"
ingress:
enabled: false
backendOverrides:
metrics:
enabled: false
environments/prod/values.yaml
replicaCount: 3
image:
tag: "v1.5.2"
ingress:
enabled: true
hosts:
- myapp.prod.example.com
backendOverrides:
metrics:
enabled: true
serviceMonitor: true
config/backend-values.yaml.gotmpl
# 使用模板语法灵活组合环境变量和固定配置
replicaCount: {{ .Values.replicaCount | default 1 }}
image:
repository: myregistry/backend
tag: {{ .Values.image.tag }}
metrics:
enabled: {{ .Values | getOrNil "metrics.enabled" | default false }}
Helmfile 使用 Go 模板渲染 .gotmpl 文件,因此可以动态引用环境 values 中的任意字段。通过 {{ .Values }} 可以访问到当前环境加载的所有 values 合并后的字典。
命令行操作:部署、对比、销毁
Helmfile 将重复的手动工作收敛为几个简洁命令。
部署到开发环境
helmfile -e dev apply
此命令会:
- 添加所有需要的 Chart 仓库(首次执行时)。
- 根据环境 values 渲染模板。
- 按顺序执行
helm upgrade --install,确保每个 Release 达到期望状态。
查看差异(重要安全实践)
在生产操作前,务必先运行 diff 来预览变化:
helmfile -e prod diff
输出类似 git diff 的对比结果,展示哪些 Kubernetes 资源将要新增、修改或删除。这能有效避免意外变更。
仅同步特定 Release
helmfile -e staging apply --selector name=backend
或者使用标签:
releases:
- name: backend
labels:
tier: backend
- name: frontend
labels:
tier: frontend
helmfile -e staging apply --selector tier=backend
销毁整个环境
helmfile -e dev destroy
该命令会删除该环境下的所有 Release(不删除命名空间,需手动清理)。
高级技巧:敏感信息与复杂场景
使用 vals 管理密钥
Helmfile 集成了 vals,支持从 Vault、AWS Secrets Manager、GCP Secret Manager 等后端获取敏感数据,并在渲染 values 时注入。
在 helmfile.yaml 中配置:
bases:
- environments.yaml # 公共基础配置
environments:
prod:
values:
- environments/prod/values.yaml
secrets:
- environments/prod/secrets.yaml
environments/prod/secrets.yaml 内容可以使用 vals 语法:
databasePassword: ref+awssecrets://my-app/prod/db_password
apiKey: ref+vault://secret/data/myapp/prod#/api_key
然后通过 helmfile -e prod apply 自动解密并注入。
条件发布与 Needs
releases:
- name: database
...
- name: backend
needs:
- database # 确保数据库先部署
...
needs 字段控制 Release 的部署顺序,解决依赖问题。
共享基础配置
使用 bases 和 helmfile.d 目录模式,可将公共的 Repository、环境定义等抽取出来:
# bases/repositories.yaml
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
- name: my-private
url: https://charts.example.com
主文件引用:
bases:
- bases/repositories.yaml
多集群/多上下文管理
通过设置 kubeContext 可直接指定部署的目标 Kubernetes 上下文:
environments:
prod-us-east:
kubeContext: us-east-prod
values:
- environments/prod-us-east/values.yaml
prod-eu-west:
kubeContext: eu-west-prod
values:
- environments/prod-eu-west/values.yaml