【Kubernetes】k8s集群升级详细说明【k8s升级 kubeadm 集群】【万能版本升级方法】

说明【必看】

  • 在传统的部署方式中,当需要升级集群中的某个服务时,需要停止该服务相关的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节点都重复上面操作即可。

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

҉人间无事人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值