升级
升级 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 applyChart 包中的 CRD。 - webhook 证书或 CA bundle 变化可能导致 CRD 写入失败。
- 如果升级包含 server 认证逻辑变化,应先验证登录、刷新 token、Watch API 和 OpenAPI。