前言
升级 k8s 集群必须 先升级 kubeadm 版本到目的 k8s 版本,也就是说 kubeadm 是 k8s 升级 的 ”准升证”。
升级k8s master服务
在 k8s 的所有 master 进行升级,将管理端服务 kube-controller-manager、kube-apiserver、 kube-scheduler、kube-proxy的版本进行升级
验证当前k8s版本
root@k8s-master2:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:27:49Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}
各master安装指定新版本kubeadm
#查看 k8s 版本列表
$ apt-cache madison kubeadm
#安装新版本kubeadm
$ apt-get install kubeadm=1.17.4-00
#验证 kubeadm 版本
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.4", GitCommit:"8d8aa39598534325ad77120c120a22b3a990b5ea", GitTreeState:"clean", BuildDate:"2020-03-12T21:01:11Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
升级计划
#查看升级计划
$kubeadm upgrade plan
可以看到当前k8s v1.17版本中最新的小版本是v.17.5,但是我们只升级到v1.17.4!

image-20200519135933437.png
开始升级
下载镜像
#! /bin/bash
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
升级
升级时,最好一台一台升级,把升级的master从haproxy配置里注释掉,然后reload haproxy,这样k8s高可用集群不会导致api-server的调度中断。我这里是自己的虚拟机,就不讲究这么多了
#master1
$ kubeadm upgrade apply v1.17.4
#master2
$ kubeadm upgrade apply v1.17.4
#master3
$ kubeadm upgrade apply v1.17.4

image-20200519141225692.png

image-20200519141248897.png

image-20200519141431877.png
升级kubelet和kubectl
$ apt-get install -y kubectl=1.17.4-00 kubelet=1.17.4-00
验证版本
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master1.ning.com Ready master 17h v1.17.4
k8s-master2.ning.com Ready master 16h v1.17.4
k8s-master3.ning.com Ready master 16h v1.17.4
k8s-node1.ning.com Ready <none> 16h v1.17.2
k8s-node2.ning.com Ready <none> 16h v1.17.2
升级node节点
升级各node节点配置文件
注:node节点也需要提前下载镜像,否则有可能导致pod创建失败
$ kubeadm upgrade node --kubelet-version 1.17.4
[upgrade] Reading configuration from the cluster...
[upgrade] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[upgrade] Skipping phase. Not a control plane node.
[upgrade] Using kubelet config version 1.17.4, while kubernetes-version is v1.17.4
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.17" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
升级各node节点二进制包
$ apt install kubelet=1.17.4-00 kubeadm=1.17.4-00 kubectl=1.17.4-00
验证最终版本

image-20200519194844827.png