官方的in-place upgrade直接在线升级的参考链接

https://docs.openshift.com/container-platform/3.11/upgrading/automated_upgrades.html

优点:

  • 保障最大时间的可用性,能够对外提供服务
  • 针对node的升级可以设定步长,并行升级好几个节点

存在的问题

  • 只能一个一个版本的升无法做到跨版本升级,如果一次跨越多个版本,并且集群规模比较大的化,就需要花费很长的时间了
  • 实际生产过程中因为是分布式环境,所以机器量一般都比较大。升级的时间消耗比较长,而且容易出问题。
  • 出现问题后回退不容易,回退到哪个版本也需要做决定。

前些天找到一个reshifter的工具,支持通过备份恢复的方式升级,详细参考

https://blog.openshift.com/introducing-reshifter-kubernetes-backup-restore-migrate-upgrade/

https://github.com/mhausenblas/reshifter

昨天尝试了一把,在我的环境中发现不太靠谱,在3.6环境中备份会出来一个/tmp/reshifter/目录下的一个包,然后在新的环境3.11中(master机器的ip变了,但机器名没变,然后节点数增加了),导入restore发现把这些所有节点的Role都搞没了,具体原因还没有分析,但根据reshifter的提示信息,初步理解是reshifter备份了etcd的键值,然后恢复的时候直接导入到新环境中,从而把新环境的键值给冲了。

而这篇文章的方法是,放弃原来的master节点,直接找一台新的master机器,安装新的版本3.11集群模式,同时将原有的旧节点(3.6版本)覆盖成新的版本。

这种模式好处是:

  • 保留了之前master的信息,备份原有节点/etc/origin/nodes的信息,一旦有问题,有快速恢复的可能。(没有尝试过)
  • 最快的方式进行跨版本升级

需要注意的地方是:

  • 做好各种应用和配置的备份
  • 和in place upgrade升级比较起来,在升级过程中,无法提供对外服务。

下面就是这次实验的主要记录,因为我修改了新的master的ip地址,所以可能对于节点有一系列相关的改动,如果不修改直接用原来的IP(把原来master停掉),有的地方可能不需要变更。

1.原有集群备份

基于每个project备份

  • 先列一下有啥东西
[root@master ~]# oc get all -n myproject
NAME DOCKER REPO TAGS UPDATED
is/tomcat docker-registry.default.svc:/myproject/tomcat -slim minutes ago NAME REVISION DESIRED CURRENT TRIGGERED BY
dc/tomcat config,image(tomcat:-slim) NAME DESIRED CURRENT READY AGE
rc/tomcat- 3m NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
routes/tomcat tomcat-myproject.app.example.com tomcat -tcp None NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/tomcat 172.30.66.175 <none> /TCP 3m NAME READY STATUS RESTARTS AGE
po/tomcat--6c3s0 / Running 3m
  • 备份所有项目对象
[root@master ~]# oc get -o yaml --export all > project.yaml
[root@master ~]# ls
anaconda-ks.cfg project.yaml tomcat.tar
  • 备份serviceaccount,secrets,pvc等等信息
[root@master ~]# for object in rolebindings serviceaccounts secrets imagestreamtags podpreset cms egressnetworkpolicies rolebindingrestrictions limitranges resourcequotas pvcs templates cronjobs statefulsets hpas deployments replicasets poddisruptionbudget endpoints
> do
> oc get -o yaml --export $object > $object.yaml
> done
the server doesn't have a resource type "cms"
the server doesn't have a resource type "pvcs"
the server doesn't have a resource type "hpas"
[root@master ~]# ls
anaconda-ks.cfg egressnetworkpolicies.yaml limitranges.yaml pvcs.yaml rolebindings.yaml templates.yaml
cms.yaml endpoints.yaml poddisruptionbudget.yaml replicasets.yaml secrets.yaml tomcat.tar
cronjobs.yaml hpas.yaml podpreset.yaml resourcequotas.yaml serviceaccounts.yaml
deployments.yaml imagestreamtags.yaml project.yaml rolebindingrestrictions.yaml statefulsets.yaml

2.新版本集群安装

比如3.11, 加入一个fresh机器作为新的master节点

原有节点需要完成的工作包括:

  • 删除节点配置信息

在原来的node1.example.com, node2.example.com中进行如下操作,如果不删除配置将无法产生csr的请求

rm -rf /etc/origin/node/*
vi /etc/origin/node/resolv.conf

# nameserver updated by /etc/NetworkManager/dispatcher.d/-origin-dns.sh
# Generated by NetworkManager
search cluster.local example.com
nameserver 192.168.56.113
  • 更新/etc/hosts文件指到新的master.example.com的地址
192.168.56.113    master.example.com
192.168.56.104 node1.example.com
192.168.56.105 node2.example.com
192.168.56.115 node3.example.com
192.168.56.115 registry.example.com

地址里面,node1,node2是3.6的版本,而node3是新节点。

  • 修改ocp.repo指到新的yum源
  • 建立节点互信
ssh-copy-id root@node1.example.com
ssh-copy-id root@node2.example.com

master配置

master.example.com中的/etc/ansible/hosts文件

[root@master ~]# cat /etc/ansible/hosts
[OSEv3:children]
masters
nodes
etcd # Set variables common for all OSEv3 hosts
[OSEv3:vars]
# SSH user, this user should allow ssh based auth without requiring a password
ansible_ssh_user=root # If ansible_ssh_user is not root, ansible_become must be set to true
#ansible_become=true openshift_deployment_type=openshift-enterprise
openshift_image_tag=v3.11.16
openshift_pkg_version=-3.11. openshift_master_default_subdomain=apps.example.com
openshift_docker_options="--selinux-enabled --insecure-registry 172.30.0.0/16 --log-driver json-file --log-opt max-size=50M --log-opt max-file=3 --insecure-registry registry.example.com --add-registry registry.example.com" oreg_url=registry.example.com/openshift3/ose-${component}:${version}
openshift_examples_modify_imagestreams=true openshift_metrics_install_metrics=true
openshift_logging_install_logging=false
openshift_logging_es_nodeselector={"node-role.kubernetes.io/infra": "true"}
openshift_enable_service_catalog=false
ansible_service_broker_install=false # uncomment the following to enable htpasswd authentication; defaults to DenyAllPasswordIdentityProvider
openshift_master_identity_providers=[{'name': 'htpasswd_auth', 'login': 'true', 'challenge': 'true', 'kind': 'HTPasswdPasswordIdentityProvider'}] openshift_disable_check="disk_availability,docker_image_availability,memory_availability,docker_storage,package_version" # host group for masters
[masters]
master.example.com # host group for etcd
[etcd]
master.example.com # host group for nodes, includes region info
[nodes]
master.example.com openshift_node_group_name='node-config-master'
node1.example.com openshift_node_group_name='node-config-infra'
node2.example.com openshift_node_group_name='node-config-compute'
node3.example.com openshift_node_group_name='node-config-compute'

资源问题,不安装log,service catalog什么的了。

运行部署

ansible-playbook -vv /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml

验证安装

[root@master openshift-ansible]# oc get nodes
NAME STATUS ROLES AGE VERSION
master.example.com Ready master 44m v1.11.0+d4cacc0
node1.example.com Ready infra 40m v1.11.0+d4cacc0
node2.example.com Ready compute 40m v1.11.0+d4cacc0
node3.example.com Ready compute 40m v1.11.0+d4cacc0

3.项目恢复

$ oc new-project <projectname>

导入镜像(如果镜像仓库没修改就不用了)

$ oc create -f project.yaml
$ oc create -f secret.yaml
$ oc create -f serviceaccount.yaml
$ oc create -f pvc.yaml
$ oc create -f rolebindings.yaml

备份和恢复参考

https://docs.openshift.com/container-platform/3.11/day_two_guide/project_level_tasks.html

OpenShift跨版本升级的更多相关文章

  1. android技巧(四)数据库跨版本升级写法

    当项目中接手的需求需要在就前数据库数据表做出修改时,不得不面对数据库表结构的更新问题.一般的sqlite数据库更新修改数据库版本号时都会自动调用SqliteOptenHelper及其子类中的onUpg ...

  2. Debian 跨版本升级

    相对于某些重量级 Linux 发行版而言,同样是通过网络跨版本升级,Debian 的升级过程总要显得轻快很多.不会因为要下载数量惊人的软件包并安装而把升级时间拉得很长,也不用担心中途某些程序崩溃退出导 ...

  3. openSUSE 跨版本升级

    准备工作 此方法通过网络跨版本升级,适合 Leap 升级到下一个发行版(如 42.2 升级到 42.3),也适合 Leap 升级为 Tumbleweed.首先必须确定升级的时候有足够的时间.靠谱的更新 ...

  4. ES跨版本升级?——难道升级集群发生shard allocation是因为要分配replica节点???

    Full cluster restart upgrade Elasticsearch requires a full cluster restart when upgrading across maj ...

  5. Android SQLite数据库版本升级原理解析

    Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...

  6. android项目数据库升级跨版本管理解决方案

    目前公司android项目普遍使用框架对数据库进行操作,数据库表与数据实体都具有严格的对应的关系,但是数据库的升依赖不同版本间的升级脚本,如果应用跨多版本进行升级时,当缺失部分升级脚本时就会导致应用异 ...

  7. APP版本升级,测试用例总结

    APP升级主要在线升级.离线升级.当有新版本时,提示更新,用户点击更新,下载最新版本,进行安装升级,这种就是在线升级:已有升级包,安装升级包进行升级,这种就是离线升级. 在线升级.离线升级常见测试用例 ...

  8. 转载:Android SQLite数据库版本升级原理解析

    Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 一.软件v1.0 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHel ...

  9. MySQL升级

    MySQL的升级相对来说还是比较简单的. 它支持两种方式的升级: 原地升级(In-place Upgrade) 关闭数据库,替换旧的二进制文件,重启数据库,执行mysql_upgrade 逻辑升级(L ...

随机推荐

  1. IEEEXtreme 10.0 - Goldbach's Second Conjecture

    这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Goldbach's Second Conjecture 题目来源 第10届IEEE极限编程大赛 https ...

  2. JavaScript 七种数据类型

    在 JavaScript 规范中,共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined ...

  3. 【51nod】1239 欧拉函数之和

    题解 写完上一道就开始写这个,大体上就是代码改了改而已= = 好吧,再推一下式子! \(\sum_{i = 1}^{n}i = \sum_{i = 1}^{n}\sum_{d | i}\phi(d) ...

  4. LoadRunner11设置场景百分比模式完成多台客户端压力测试

    LoadRunner11用的不多,之前大部分的时候是用LoadRunner9.5,主要原因是由于担心新版本的稳定性,不过在Windows7系统下就不得不用LoadRunner11了,不过稳定不稳定,还 ...

  5. HTML5实战与剖析之字符集属性(charset和defaultCharset)

    HTML5对字符集属性也进行了更新,其中charset和defaultCharset属性就是HTML5中新添加的字符集属性.有关charset和defaultCharset属性的具体讲解尽在HTML5 ...

  6. 用php写的一个猜数字的程序

    写一个php的猜数字的小程序,提高自己对php的熟悉程度. <?php $count=rand(0,100); $number = (isset($_POST['number'])) ? $_P ...

  7. svn代码同步脚本

    碰到一个需求,主要是2个项目需要用到同一份代码,主要是域名和配置信息不一样,而且要把svn更新的代码同步过去.本来考虑提交时用钩子同步过去,但考虑到同步过去的代码还需要测试,而且另一边代码的时效性不强 ...

  8. Vue 2.0学习(五)v-bind及class与style绑定

    DOM元素经常会动态地绑定一些class类名或style样式. 基本用法 <div id="app"> <a v-bind:href="url" ...

  9. 【BZOJ 2822】2822: [AHOI2012]树屋阶梯(卡特兰数+高精度)

    2822: [AHOI2012]树屋阶梯 Description 暑假期间,小龙报名了一个模拟野外生存作战训练班来锻炼体魄,训练的第一个晚上,教官就给他们出了个难题.由于地上露营湿气重,必须选择在高处 ...

  10. Java文件签名与验证

    数字签名与验证只需要用户输入三个参数: Ø         原文件 Ø         签名信息文件 Ø         用户名 签名过程: 1.         首先从用户名对应的用户注册文件中读取 ...