【Kubernetes】k8s集群升级详细说明【k8s升级 kubeadm 集群】【万能版本升级方法】
文章目录说明【必看】环境现有版本查看和升级版本说明升级流程【master节点】说明【必看】1、把节点执行drain操作报错error: unable to drain node ..处理正常dran显示2、升级kubeadm在线升级离线升级3、升级各个组建【apiserver、etcd,dns等】查看升级计划升级各个组建【不含etcd】4、取消drain操作5、升级kubelet和kubectl6
说明【必看】
-
在传统的部署方式中,当需要升级集群中的某个服务时,需要停止该服务相关的Pod,pull最新的docker镜像,然后重新启动。 如果一下把所有Pod都停止,服务在升级的时间内会不可用。因此,Kubernetes提供了滚动升级的功能,一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新,最大好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性。
-
kubernetes升级概述
kubernetes版本升级迭代非常快,每三个月更新一个版本,很多新的功能在新版本中快速迭代,为了与社区版本功能保持一致,升级kubernetes集群,社区已通过kubeadm工具统一升级集群,升级步骤简单易行。首先来看下升级kubernetes集群需要升级那些组件:- 升级管理节点,管理节点上的kube-apiserver,kuber-controller-manager,kube-scheduler,etcd等;
- 其他管理节点,管理节点如果以高可用的方式部署,多个高可用节点需要一并升级;
- worker工作节点,升级工作节点上的Container Runtime如docker,kubelet和kube-proxy。
-
版本升级通常分为两类:小版本升级和跨版本升级,小版本升级如1.14.1升级只1.14.2,小版本之间可以跨版本升级如1.14.1直接升级至1.14.3;跨版本升级指大版本升级,如1.14.x升级至1.15.x。本文以离线的方式将1.14.1升级至1.1.5.1版本,升级前需要满足条件如下:
- 当前集群版本需要大于1.14.x,可升级至1.14.x和1.15.x版本,小版本和跨版本之间升级;
- 关闭swap空间;
- 备份数据,将etcd数据备份,以及一些重要目录如/etc/kubernetes,/var/lib/kubelet;
- 升级过程中pod需要重启,确保应用使用RollingUpdate滚动升级策略,避免业务有影响。
-
升级注意,不能跨版本升级,比如:
1.19.x → 1.20.y
——是可以的(其中y > x)
1.19.x → 1.21.y
——不可以【跨段了】(其中y > x)
1.21.x→ 1.21.y
——也可以(只要其中y > x)
所以,如果需要跨大版本升级,必须多次逐步升级 -
为什么要升级集群
- 功能上的更新
- 软件这些有bug
- 存在安全隐患
-
升级流程
节点层面- 1、先升级master【如果有多master,需要一台一台升级】
- 2、再升级word【node】节点
-
升级流程
软件层面- 1、先升级kubeadm
- 2、把节点执行drain操作
- 3、升级各个组建【etcd,dns等】
- 4、取消drain操作
- 5、升级kubelet和kubectl
-
我们可以参考官方文档的,直接搜索
upgrade
即可
升级 kubeadm 集群
环境现有版本查看和升级版本说明
- 我现在的环境呢,是
v1.21.0
的,后面我就升级为v1.21.1
为例吧
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 134d v1.21.0
node1 Ready <none> 134d v1.21.0
node2 Ready <none> 134d v1.21.0
[root@master ~]#
升级流程【master节点】
说明【必看】
- 注:集群不建议在没有外网的地方进行升级,我查找了很多资料,发现没人有记录纯粹的内网升级,我也尝试折腾过,发现离线环境,很多命令都没有办法执行成功,因为我外网环境很有限,就不多做折腾了;
离线包,离线镜像,这些你都得要在能上网的机器上【全新的机器,不能有任何相关环境,否则依赖会下载不了】准备好,然后执行和在线升级一样的命令,理论上可以成功~~~ - 但是,升级集群其实是很简单的,就需要几个步骤即可,我下面也会放升级命令和成功的图片的,后面有外网的小伙伴可以跟着做哈。
- 另外,也建议跟着官网做,毕竟官网的流程说得比较好的,跟着做就可以了
升级 kubeadm 集群
1、把节点执行drain操作
报错error: unable to drain node …处理
- 如下,提示无法删除具有本地存储的POD,解决方法也在括号中说明了
因为我这个是测试集群,所以呢,我不考虑数据存储问题,所以呢我直接在最后加上--delete-emptydir-data
覆盖就可以解决了,如果你环境有数据问题,务必手动去先删除这些pod,免得数据丢失啊。
[root@master kubeadm]# kubectl drain master --ignore-daemonsets
node/master cordoned
error: unable to drain node "master", aborting command...
There are pending nodes to be drained:
master
error: cannot delete Pods with local storage (use --delete-emptydir-data to override): kube-system/metrics-server-bcfb98c76-jt72l
[root@master kubeadm]#
正常dran显示
- 这暂时只drain了master节点
node/master evicted
最后要显示这种内容才是正常的哈
[root@master kubeadm]# kubectl drain master --ignore-daemonsets --delete-emptydir-data
node/master already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-vhnwv, kube-system/kube-proxy-k9mjh, metallb-system/speaker-4bshv
evicting pod volume/nfs-client-provisioner-c8f4bcbd-wsfhg
evicting pod kube-system/coredns-545d6fc579-94wgt
evicting pod ccx/nginx-test-795d659f45-7bbmt
evicting pod kube-system/calico-kube-controllers-78d6f96c7b-bb76b
evicting pod ccx/centos-7846bf67c6-gj7v4
evicting pod metallb-system/controller-77c44876d-b226n
evicting pod pod-1/web1-5d77cfc5d6-6m4kq
evicting pod kube-system/coredns-545d6fc579-848f6
evicting pod ingress-nginx/ingress-nginx-controller-744d4fc6b7-db4p7
evicting pod pod-1/web1-5d77cfc5d6-vczvj
evicting pod pod-1/web1-5d77cfc5d6-7vj6n
evicting pod pod-1/web1-5d77cfc5d6-fdl8r
evicting pod ccx/nginx-test-795d659f45-6f8t9
evicting pod pod-1/web1-5d77cfc5d6-z469q
evicting pod kube-system/metrics-server-bcfb98c76-jt72l
pod/web1-5d77cfc5d6-6m4kq evicted
pod/web1-5d77cfc5d6-vczvj evicted
pod/web1-5d77cfc5d6-7vj6n evicted
pod/controller-77c44876d-b226n evicted
pod/web1-5d77cfc5d6-z469q evicted
pod/web1-5d77cfc5d6-fdl8r evicted
I1123 12:07:05.675651 93582 request.go:668] Waited for 1.069228278s due to client-side throttling, not priority and fairness, request: GET:https://192.168.59.142:6443/api/v1/namespaces/kube-system/pods/calico-kube-controllers-78d6f96c7b-bb76b
I1123 12:07:15.869815 93582 request.go:668] Waited for 1.269563757s due to client-side throttling, not priority and fairness, request: GET:https://192.168.59.142:6443/api/v1/namespaces/kube-system/pods/calico-kube-controllers-78d6f96c7b-bb76b
I1123 12:07:26.069587 93582 request.go:668] Waited for 1.18359829s due to client-side throttling, not priority and fairness, request: GET:https://192.168.59.142:6443/api/v1/namespaces/ingress-nginx/pods/ingress-nginx-controller-744d4fc6b7-db4p7
pod/centos-7846bf67c6-gj7v4 evicted
pod/nginx-test-795d659f45-6f8t9 evicted
pod/coredns-545d6fc579-848f6 evicted
pod/metrics-server-bcfb98c76-jt72l evicted
pod/nginx-test-795d659f45-7bbmt evicted
pod/nfs-client-provisioner-c8f4bcbd-wsfhg evicted
pod/coredns-545d6fc579-94wgt evicted
pod/calico-kube-controllers-78d6f96c7b-bb76b evicted
pod/ingress-nginx-controller-744d4fc6b7-db4p7 evicted
node/master evicted
[root@master kubeadm]#
2、升级kubeadm
在线升级
- 先给mster和node导入阿里云的这个dns吧,不然可能会报错
[root@master ~]# ls | grep dns
coredns-1.21.tar
[root@master ~]# docker load -i coredns-1.21.tar
Loaded image: registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@master ~]# docker images | grep dns
registry.aliyuncs.com/google_containers/coredns/coredns v1.8.0 296a6d5035e2 13 months ago 42.5MB
[root@master ~]#
[root@master ~]# scp coredns-1.21.tar node1:~
root@node1's password:
coredns-1.21.tar 100% 41MB 17.7MB/s 00:02
[root@master ~]# scp coredns-1.21.tar node2:~
root@node2's password:
coredns-1.21.tar 100% 41MB 19.1MB/s 00:02
[root@master ~]#
[root@node1 ~]# docker load -i coredns-1.21.tar
Loaded image: registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@node1 ~]#
[root@node2 ~]# docker load -i coredns-1.21.tar
Loaded image: registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@node1 ~]#
- 升级命令
yum -y install kubeadm-1.21.1-0 --disableexcludes=kubernetes
kubeadm-1.21.1-0 # 替换为对应的版本号
--disableexcludes=kubernetes# 禁掉除了这个之外的别的仓库
离线升级
-
下面仅仅是尝试,失败了,不行的,所以,离线升级就此打住吧
注:下面没有标注离线的,都默认为在线升级 -
原因总结:我下面下载的这个没有依赖,这是因为之前下载过,本身存在依赖,所以依赖就没被下载下来,所以,我下面下载这个升级后不行【需要在一个全新的环境下载下面的包和依赖,然后倒入过去升级才行】
-
下面我展示下没有依赖包的情况导入升级把。
先去外网机子上下载一个包
--disableexcludes=kubernetes
禁掉除了这个之外的别的仓库【可不要】
[root@ccx ~]# mkdir kubeadm
[root@ccx ~]# pwd
/root
[root@ccx ~]# yum -y install --downloadonly --downloaddir=/root/kubeadm kubeadm-1.21.1-0 --disableexclude
s=kubernetes
Loaded plugins: fastestmirror, langpacks, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Determining fastest mirrors
base | 3.6 kB 00:00:00
docker-ce-stable | 3.5 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
jenkins | 2.9 kB 00:00:00
kubernetes/signature | 844 B 00:00:00
kubernetes/signature | 1.4 kB 00:00:00 !!!
updates | 2.9 kB 00:00:00
(1/9): epel/x86_64/group_gz | 96 kB 00:00:00
(2/9): base/7/x86_64/group_gz | 153 kB 00:00:00
(3/9): epel/x86_64/updateinfo | 1.0 MB 00:00:00
(4/9): kubernetes/primary | 99 kB 00:00:00
(5/9): docker-ce-stable/7/x86_64/updateinfo | 55 B 00:00:01
(6/9): epel/x86_64/primary_db | 7.0 MB 00:00:00
(7/9): docker-ce-stable/7/x86_64/primary_db | 69 kB 00:00:01
(8/9): updates/7/x86_64/primary_db | 12 MB 00:00:01
(9/9): jenkins/primary_db | 177 kB 00:00:02
kubernetes 736/736
Resolving Dependencies
--> Running transaction check
---> Package kubeadm.x86_64 0:1.21.0-0 will be updated
---> Package kubeadm.x86_64 0:1.21.1-0 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
=========================================================================================================
Package Arch Version Repository Size
=========================================================================================================
Updating:
kubeadm x86_64 1.21.1-0 kubernetes 9.5 M
Transaction Summary
=========================================================================================================
Upgrade 1 Package
Total download size: 9.5 M
Background downloading packages, then exiting:
No Presto metadata available for kubernetes
e0511a4d8d070fa4c7bcd2a04217c80774ba11d44e4e0096614288189894f1c5-kubeadm-1.21.1-0 | 9.5 MB 00:00:01
exiting because "Download Only" specified
[root@ccx ~]#
[root@ccx ~]# cd kubeadm/
[root@ccx kubeadm]# ls
e0511a4d8d070fa4c7bcd2a04217c80774ba11d44e4e0096614288189894f1c5-kubeadm-1.21.1-0.x86_64.rpm
[root@ccx kubeadm]#
- 导入到我的集群内网,然后升级,可以看到版本并不会有变化【正常情况版本已经变成升级后的版本了】
[root@master ~]# mkdir kubeadm
[root@master ~]# cd kubeadm
[root@master kubeadm]# rz -E
rz waiting to receive.
zmodem trl+C ȡ
Transferring e0511a4d8d070fa4c7bcd2a04217c80774ba11d44e4e0096614288189894f1c5-ku 100% 9778 KB 9778 KB/s 00:00:01 0 Errors
[root@master kubeadm]# du -sh *
9.6M e0511a4d8d070fa4c7bcd2a04217c80774ba11d44e4e0096614288189894f1c5-kubeadm-1.21.1-0.x86_64.rpm
[root@master kubeadm]# rpm -ivhU * --nodeps --force
Preparing... ################################# [100%]
Updating / installing...
1:kubeadm-1.21.1-0 ################################# [ 50%]
Cleaning up / removing...
2:kubeadm-1.21.0-0 ################################# [100%]
[root@master kubeadm]#
[root@master kubeadm]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready,SchedulingDisabled master 134d v1.21.0
node1 Ready <none> 134d v1.21.0
node2 Ready <none> 134d v1.21.0
[root@master kubeadm]#
3、升级各个组建【apiserver、etcd,dns等】
查看升级计划
- 这条命令呢,是查看需要升级哪些组建的,可查看可不查看,执行与否都无所谓的,但最好执行一下,因为有些etcd是可以不用升级的,这样我们可以看到呢。
注:如下图,如果etcd两个版本一致,是可以不用升级etcd的。
kubeadm upgrade plan
升级各个组建【不含etcd】
- 命令如下,因为这里不要升级etcd,所以在最后面加上一行内容
kubeadm upgrade apply v1.21.1 --etcd-upgrade=false
v1.21.1 #为升级的版本号
--etcd-upgrade=false #不升级etcd
成功如图
4、取消drain操作
- 命令如下
kubectl uncordon hostname
hostname #替换为master主机名
执行成功如下,注,此时版本依然没有变化的,因为没有升级kubelet和kubectl
5、升级kubelet和kubectl
- 命令如下
官网中其实会有下面命令的
yum install -y kubelet-1.21.1-0 kubectl-1.21.1-0 --disableexcludes=kubernetes
kubelet-1.21.1-0 kubectl-1.21.1-0 # 这个版本号
--disableexcludes=kubernetes# 禁掉除了这个之外的别的仓库
6、重启kubelet服务并验证
- 重启kubelet服务
systemctl daemon-reload ; systemctl restart kubelet
然后再次查看就可以看到master的版本已经变化了
如果没有变化,稍等一会即可
多master升级说明
- 所谓多master就是,有多个master节点,除了第一个master节点做上面流程以外,剩下的所有master都需要以下面说明来升级。
- 其余master和上面master节点升级一致
注意,不要执行上面流程3,也就是不用升级各个组建【只有第一个master才需要升级各个组建】
但是需要把流程3中替换为kubeadm upgrade node
【固定内容】
#总结,简单来说,剩余master需要执行上面1-6的所有内容,但是3中的内容需要换成下面【node节点的形式】
kubeadm upgrade node
升级流程【worker/node节点】
说明【必看】
- 如果有多台node节点,每台执行同样操作。
- drain和取消drain都是在master上操作的。
1、把node节点执行drain操作
- 命令
master节点上执行
kubectl drain node_hostname --ignore-daemonsets
node_hostname #替换为node节点主机名
然后状态就会变成如下【master也会drain后也会有的哈】
2、升级组建
- 命令如下,固定内容
kubeadm upgrade node
3、升级kubelet和kubectl
- 命令
yum install -y kubelet-1.21.1-0 kubectl-1.21.1-0 --disableexcludes=kubernetes
kubelet-1.21.1-0 kubectl-1.21.1-0 # 这个版本号
--disableexcludes=kubernetes# 禁掉除了这个之外的别的仓库
4、重启kubelet服务
- 重启kubelet服务
systemctl daemon-reload ; systemctl restart kubelet
5、 取消drain操作并验证
- 命令
master节点操作
kubectl uncordon node_hostname
node_hostname #替换为node主机名
kubectl get nodes
多node节点升级说明
每个node节点都重复上面操作即可。
更多推荐
所有评论(0)