本章概述
- 版本升级说明
- k8s版本升级操作步骤
- 添加节点
5.1 版本升级说明
当k8s集群运行一段时间后,会出现更新的版本,新版本会增加一些新功能,修复旧版本的bug,如果想要使用新版本,需要对k8s集群进行版本升级。
此次部署的版本为v1.23.1
目前在github上有新版本为v1.23.5
此次版本升级目标:把k8s集群从v1.23.1升级到v1.23.5
注意:如果是大版本内的小版本升级(如从1.23.1升级到1.23.5),一般不会出现比较大的变动,小版本的升级侧重于bug修复、增加稳定性等;如果是跨版本升级(如从1.21.6升级到1.23.1),要注意k8s的api接口是否发生变化,一定要在升级前做好测试,测试没有问题后再进行升级
版本的具体变化可以查看CHANGLOG
查看版本变化
版本升级主要是通过更换二进制文件进行升级,因此升级前要准备好新版本的二进制文件。
升级主要是对master节点和node节点进行升级,如果有多个master和多个node节点,要逐个节点进行升级(即滚动升级),另外,如果是生产环境升级要在业务低峰期进行升级。
滚动升级可以通过在haproxy负载均衡下线的方式进行,在部署时,haproxy负载三个master节点,因此在升级时,升级哪个节点,要先将哪个节点摘除,这样流量就不会发往摘除的节点,对业务无影响,待升级完成后,再把升级完成的加上,这样就能实现master节点的滚动升级。
master节点主要是替换apiserver、kube-controller-manager、kube-scheduler
node节点主要是替换kube-proxy、kubelet
5.2 k8s版本升级操作步骤
5.2.1 升级前准备工作
注意:以下操作均在deploy部署节点172.31.7.101上执行
1、升级前准备工作:从github下载新版本二进制文件
(1)进入github官网https://github.com
搜索kebernetes
(2)点击进入kubernetes项目
(3)点击右侧release
(4)查找需要下载的版本
(5)找到想要的版本,点击CHANGLOG,这里下载1.23.5版本
(6)点击进入
(7)注意需要下载以下文件
a、源码文件,包括脚本,yaml文件等
下载链接:https://dl.k8s.io/v1.23.5/kubernetes.tar.gz
b、client二进制文件,包括kubectl
下载链接:https://dl.k8s.io/v1.23.5/kubernetes-client-linux-amd64.tar.gz
c、server二进制文件,包括kube-apiserver,kube-controller-manager等
下载链接:https://dl.k8s.io/v1.23.5/kubernetes-server-linux-amd64.tar.gz
d、node二进制文件,包括kubelet,kube-proxy
下载链接:https://dl.k8s.io/v1.23.5/kubernetes-node-linux-amd64.tar.gz
2、下载完成后,把压缩包上传到master1的/usr/local/src/目录下,这里为了便于区分,对二进制文件进行重命名
cd /usr/local/src/
mv kubernetes-client-linux-amd64.tar.gz kubernetes-v1.23.5-client-linux-amd64.tar.gz
mv kubernetes-node-linux-amd64.tar.gz kubernetes-v1.23.5-node-linux-amd64.tar.gz
mv kubernetes-server-linux-amd64.tar.gz kubernetes-v1.23.5-server-linux-amd64.tar.gz
mv kubernetes.tar.gz kubernetes-v1.23.5.tar.gz
然后解压,这些文件会集中解压到kubernetes目录下
tar -xf kubernetes-v1.23.5-client-linux-amd64.tar.gz
tar -xf kubernetes-v1.23.5-node-linux-amd64.tar.gz
tar -xf kubernetes-v1.23.5-server-linux-amd64.tar.gz
tar -xf kubernetes-v1.23.5.tar.gz
在/usr/local/src/kubernetes/server/bin目录下有所有需要的二进制文件
3、替换deploy节点上的kubeasz的二进制文件
cp /usr/local/src/kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kubelet,kube-proxy} /etc/kubeasz/bin/
注意:此时的k8s版本仍为1.23.1
5.2.2 升级master节点
5.2.2.1 升级master1
1、摘除master节点(在node节点上执行)
node节点会定期检测master节点的存活状态,如果检测到master节点不存活,会将master节点踢掉,因此要现在node节点的负载均衡上将要升级的master节点摘除,摘除以后访问流量也不会转发向升级的master节点,不影响业务。
在node1(172.31.7.106)和node2(172.31.7.107)上分别执行(有注释的内容为修改内容)
vim /etc/kube-lb/conf/kube-lb.conf
user root;
worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
#server 172.31.7.101:6443 max_fails=2 fail_timeout=3s; #注释掉该行
server 172.31.7.102:6443 max_fails=2 fail_timeout=3s;
}
server {
listen 127.0.0.1:6443;
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
重载kube-lb服务
systemctl reload kube-lb.service
2、停止master的服务(如果不停止服务,直接替换二进制文件,将会无法替换)
在master(172.31.7.101)节点上执行:
systemctl stop kube-apiserver.service kube-controller-manager.service kube-scheduler.service kube-proxy.service
kubelet.service
3、替换二进制文件(在master(172.31.7.101)节点上执行)
\cp /usr/local/src/kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kubelet,kube-proxy} /usr/local/bin/
注意:“\cp”是指强制替换
4、启动服务(在master(172.31.7.101)节点上执行)
systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service kube-proxy.service kubelet.service
查看k8s版本,master1的版本已经升级为1.23.5
升级完成后,修改node1和node2上的负载均衡配置,把master1调度恢复
在node1(172.31.7.106)和node2(172.31.7.107)上分别执行(添加注释的内容为修改内容)
vim /etc/kube-lb/conf/kube-lb.conf
user root;
worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
server 172.31.7.101:6443 max_fails=2 fail_timeout=3s; #去掉注释
server 172.31.7.102:6443 max_fails=2 fail_timeout=3s;
}
server {
listen 127.0.0.1:6443;
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
重载kube-lb服务
systemctl reload kube-lb.service
5.2.2.2 升级master2
1、摘除master节点
node节点会定期检测master节点的存活状态,如果检测到master节点不存活,会将master节点踢掉,因此要现在node节点的负载均衡上将要升级的master节点摘除,摘除以后访问流量也不会转发向升级的master节点,不影响业务。
在node1(172.31.7.106)和node2(172.31.7.107)上分别执行(添加有注释的内容为修改内容)
vim /etc/kube-lb/conf/kube-lb.conf
user root;
worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
server 172.31.7.101:6443 max_fails=2 fail_timeout=3s;
#server 172.31.7.102:6443 max_fails=2 fail_timeout=3s; #注释掉改行
}
server {
listen 127.0.0.1:6443;
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
重载kube-lb服务
systemctl reload kube-lb.service
2、停止master的服务(如果不停止服务,直接替换二进制文件,将会无法替换)
在master2(172.31.7.102)节点上执行:
systemctl stop kube-apiserver.service kube-controller-manager.service kube-scheduler.service kube-proxy.service kubelet.service
3、替换二进制文件(在master1(172.31.7.101)节点上执行)
由于master2节点上不存在二进制文件,因此在master1节点上把二进制文件远程复制到master2上
scp /usr/local/src/kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kubelet,kube-proxy} 172.31.7.102:/usr/local/bin/
4、启动服务(在master2(172.31.7.102)节点上执行)
systemctl start kube-apiserver.service kube-controller-manager.service kube-scheduler.service kube-proxy.service kubelet.service
查看k8s版本,master2的版本已经升级为1.23.5
升级完成后,修改node1和node2上的负载均衡配置,把master1调度恢复
在node1(172.31.7.106)和node2(172.31.7.107)上分别执行(添加注释的内容为修改内容)
vim /etc/kube-lb/conf/kube-lb.conf
user root;
worker_processes 1;
error_log /etc/kube-lb/logs/error.log warn;
events {
worker_connections 3000;
}
stream {
upstream backend {
server 172.31.7.101:6443 max_fails=2 fail_timeout=3s;
server 172.31.7.102:6443 max_fails=2 fail_timeout=3s; #去掉注释
}
server {
listen 127.0.0.1:6443;
proxy_connect_timeout 1s;
proxy_pass backend;
}
}
重载kube-lb服务
systemctl reload kube-lb.service
5.2.3 升级node节点
由于node节点上部署有容器,因此升级之前根据容器的重要性,要考虑是否要把node节点上的容器驱逐到其他node节点,否则升级期间node节点服务不可用,导致容器无法访问,会影响业务。或者删除node节点,node节点删除后,k8s会将node上的容器在其他节点重建。
使用kubectl drain命令,可以将node节点上的容器驱逐,把容器驱逐到其他可调度服务器上,不过该命令只能驱逐通过deployment类型的容器,其他类型的容器(如daemonset类型)无法驱逐,升级时可能会导致这类容器丢失
5.2.3.1 升级node1
1、驱逐node节点(在master1节点(172.31.7.101)上执行)
kubectl drain 172.31.7.111 --force --ignore-daemonsets --delete-emptydir-data
查看pod,在另一个node2(172.31.7.112)节点上
注意:此时node2上存在的容器均是deployment创建的容器,不是deployment创建的容器会不存在(如default namespace下的net-test1和myserver namespace下的nginx)
查看node1(172.31.7.111)节点状态,处于不可调度状态
2、在node1(172.31.7.111)上停止服务
systemctl stop kube-proxy.service kubelet.service
3、替换二进制文件(在master1(172.31.7.101)节点上执行)
由于node1上没有二进制文件,因此从master1上远程复制到node1上
scp /usr/local/src/kubernetes/server/bin/{kubelet,kube-proxy} 172.31.7.111:/usr/local/bin/
4、启动node1(172.31.7.111)的服务
systemctl start kube-proxy.service kubelet.service
5、在master上查看node1的k8s版本,已经升级到1.23.5
6、将node1恢复调度
kubectl uncordon 172.31.7.111
5.2.3.2 升级node2
1、驱逐node节点(在master1节点(172.31.7.101)上执行)
kubectl drain 172.31.7.112 --force --ignore-daemonsets --delete-emptydir-data
查看pod,容器都被驱逐到另一个node1(172.31.7.111)节点上
查看node2(172.31.7.112)节点状态,处于不可调度状态
2、在node2(172.31.7.112)上停止服务
systemctl stop kube-proxy.service kubelet.service
3、替换二进制文件(在master1(172.31.7.101)节点上执行)
由于node2上没有二进制文件,因此从master1上远程复制到node2上
scp /usr/local/src/kubernetes/server/bin/{kubelet,kube-proxy} 172.31.7.112:/usr/local/bin/
4、启动node1(172.31.7.112)的服务
systemctl start kube-proxy.service kubelet.service
5、在master上查看node2的k8s版本,已经升级到1.23.5
6、将node2恢复调度
kubectl uncordon 172.31.7.112
5.3 添加节点
通过kubeasz项目添加节点
使用ezctl命令可以实现添加和删除master节点、node节点、etcd
命令格式:/etc/kubasz/ezctl <command> <cluster-name> <ip>
如/etc/kubeasz/ezctl add-node k8s-cluster1 172.31.7.113
注意:添加节点之前要做好免秘钥认证(即deploy节点可免密访问要添加的节点)
5.3.1 添加node节点
在deploy节点172.31.7.101上
cd /etc/kubeasz/
./ezctl add-node k8s-cluster1 172.31.7.113
注意:/etc/kubeasz/bin/下目录的二进制文件都做了更换(在上面升级k8s版本时已经更换为1.23.5版本的),因此新添加节点的k8s版本也都是1.23.5版本,命令如下:
cp /usr/local/src/kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler,kubectl,kubelet,kube-proxy} /etc/kubeasz/bin/
添加完成后查看node3(172.31.7.113)已经被添加,且k8s版本为1.23.5
kubectl get node
查看/etc/kubeasz/clusters/k8s-cluster1/hosts文件,发现172.31.7.113已经被自动添加到kube_node字段中
5.3.2 添加master节点
在deploy节点172.31.7.101上
cd /etc/kubeasz/
./ezctl add-master k8s-cluster1 172.31.7.103
部署过程中出现以下报错,这是因为在/etc/kubeasz/clusters/k8s-cluster1/hosts文件中没有更改ex_lb地址,找不到改地址形成的报错,可忽略
/etc/kubeasz/clusters/k8s-cluster1/hosts 文件中ex_lb内容如下:
查看node状态,master3节点172.31.7.103已经被添加,且k8s版本为1.23.5
查看node节点上查看负载均衡配置,发现负载的master节点会自动添加172.31.7.103
文章评论