跳转至

Helm:Kubernetes 应用打包与发布

Helm 是 Kubernetes 的包管理工具。一个应用通常需要 Deployment、Service、ConfigMap、Ingress、ServiceAccount 等多个资源;Helm 将这些模板、默认参数和版本信息组织成 Chart,每次安装到集群后形成一个 Release。

Chart 模板 + values.yaml + 环境覆盖值
  → helm template 渲染 Kubernetes YAML
  → helm install / upgrade 提交到 API Server
  → Release 保存本次发布及修订历史

核心概念

概念 作用 示例
Chart 可复用的应用安装包 order-service
Template 带 Go Template 表达式的 Kubernetes YAML templates/deployment.yaml
Values 传给模板的配置值 副本数、镜像、资源限制
Release Chart 在某个集群/Namespace 的一次安装实例 order-prod
Revision Release 每次安装、升级或回滚产生的修订号 1、2、3
Repository/OCI 保存和分发 Chart 企业 OCI Registry

Helm 不是 Kubernetes 的替代品,也不负责构建 Docker 镜像。它最终仍生成并提交 Kubernetes 资源。

学习 Helm 前,应先理解 Kubernetes 的 API 对象与 Manifest工作负载配置与密钥;否则模板虽然能渲染,也很难判断生成的资源是否正确。

Chart 目录

order-service/
├── Chart.yaml
├── values.yaml
├── values-dev.yaml
├── values-prod.yaml
├── templates/
│   ├── deployment.yaml
│   ├── service.yaml
│   ├── configmap.yaml
│   ├── ingress.yaml
│   └── _helpers.tpl
└── charts/

Chart.yaml 保存名称、Chart 版本和应用版本;values.yaml 提供安全默认值;环境文件只覆盖必要差异。不要为 dev/prod 复制两套完整模板。

Values 示例

replicaCount: 2

image:
  repository: registry.example.com/team/order-service
  tag: "1.4.0"
  pullPolicy: IfNotPresent

resources:
  requests:
    cpu: 200m
    memory: 512Mi
  limits:
    cpu: "1"
    memory: 1Gi

service:
  port: 8080

config:
  springProfilesActive: prod

生产发布使用确定的镜像版本或 digest,不使用 latest。密码不要放入普通 Values 或 Git,应对接 Secret 管理方案。

常用检查

helm lint ./order-service
helm template order-prod ./order-service \
  --namespace order \
  -f ./order-service/values-prod.yaml > rendered.yaml

kubectl apply --dry-run=server -f rendered.yaml

helm lint 只能发现部分 Chart 问题;helm template 用于查看最终 YAML;服务端 dry-run 能结合目标集群 API 校验,但仍不能保证应用逻辑和外部依赖正常。

安装与升级

helm upgrade --install order-prod ./order-service \
  --namespace order \
  --create-namespace \
  -f ./order-service/values-prod.yaml \
  --wait \
  --timeout 10m

upgrade --install 表示 Release 不存在则安装,存在则升级。发布后检查:

helm list -n order
helm status order-prod -n order
helm get values order-prod -n order
helm get manifest order-prod -n order
kubectl get pods -n order
kubectl get events -n order --sort-by=.lastTimestamp

回滚

helm history order-prod -n order
helm rollback order-prod 2 -n order --wait --timeout 10m

Helm 回滚会恢复之前保存的 Kubernetes Manifest,但不会自动回滚数据库结构、外部配置中心、消息格式和镜像外部数据。发布前仍需判断版本是否具备向后兼容性。

Values 覆盖顺序

Chart values.yaml
  → `-f values-common.yaml`
  → `-f values-prod.yaml`
  → `--set key=value`

后提供的值通常覆盖之前的值。生产中尽量把变更写进受版本控制的 Values 文件,减少大量 --set 导致实际配置无法追溯。

常见问题

现象 优先检查
模板渲染失败 YAML 缩进、变量路径、必填 Values、模板函数
升级超时 Pod 事件、镜像拉取、Probe、PVC、资源配额和调度
Values 改了但资源没变化 模板是否引用该值;实际使用了哪个 -fhelm get values
Release 存在但资源被手工改过 helm get manifest 与集群资源 diff,禁止长期手工漂移
回滚后应用仍异常 数据库/外部依赖是否不可逆;旧镜像与当前配置是否兼容
删除 Release 后数据丢失 PVC 保留策略、Hook 和资源注解是否经过验证

与 Argo CD 的关系

Helm 负责“怎样渲染一套 Kubernetes 资源”,Argo CD 负责“Git 中哪个版本应该持续运行在集群”。使用 Argo CD 后,日常发布应修改 Git 中的 Chart/Values,由 Argo CD 同步,而不是同时让人工 Helm 命令和 Argo CD 管理同一个 Release。

官方参考:Helm DocumentationUsing Helm