关注公众号,将获取更多kubernetes干货

升级介绍

针对kubernetes小版本升级,只要更新相关二进制文件就可以了,由于kubernetes版本更新比较快,很多依赖还没解决晚上,所以不建议生产环境使用比较新的版本,升级目标小版本号不建议大于2。

kubernetes版本升级需要考虑到集群当中正在运行的容器收到影响,所以应该对各Node逐个进行驱离和驱逐Node上面的Pod。先更新Master服务,在逐个更新Node上的kubeletkube-proxy服务。


升级规划

角色

组件

目前版本

升级版本

Master

kube-apiserver

v1.20.11

v1.21.7

kube-controller-manager

v1.20.11

v1.21.7

kube-scheduler

v1.20.11

v1.21.7

kubelet

v1.20.11

v1.21.7

kube-prox

v1.20.11

v1.21.7

Node

kubelet

v1.20.11

v1.21.7

kube-proxy

v1.20.11

v1.21.7

说明:

calico和etcd一般不需要更新。


升级准备

下载地址

wget https://dl.k8s.io/v1.21.7/kubernetes-server-linux-amd64.tar.gz

目前集群版本信息


# kubectl get node
NAME STATUS ROLES AGE VERSION
test-k8s-master-227 Ready master 18d v1.20.11
test-k8s-master-230 Ready master 17d v1.20.11
test-k8s-master-231 Ready master 17d v1.20.11
test-k8s-node-228 Ready <none> 18d v1.20.11
test-k8s-node-229 Ready <none> 18d v1.20.11
test-k8s-node-233 Ready <none> 16d v1.20.11
# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.11", GitCommit:"27522a29febbcc4badac257763044d0d90c11abd", GitTreeState:"clean", BuildDate:"2021-09-15T19:21:44Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.11", GitCommit:"27522a29febbcc4badac257763044d0d90c11abd", GitTreeState:"clean", BuildDate:"2021-09-15T19:16:25Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/amd64"}


开始升级

Master升级(在所有Master节点操作)

备份

mkdir /data/backup/kubernetes -p
cp /data/local/kubernetes/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /data/backup/kubernetes/

停止master(先停止其中一台master,先升级一台,跑个测试服务,观察下是否正常,在升级其他master)


systemctl stop keepalived   #可以先停掉keepalived,切走高可用VIP地址
systemctl stop kube-apiserver
systemctl stop kube-scheduler
systemctl stop kube-controller-manager


升级master


tar xf kubernetes-server-linux-amd64.tar.gz
/bin/cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /data/local/kubernetes/bin/


启动keepalive和apiserver,其他组件

$systemctl start kube-apiserver
$systemctl start kube-controller-manager && systemctl start kube-scheduler
$kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {"health":"true"}
etcd-2 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
$systemctl start keepalived
$kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.11", GitCommit:"27522a29febbcc4badac257763044d0d90c11abd", GitTreeState:"clean", BuildDate:"2021-09-15T19:21:44Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.7", GitCommit:"1f86634ff08f37e54e8bfcd86bc90b61c98f84d4", GitTreeState:"clean", BuildDate:"2021-11-17T14:35:38Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}

可以看到服务端组件已经升级成功。


升级另外两台Master

将新版本的报传到230和231


scp kubernetes-server-linux-amd64.tar.gz  192.168.253.230:/data/tools/
scp kubernetes-server-linux-amd64.tar.gz 192.168.253.231:/data/tools/

停止230master (231一样的操作)

systemctl stop keepalived   #可以先停掉keepalived,切走高可用VIP地址
systemctl stop kube-apiserver
systemctl stop kube-scheduler
systemctl stop kube-controller-manager

升级

$cd /data/tools
$tar xf kubernetes-server-linux-amd64.tar.gz
$/bin/cp kubernetes/server/bin/{kube-apiserver,kube-controller-manager,kube-scheduler} /data/local/kubernetes/bin/
$systemctl start kube-apiserver
$systemctl start kube-controller-manager && systemctl start kube-scheduler
$kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.11", GitCommit:"27522a29febbcc4badac257763044d0d90c11abd", GitTreeState:"clean", BuildDate:"2021-09-15T19:21:44Z", GoVersion:"go1.15.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.7", GitCommit:"1f86634ff08f37e54e8bfcd86bc90b61c98f84d4", GitTreeState:"clean", BuildDate:"2021-11-17T14:35:38Z", GoVersion:"go1.16.10", Compiler:"gc", Platform:"linux/amd64"}


Node组件升级

备份(所有node节点,包括master)


mkdir -p /data/backup/kubernetes/
cp /data/local/kubernetes/bin/{kube-proxy,kubelet} /data/backup/kubernetes/
cp /usr/bin/kubectl /data/backup/kubernetes/


隔离Node,让node变成不可调度的状态


kubectl cordon test-k8s-master-227
kubectl get node
NAME STATUS ROLES AGE VERSION
test-k8s-master-227 Ready,SchedulingDisabled master 18d v1.20.11
test-k8s-master-230 Ready master 17d v1.20.11
test-k8s-master-231 Ready master 17d v1.20.11
test-k8s-node-228 Ready <none> 18d v1.20.11
test-k8s-node-229 Ready <none> 18d v1.20.11
test-k8s-node-233 Ready <none> 17d v1.20.11


停止(一台一台升级)


systemctl stop kubelet
systemctl stop kube-proxy

升级


cd /data/tools/
tar xf kubernetes-server-linux-amd64.tar.gz
/bin/cp kubernetes/server/bin/{kubelet,kube-proxy} /data/local/kubernetes/bin/
/bin/cp kubernetes/server/bin/kubectl /usr/bin/ #升级node 可以不用拷贝kubectl

启动

systemctl daemon-reload && systemctl start kubelet
systemctl start kube-proxy
systemctl status kube-proxy
● kube-proxy.service - Kubernetes Proxy
Loaded: loaded (/usr/lib/systemd/system/kube-proxy.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2021-12-06 14:12:07 CST; 7s ago
Main PID: 85281 (kube-proxy)

启动成功,版本也改过来了

kubectl  get node
NAME STATUS ROLES AGE VERSION
test-k8s-master-227 Ready,SchedulingDisabled master 18d v1.21.7
test-k8s-master-230 Ready master 17d v1.20.11
test-k8s-master-231 Ready master 17d v1.20.11
test-k8s-node-228 Ready <none> 18d v1.20.11
test-k8s-node-229 Ready <none> 18d v1.20.11
test-k8s-node-233 Ready <none> 17d v1.20.11


解除隔离


kubectl uncordon test-k8s-master-227

其他节点一样的操作

将包分发到所有节点,其他步骤参考上面走一遍

scp -P 22 kubernetes-server-linux-amd64.tar.gz  192.168.253.228:/data/tools/
scp -P 22 kubernetes-server-linux-amd64.tar.gz 192.168.253.229:/data/tools/
scp -P 22 kubernetes-server-linux-amd64.tar.gz 192.168.253.230:/data/tools/
scp -P 22 kubernetes-server-linux-amd64.tar.gz 192.168.253.231:/data/tools/
scp -P 22 kubernetes-server-linux-amd64.tar.gz 192.168.253.233:/data/tools/

一番猛如虎的操作,所有node均已升级完成

kubectl  get node
NAME STATUS ROLES AGE VERSION
test-k8s-master-227 Ready master 18d v1.21.7
test-k8s-master-230 Ready master 17d v1.21.7
test-k8s-master-231 Ready master 17d v1.21.7
test-k8s-node-228 Ready <none> 18d v1.21.7
test-k8s-node-229 Ready <none> 18d v1.21.7
test-k8s-node-233 Ready <none> 17d v1.21.7

测试


$vim test.yaml 
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.28.3
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
restartPolicy: Always
$kubectl apply -f test.yaml
$kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 107s 10.244.4.3 test-k8s-node-233 <none> <none>
nginx 1/1 Running 0 28m 10.244.39.132 test-k8s-node-229 <none> <none>

pod 也可以正常启动

至此,二进制版本升级完毕


更多文章请扫一扫

 扫描下面二维码关注公众号获取更多学习资源

纯干货: kubernetes 多Master 二进制方式v1.20.11升级到v1.21.7_版本升级