Helmfile K8s 多环境部署

FreeGuideOnline 最新 2026-07-12

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

此命令会:

  1. 添加所有需要的 Chart 仓库(首次执行时)。
  2. 根据环境 values 渲染模板。
  3. 按顺序执行 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 的部署顺序,解决依赖问题。

共享基础配置

使用 baseshelmfile.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