跳到主要内容

升级

升级 Testudo 时应把 Chart、CRD、operator、server、web 和 values 文件作为一个发布单元处理,避免只升级其中一部分。

升级前检查

helm ls -n disaster-system
kubectl -n disaster-system get pods
kubectl -n disaster-system get disasteroperation
kubectl -n disaster-system get appbackups,apprestores

升级前确认:

  • 没有正在执行的 failover、reprotect、undo、cancel、drill cleanup。
  • 没有关键备份或恢复任务正在运行。
  • 已备份当前 values 文件。
  • 已记录当前 Chart 包、镜像 tag 和 CRD 版本。
  • 新版本的兼容性矩阵已确认。

备份当前状态

helm get values testudo -n disaster-system -o yaml > values-current.yaml
helm get manifest testudo -n disaster-system > manifest-current.yaml

kubectl get crd | grep testudo.softcdata.com
kubectl -n disaster-system get disasterinstances.testudo.softcdata.com -o yaml > disasterinstances-backup.yaml
kubectl -n disaster-system get disastergroups.testudo.softcdata.com -o yaml > disastergroups-backup.yaml

不要把包含真实凭据的 values 或 CRD 导出文件提交到公开仓库。

Dry-run

helm template testudo ./testudo-chart-1.0.0.tgz \
-n disaster-system \
-f values-prod.yaml > rendered-new.yaml

helm upgrade testudo ./testudo-chart-1.0.0.tgz \
-n disaster-system \
-f values-prod.yaml \
--dry-run

重点检查:

  • CRD 是否变化。
  • webhook 配置是否变化。
  • Service 端口是否变化。
  • 镜像 tag 是否和发布说明一致。
  • global.namespace 是否与 release namespace 一致。

同步 CRD schema

Helm 对 Chart crds/ 目录有特殊处理:安装时会创建 CRD,但 helm upgrade 不会自动更新集群中已经存在的 CRD。只要新版本包含 CRD schema 变更,就必须显式 apply Chart 包中的 CRD manifest。

如果本次发布只改了 CRD,不需要执行 helm upgrade。直接 apply CRD 并完成校验即可:

mkdir -p /tmp/testudo-chart-crds
tar -xzf ./testudo-chart-1.0.0.tgz -C /tmp/testudo-chart-crds
CHART_DIR=/tmp/testudo-chart-crds/testudo-chart

kubectl apply --server-side --force-conflicts -f "$CHART_DIR/crds/operator-crds.yaml"
kubectl apply --server-side --force-conflicts -f "$CHART_DIR/crds/velero-crds.yaml"

kubectl wait --for condition=Established --timeout=120s crd \
appbackups.testudo.softcdata.com \
apprestores.testudo.softcdata.com \
disasterinstances.testudo.softcdata.com \
disasterconfigs.testudo.softcdata.com \
resourcesyncs.testudo.softcdata.com \
backups.velero.io \
restores.velero.io \
schedules.velero.io

如果本次发布同时包含 CRD 和 runtime 资源变更,先 apply CRD,等待 Established=True,再执行 helm upgrade。这样可以避免新 controller 或 webhook 使用新字段时,API server 仍按旧 schema 拒绝或裁剪字段。

执行升级

helm upgrade testudo ./testudo-chart-1.0.0.tgz \
-n disaster-system \
-f values-prod.yaml

升级过程中观察:

kubectl -n disaster-system rollout status deploy/disaster-server
kubectl -n disaster-system rollout status deploy/disaster-web
kubectl -n disaster-system rollout status deploy/disaster-operator-controller-manager
kubectl -n disaster-system get events --sort-by=.lastTimestamp

升级后验证

kubectl api-resources | grep testudo.softcdata.com
kubectl get crd disasterinstances.testudo.softcdata.com -o yaml | grep -E "rewriteImage|sourcePrefix|targetPrefix" || true
kubectl -n disaster-system get pods,svc
curl -I http://<NodeIP>:30087

在控制台确认:

  • 首页统计正常。
  • 集群、存储、实例列表能加载。
  • 现有 DisasterInstance 状态未异常变化。
  • Watch 事件流正常。
  • 新建一次小范围备份或演练验证链路。

风险与限制

  • 不建议在长流程操作执行中升级。
  • CRD schema 变化需要先读发布说明,确认是否有迁移步骤,并显式 kubectl apply Chart 包中的 CRD。
  • webhook 证书或 CA bundle 变化可能导致 CRD 写入失败。
  • 如果升级包含 server 认证逻辑变化,应先验证登录、刷新 token、Watch API 和 OpenAPI。