安装、升级与回滚
核心问题:Helm 怎样管理应用的完整生命周期——首次安装、版本升级、配置变更,以及出问题时快速回滚?
Helm Release 生命周期
stateDiagram-v2
[*] --> deployed: helm install
deployed --> deployed: helm upgrade(成功)
deployed --> failed: helm upgrade(失败)
failed --> deployed: helm rollback
deployed --> uninstalled: helm uninstall
uninstalled --> [*]
每次 install / upgrade / rollback 都创建一个新的 Release 修订版本(Revision),历史记录保存在集群的 Secret 中。
helm install
# 基本安装
helm install <release-name> <chart> [flags]
# 示例:安装到 production 命名空间,使用自定义 values
helm install my-api ./my-app \
--namespace production \
--create-namespace \
-f values/prod.yaml \
--set image.tag=v1.2.3 \
--set replicaCount=3
# 等待部署完成(readiness 通过)
helm install my-api ./my-app \
--namespace production \
-f values/prod.yaml \
--wait \
--timeout 5m
# 如果已存在则升级,不存在则安装(CI 常用)
helm upgrade --install my-api ./my-app \
--namespace production \
--create-namespace \
-f values/prod.yaml \
--wait
helm upgrade
# 升级应用版本
helm upgrade my-api ./my-app \
--namespace production \
-f values/prod.yaml \
--set image.tag=v1.3.0 \
--wait
# 只更新配置,不改镜像
helm upgrade my-api ./my-app \
--namespace production \
-f values/prod.yaml \
--reuse-values \ # 复用上次安装时的所有 values
--set config.logLevel=debug
# 升级失败自动回滚
helm upgrade my-api ./my-app \
--namespace production \
-f values/prod.yaml \
--wait \
--atomic # 失败时自动回滚到上一个稳定版本
# 清理旧版本 Secret(保留最近 5 个修订)
helm upgrade my-api ./my-app \
--namespace production \
-f values/prod.yaml \
--history-max 5
helm rollback
# 查看 Release 历史
helm history my-api -n production
# REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
# 1 2026-03-10 ... superseded my-app-1.0.0 v1.1.0 Install complete
# 2 2026-03-15 ... superseded my-app-1.1.0 v1.2.0 Upgrade complete
# 3 2026-03-20 ... deployed my-app-1.2.0 v1.3.0 Upgrade complete
# 回滚到上一个版本
helm rollback my-api -n production
# 回滚到指定修订版本
helm rollback my-api 2 -n production --wait
# 强制重建(解决资源状态异常)
helm rollback my-api 2 -n production --force
值的优先级(从高到低)
# 命令行 --set(最高优先级)
helm install my-api ./my-app \
-f values/base.yaml \ # 先加载
-f values/prod.yaml \ # 覆盖 base
--set image.tag=v1.3.0 \ # 最高优先级,覆盖所有文件
--set-string config.flag=true # 强制字符串类型
多 values 文件组合(推荐模式)
values/
├── base.yaml # 公共默认值(所有环境共用)
├── dev.yaml # 开发环境差异
├── staging.yaml # 测试环境差异
└── prod.yaml # 生产环境差异
# 开发环境
helm upgrade --install my-api ./my-app -n dev \
-f values/base.yaml -f values/dev.yaml
# 生产环境
helm upgrade --install my-api ./my-app -n production \
-f values/base.yaml -f values/prod.yaml \
--set image.tag=$CI_COMMIT_SHA
管理第三方 Chart
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update # 更新本地缓存
# 搜索 Chart
helm search repo postgresql
helm search hub nginx # 搜索 Artifact Hub
# 查看 Chart 的 values 参数
helm show values bitnami/postgresql
helm show values bitnami/postgresql > postgresql-values.yaml # 保存为文件再修改
# 安装 PostgreSQL
helm upgrade --install postgres bitnami/postgresql \
--namespace production \
--version 13.2.0 \ # 锁定 Chart 版本!
-f postgresql-values.yaml
Helmfile:多 Chart 统一管理
当一个环境需要安装多个 Chart 时,用 Helmfile 统一管理:
# helmfile.yaml
repositories:
- name: bitnami
url: https://charts.bitnami.com/bitnami
- name: ingress-nginx
url: https://kubernetes.github.io/ingress-nginx
releases:
- name: ingress-nginx
namespace: ingress-nginx
chart: ingress-nginx/ingress-nginx
version: "4.8.0"
values:
- controller:
replicaCount: 2
- name: cert-manager
namespace: cert-manager
chart: jetstack/cert-manager
version: "1.13.0"
set:
- name: installCRDs
value: "true"
- name: my-api
namespace: production
chart: ./charts/my-app
values:
- values/base.yaml
- values/{{ .Environment.Name }}.yaml # 按环境加载
set:
- name: image.tag
value: {{ env "IMAGE_TAG" | default "latest" }}
needs:
- ingress-nginx/ingress-nginx # 依赖顺序
# 安装所有
helmfile sync
# 只安装指定 release
helmfile -l name=my-api sync
# 查看差异
helmfile diff
# 环境切换
helmfile -e staging sync
常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
cannot re-use a name that is still in use | Release 名已存在,用了 install 而非 upgrade --install | 改用 helm upgrade --install |
context deadline exceeded | 超时(Pod 启动慢,超过 --timeout) | 增大 --timeout,或排查 Pod 为何未 Ready |
UPGRADE FAILED: another operation is in progress | 上次操作未完成,Release 处于 pending-upgrade 状态 | helm rollback <release> <revision> 恢复状态,或 helm history 找到上个稳定版本 |
rendered manifests contain a resource that already exists | 集群已有同名资源(非 Helm 管理的) | 用 helm upgrade --install --force 或手动删除冲突资源 |
下一节:自定义 Chart 开发