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 回滚会恢复之前保存的 Kubernetes Manifest,但不会自动回滚数据库结构、外部配置中心、消息格式和镜像外部数据。发布前仍需判断版本是否具备向后兼容性。
Values 覆盖顺序¶
后提供的值通常覆盖之前的值。生产中尽量把变更写进受版本控制的 Values 文件,减少大量 --set 导致实际配置无法追溯。
常见问题¶
| 现象 | 优先检查 |
|---|---|
| 模板渲染失败 | YAML 缩进、变量路径、必填 Values、模板函数 |
| 升级超时 | Pod 事件、镜像拉取、Probe、PVC、资源配额和调度 |
| Values 改了但资源没变化 | 模板是否引用该值;实际使用了哪个 -f;helm 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 Documentation、Using Helm。