Kubernetes升级比较简单,小版本的升级只需要更新二进制文件即可,大版本升级需要额外关注组件升级的参数变化。

提前准备好二进制包

升级kubectl(master节点)

备份kubectl:

cd /usr/bin
mv kubectl kubectl.bak_2021-05-27

替换下载的二进制包并查看版本:

[root@master1 bin]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.3", GitCommit:"01849e73f3c86211f05533c2e807736e776fcf29", GitTreeState:"clean", BuildDate:"2021-02-17T12:44:29Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}

可以看到Client Version已经是新版本了,Server Version还是老版本,这是因为apiserver还没有升级

升级master组件(master节点)

停止master上面的组件:

systemctl stop kube-apiserver
systemctl stop kube-scheduler
systemctl stop kube-controller-manager
systemctl stop kubelet
systemctl stop kube-proxy

备份老版本:

cd /opt/kubernetes/bin/
mv kube-apiserver kube-apiserver.bak_2021-05-27
mv kube-scheduler kube-scheduler.bak_2021-05-27
mv kube-controller-manager kube-controller-manager.bak_2021-05-27
mv kubelet kubelet.bak_2021-05-27
mv kube-proxy kube-proxy_2021-05-27

拷贝新版本过来,启动组件

systemctl start kube-apiserver
systemctl start kube-scheduler
systemctl start kube-controller-manager
systemctl start kubelet
systemctl start kube-proxy

查看组件启动情况和健康状态:

systemctl status kube-apiserver
systemctl status kube-scheduler
systemctl status kube-controller-manager
systemctl status kubelet
systemctl status kube-proxy
kubectl get cs

查看客户端和服务端版本:

[root@master1 bin]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.3", GitCommit:"01849e73f3c86211f05533c2e807736e776fcf29", GitTreeState:"clean", BuildDate:"2021-02-17T12:44:29Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.3", GitCommit:"01849e73f3c86211f05533c2e807736e776fcf29", GitTreeState:"clean", BuildDate:"2021-02-17T12:35:49Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}

升级node组件(node节点)

停止node上面的组件:

systemctl stop kubelet
systemctl stop kube-proxy

备份老版本:

cd /opt/kubernetes/bin/
mv kubelet kubelet.bak_2021-05-27
mv kube-proxy kube-proxy_2021-05-27

拷贝新版本过来,启动组件

systemctl start kubelet
systemctl start kube-proxy

查看组件启动情况和健康状态:

systemctl status kubelet
systemctl status kube-proxy

验证升级是否成功

# 查看集群状态
[root@master1 bin]# kubectl cluster-info
Kubernetes control plane is running at https://192.168.1.120:6443
CoreDNS is running at https://192.168.1.120:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

[root@master1 bin]# kubectl get node
NAME STATUS ROLES AGE VERSION
master1 Ready <none> 42h v1.20.3
master2 Ready <none> 23h v1.20.0
node1 Ready <none> 41h v1.20.3
node2 Ready <none> 41h v1.20.3

[root@master1 bin]# 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"}

[root@master1 bin]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-97769f7c7-rc9jg 1/1 Running 0 42h
calico-node-fw9fv 1/1 Running 0 42h
calico-node-q2f2w 1/1 Running 0 23h
calico-node-rlzg9 1/1 Running 0 41h
calico-node-v9nhl 1/1 Running 0 42h
coredns-6cc56c94bd-nr96k 1/1 Running 0 41h

# 验证coredns解析
[root@master1 bin]# kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local

Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local