版本 3.16 和 3.18 支持的 GitLab 版本落后于官方版本。升级 GitLab 至最新官方版本需要超过 10 次升级才能完成。升级到 4.0 后,产品不提供自动升级至 17.8.z 的功能。本方案解决如何从 14.0.12 升级到 17.8.z。
鉴于版本跨度较大,采用数据迁移的方式进行升级。升级所需时间因 GitLab 数据大小差异较大,可能需要数天完成,因此需提前评估维护时间窗口。
测试数据:包含 3 个项目(1 个 666MB 大项目,2 个空项目),备份文件大小 668MB,升级耗时 8 小时。
数据迁移路径
根据官方升级路径文档,数据迁移路径如下:
最后备份 17.8.1 的数据并导入平台部署的 17.8.z 实例,完成数据迁移。
备份平台部署的 GitLab 并恢复至 all-in-one 镜像部署的 GitLab,使用 all-in-one 镜像升级至 17.8.1,最后将数据备份恢复到平台部署的 17.8.z 实例。
最新 GitLab 实例和 operator 版本请参考Release Note。
在执行主机安装 kubectl、yq、base64 等工具。
配置环境变量(注意:此时 gitlab-operator 版本未升级,仍对应 GitLab 14.0.12 的 operator 版本)
准备升级所需 PVC,需在旧 GitLab 部署的命名空间内创建
准备升级所需镜像。下载附件中各版本镜像并推送至 GitLab 部署集群可拉取的镜像仓库。镜像下载链接:
启用 GitLab 14 的 task-runner 以执行备份命令
设置 gitlab 14 为只读模式
为 gitlab 14 task-runner 设置备份 PVC,PVC 名称为 backup-pvc(PVC 需提前创建,大小需根据 gitlab 数据量评估)
备份 gitlab 14 数据
使用 all-in-one 镜像部署 14.0.12 gitlab。
将以下 yaml 应用到 gitlab 部署命名空间,yaml 已将 backup pvc(backup-pvc)挂载到备份目录(如需在升级过程中访问 gitlab 实例,需替换 yaml 中的 IP 和 nodeport 端口)。
将备份数据恢复到 all-in-one 部署的 14.0.12 gitlab。
恢复过程中会出现数据库相关错误,must be owner
和 does not exist
是预期行为,详情见 (https://gitlab.com/gitlab-org/gitlab/-/issues/266988)。
使用 all-in-one 模式逐版本升级 gitlab 至 17.8.1。需依次替换升级路径中的 gitlab 镜像。
升级路径:14.0.12 → 14.3.6 → 14.9.5 → 14.10.5 → 15.0.5 → 15.4.6 → 15.11.13 → 16.3.8 → 16.7.9 → 16.11.10 → 17.3.6 → 17.5.5 → 17.8.1
升级 14.0.12 至 14.3.6
升级 14.3.6 至 14.9.5:替换镜像标签为 14.9.5-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 14.9.5 至 14.10.5:替换镜像标签为 14.10.5-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 14.10.5 至 15.0.5:替换镜像标签为 15.0.5-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 15.0.5 至 15.4.6:替换镜像标签为 15.4.6-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 15.4.6 至 15.11.13:替换镜像标签为 15.11.13-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 15.11.13 至 16.3.8:替换镜像标签为 16.3.8-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 16.3.8 至 16.7.9:替换镜像标签为 16.7.9-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 16.7.9 至 16.11.10:替换镜像标签为 16.11.10-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 16.11.10 至 17.3.6:替换镜像标签为 17.3.6-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 17.3.6 至 17.5.5:替换镜像标签为 17.5.5-ce.0,其他操作同“14.0.12 到 14.3.6”。
升级 17.5.5 至 17.8.1:替换镜像标签为 17.8.1-ce.0,其他操作同“14.0.12 到 14.3.6”。
在 17.8.1 部署 pod 中执行备份。
使用 operator 在平台部署 gitlab 17.8.z 并启用 toolbox(注意需与旧实例处于同一命名空间),然后将数据恢复到 operator 部署的 gitlab 17.8.z(将平台部署的 gitlab 名称设置为环境变量 NEW_GITLAB_NAME)。
在 gitlab 17.8.z 中添加以下值以启用 gitlab 17.8.z toolbox:
恢复过程中可能出现数据库相关错误,must be owner 和 does not exist 是预期行为,详情见 (https://gitlab.com/gitlab-org/gitlab/-/issues/266988)
验证升级后数据与升级前数据是否一致。
数据验证完成后,手动清理旧实例。
执行备份数据时,task-runner 容器被杀死,需要给 task-runner 容器添加请求和限制资源(至少 2c4g),然后重启 task-runner 并重新备份。
恢复备份到平台部署的 17.8.z 时,toolbox 容器被杀死,需要给 toolbox 容器添加请求和限制资源(至少 2c4g)。
升级备份不包含外部附件图片和头像,升级后页面无法显示附件图片和上传头像。可将 17.8.z PVC 替换为 14.0.12 的镜像存储 PVC。