查看 Release 状态
# 列出所有 Release(当前 Namespace)
helm list
# 列出所有 Namespace 的 Release
helm list --all-namespaces
helm list -A # 简写
# 按 Namespace 筛选
helm list -n production
# 显示所有状态(包括 failed 的)
helm list --all
# 输出格式:table(默认)、json、yaml
helm list -o json
# 查看 Release 详情
helm status myapp
# 显示 NOTES.txt 内容、资源列表和状态
# STATUS: deployed / failed / pending-install / pending-upgrade
# 查看部署历史
helm history myapp
# 示例输出:
# REVISION UPDATED STATUS CHART APP VERSION
# 1 Mon Jan 1... superseded myapp-1.0.0 1.0.0
# 2 Tue Jan 2... superseded myapp-1.1.0 1.1.0
# 3 Wed Jan 3... deployed myapp-1.2.0 1.2.0
# 查看指定 Revision 的 manifest
helm get manifest myapp --revision 2
# 查看指定 Revision 的 values
helm get values myapp --revision 1
helm upgrade --install:幂等部署
helm upgrade --install 是 CI/CD 中最常用的命令:如果 Release 不存在则安装,如果已存在则升级,实现幂等操作。
# 幂等部署(install if not exists, upgrade if exists)
helm upgrade --install myapp ./chart \
-f values-prod.yaml \
--namespace production \
--create-namespace # Namespace 不存在时自动创建
# 等待所有资源就绪(--wait)
helm upgrade --install myapp ./chart \
-f values-prod.yaml \
--wait # 等待 Pod/PVC/Service 进入 Ready
--timeout 5m # 超时时间(默认 5m)
# 失败自动回滚(--atomic = --wait + 失败时回滚)
helm upgrade --install myapp ./chart \
-f values-prod.yaml \
--atomic # 升级失败时自动回滚到上一版本
--timeout 10m
# 升级失败清理(--cleanup-on-fail)
helm upgrade --install myapp ./chart \
--cleanup-on-fail # 失败时删除本次新创建的资源
--atomic vs --wait
--wait 只等待资源就绪,超时或失败后 Release 标记为 failed,不会自动回滚。--atomic 包含 --wait 的行为,且在失败时自动执行 rollback,适合生产 CI/CD 场景。
helm rollback:版本回滚
# 查看历史,确定要回滚到的版本号
helm history myapp
# 回滚到上一个版本(不指定 REVISION 则回滚到上一次)
helm rollback myapp
# 回滚到指定 Revision
helm rollback myapp 2 # 回滚到 Revision 2
# 回滚并等待就绪
helm rollback myapp 2 --wait
# 回滚后查看 history(会新增一个 Revision)
helm history myapp
# REVISION 4 是 rollback 操作,内容同 REVISION 2
Release 版本历史与回滚 Revision 1 v1.0.0 ← 初始安装 Revision 2 v1.1.0 ← upgrade Revision 3 v1.2.0 ← upgrade(失败) Revision 4 v1.1.0 ← rollback to Revision 2(内容与 R2 相同) Revision 5 v1.3.0 ← 下次 upgrade 注意:回滚会产生新 Revision,历史不会被删除
强制更新:--force
# --force:删除旧资源再创建新资源(而非 patch)
# 用于某些 immutable 字段变更时(如 Service 的 .spec.selector)
helm upgrade myapp ./chart --force
# 警告:--force 会导致短暂的服务中断!
# 只在普通 upgrade 因字段不可变而失败时使用
helm uninstall:卸载 Release
# 卸载 Release(删除所有相关 K8s 资源)
helm uninstall myapp
# 卸载并等待资源删除完成
helm uninstall myapp --wait
# 保留历史记录(默认不保留)
# Helm 3 默认删除 Release 历史,用 --keep-history 保留
helm uninstall myapp --keep-history
# 保留历史后可以用 helm rollback 重新部署
helm list --all # 可以看到 uninstalled 状态的 Release
helm rollback myapp 3 # 重新部署到 Revision 3
Release 历史存储原理
Helm 3 将 Release 历史存储在 K8s Secret 中(每个 Revision 一个 Secret),位于 Release 所在的 Namespace。
# 查看 Helm Release 使用的 Secret
kubectl get secrets -n production -l owner=helm
# 示例输出:
# NAME TYPE DATA AGE
# sh.helm.release.v1.myapp.v1 helm.sh/release.v1 1 3d
# sh.helm.release.v1.myapp.v2 helm.sh/release.v1 1 2d
# sh.helm.release.v1.myapp.v3 helm.sh/release.v1 1 1d
# Secret 内容是 gzipped + base64 编码的 Release 信息
# 包含:rendered YAML、values、Chart 元数据
Helm 2(Tiller + ConfigMap)
- Tiller 使用 ConfigMap 存储历史
- 存储在 kube-system Namespace
- ConfigMap 内容明文可见
- 权限集中,安全隐患大
Helm 3(Secret 存储)
- 使用 Secret 存储(类型 helm.sh/release.v1)
- 存储在 Release 所在的 Namespace
- 利用 K8s RBAC 控制访问权限
- 多租户集群下历史天然隔离
生产 CI/CD 部署脚本示例
#!/bin/bash
# deploy.sh:生产环境 Helm 部署脚本
RELEASE_NAME="myapp-prod"
CHART_PATH="./chart"
NAMESPACE="production"
VALUES_FILE="deploy/values-prod.yaml"
IMAGE_TAG="${CI_COMMIT_SHA:0:8}" # GitLab CI 提交 SHA 前 8 位
# 下载依赖
helm dependency build $CHART_PATH
# 预检:验证模板语法
helm lint $CHART_PATH -f $VALUES_FILE
helm template $RELEASE_NAME $CHART_PATH -f $VALUES_FILE --set image.tag=$IMAGE_TAG --dry-run > /dev/null
# 部署(幂等 + 自动回滚)
helm upgrade --install $RELEASE_NAME $CHART_PATH \
-f $VALUES_FILE \
--set image.tag=$IMAGE_TAG \
--namespace $NAMESPACE \
--create-namespace \
--atomic \
--timeout 10m
# 部署后冒烟测试
helm test $RELEASE_NAME --namespace $NAMESPACE --timeout 5m
echo "Deployment completed. Release: $RELEASE_NAME, Image: $IMAGE_TAG"
控制历史记录数量
默认 Helm 保留 10 条历史记录。可以通过 --history-max 控制(0 表示无限制):helm upgrade --history-max 5 ...。在频繁部署的系统中,限制历史记录数量可以避免 K8s etcd 中积累大量 Secret。
本章小结
Release 管理是 Helm 最重要的生产价值。helm upgrade --install --atomic 是 CI/CD 中最安全的幂等部署方式,失败自动回滚。helm history 和 helm rollback 提供完整的版本审计和快速回滚能力。Release 历史存储在 Namespace 内的 Secret 中,天然受 K8s RBAC 保护。生产部署流程:dependency build → lint → template dry-run → upgrade --atomic → helm test。