通过 ocboot 升级
介绍如何通过 ocboot 升级服务版本到指定版本。
ocboot 只能升级通过 ocboot 部署的环境,如果你的环境是通过 docker compose 或者 helm 部署的,请参考对应部署文档里面的升级操作。
前提条件
版本升级建议从相邻的版本升级,比如从 v3.8.x 升级到 v3.10.x 需要以下的步骤:
- v3.8.x => v3.9.x
- v3.9.x => v3.10.x
总体来说,升级的步骤如下:
使用我们编写的 ocboot 工具进行升级,这个工具主要是调用 ansible 来升级集群里面的所有节点。
查看当前版本
可以使用 kubectl 查看当前集群的版本
# 使用 kubectl 获得当前集群的版本
$ kubectl -n onecloud get onecloudclusters default -o=jsonpath='{.spec.version}'
v3.10.15 # 发现当前版本为 v3.10.15
下载 ocboot 工具
如果本地已经有都应版本的代码,可以跳过下面的步骤,但一般情况下,随着每次新版本发布,都会有对应的 ocboot 部署工具发布,需要使用对应的版本来更新。
下载部署工具
部署的工具代码在 https://github.com/yunionio/ocboot/release,选择对应的版本,把代码的 tar.gz 包下载下来。
$ wget https://github.com/yunionio/ocboot/archive/refs/tags/master-v3.11.8-2.tar.gz
$ tar xf master-v3.11.8-2.tar.gz
$ cd ocboot-master-v3.11.8-2
升级服务组件
前提
更新服务的原理是通过本机 ssh 免密码远程登录到集群的第一个控制节点,获取所有节点的信息后,然后通过 ansible 执行 playbook 更新,所以有以下要求:
- 本机能够 ssh 远程登录 PRIMARY_MASTER_HOST
- PRIMARY_MASTER_HOST 能够 ssh 免密码登录集群中的其它节点
如果没有设置免密码登录,请使用 ssh-copy-id -i ~/.ssh/id_rsa.pub root@PRIMARY_MASTER_HOST
命令把公钥下发到自己环境对应的节点。
可升级的版本号可以到 发布日志 3.11 页面 查询。
执行升级命令
下面命令使用 ocboot 相关服务升级到高版本,该步骤会因为拉取 docker 镜像等待较长时间,请耐心等待。
PRIMARY_MASTER_HOST 是指部署集群的第一个节点的 ip 地址,需要本机能够使用 ssh 密钥登录上去。
$ ./ocboot.sh upgrade <PRIMARY_MASTER_HOST> v3.11.8
另外可以使用 ./ocboot.sh upgrade --help
查看其它可选参数。
- --user 可以指定其它 ssh 用户
- --port 指定 ssh 端口
- --key-file 指定另外的 ssh private key
- --as-bastion 可以让 PRIMARY_MASTER_HOST 作为堡垒机部署在内网的宿主机
查看升级过程
可以 在升级的过程中可以登录到 PRIMARY_MASTER_HOST, 使用 kubectl 查看对应 pods 的升级情况。
$ kubectl get pods -n onecloud --watch
降级相关
如果升级后遇到功能不符合预期或者 bug 之类的问题,可以通过下面的命令降级回滚。
- 一般小版本降级没有问题,比如从 v3.10.7 降级到 v3.10.6
- 跨版本降级可能会有问题,比如从 v3.10.7 降级到 v3.9.15
如果遇到问题请到 GitHub 提 issue 或者 联系我们 获取帮助。
回滚操作
ocboot 从 v3.9.7 版本起,每次升级集群服务的时候,会把 operator 的 deployment 和 onecloudcluster 的 yaml 文件备份到 /opt/yunion/ocboot/_upgrade/
里面,方便以后手动回滚组件。
当出现升级失败,或者升级后想要回退到升级前的版本,可以使用以下的操作:
# 查看 /opt/yunion/ocboot/_upgrade/ 目录里面的升级备份目录
# 里面的子目录以升级前时间作为目录名
$ ls /opt/yunion/ocboot/_upgrade/
2023.02.20-10:10:07
# 比如想要回退到 2023.02.20-10:10:07 前的版本,就进行以下操作
$ cd /opt/yunion/ocboot/_upgrade/2023.02.20-10\:10\:07/
# 查看相关 yaml 文件
$ ls -lh
-rw-r--r-- 1 root root 61K Feb 20 10:10 oc.yml # oc.yaml 为 onecloudcluster 描述文件
-rw-r--r-- 1 root root 3.9K Feb 20 10:10 operator.yml # operator.yaml 为 operator deployment 描述文件
# 先回退 operator
$ kubectl apply -f operator.yml
deployment.extensions/onecloud-operator configured
# 等到新创建的 operator 变成 Running,如果是 ContainerCreating 状态就等待一段时间
$ kubectl get pods -n onecloud | grep operator
onecloud-operator-5557d86d74-7s5sl 1/1 Running 0 2s
# 再回退 onecloudcluster 就可以了
$ kubectl apply -f oc.yml