Chapter 08

Release 管理

掌握 Helm Release 的完整生命周期:查看状态、幂等升级、自动回滚、手动回滚与强制更新,以及 Release 历史的存储机制。

查看 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 historyhelm rollback 提供完整的版本审计和快速回滚能力。Release 历史存储在 Namespace 内的 Secret 中,天然受 K8s RBAC 保护。生产部署流程:dependency build → lint → template dry-run → upgrade --atomic → helm test。