kubeadm升级前版本:v1.19.3
kubeadm version
本文要升级到最新版:v1.20.2
kubeadm upgrade plan
检查可升级到哪些版本,并验证您当前的集群是否可升级。
可以从上图中看出当前版本和最新版本的差异,以及升级操作。
建立repo文件:
/etc/yum.repos.d/kubernetes.repo
内容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
如果你之前已经装过这个repo,那么有可能需要执行如下命令清除本地yum缓存,否则看不到最新的k8s--1.20.2版本
yum clean all
yum makecache
笔者由于之前已经有了这个repo,所以必须执行yum缓存清除的操作。
查看支持的版本:
yum list --showduplicates kubeadm --disableexcludes=kubernetes
升级 kubeadm到1.20.2-0:
yum install -y kubeadm-1.20.2-0 --disableexcludes=kubernetes
查看版本验证升级成功:
kubeadm version
从集群中移除要升级的节点:
kubectl drain future --ignore-daemonsets
(future是当前节点名称,通过kubectl get nodes获得)
再次kubectl get nodes,可以看到:
kubectl get pods --all-namespaces:可以看到coredns是Pending,说明已经被完全隔离。
升级需要如下image,墙原因需要曲线下载(或者vpn):
k8s.gcr.io/kube-scheduler:v1.20.2
k8s.gcr.io/kube-apiserver:v1.20.2
k8s.gcr.io/kube-controller-manager:v1.20.2
k8s.gcr.io/kube-proxy:v1.20.2
我是曲线下载:
docker pull gotok8s/kube-scheduler:v1.20.2
docker pull gotok8s/kube-apiserver:v1.20.2
docker pull gotok8s/kube-controller-manager:v1.20.2
docker pull gotok8s/kube-proxy:v1.20.2
然后重命名:
docker tag gotok8s/kube-scheduler:v1.20.2 k8s.gcr.io/kube-scheduler:v1.20.2
docker tag gotok8s/kube-apiserver:v1.20.2 k8s.gcr.io/kube-apiserver:v1.20.2
docker tag gotok8s/kube-controller-manager:v1.20.2 k8s.gcr.io/kube-controller-manager:v1.20.2
docker tag gotok8s/kube-proxy:v1.20.2 k8s.gcr.io/kube-proxy:v1.20.2
升级kubeadm k8s cluster版本:
kubeadm upgrade apply v1.20.2
你的coredns pod可能会报这个错:
是因为目前节点还是不可调度状态:kubectl get nodes
需要将worknode的unschedulable改为ture,这样让节点可以被集群调度。
kubectl patch node future -p "{"spec":{"unschedulable":false}}"
可以看到集群恢复:
查看镜像版本:
kubectl get pods --all-namespaces -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
kubectl version,看到kubectl client版本还不对:
要重启kubelet:
systemctl daemon-reload
systemctl restart kubelet
重启后依然不对,纳闷了,之前版本升级到这里已经OK了,我采用手动升级kubectl和kubelete。
手动升级kubectl到1.20.2-0:
列出版本找到要升级的版本:
yum list --showduplicates kubectl --disableexcludes=kubernetes
升级 kubectl到1.20.2-0:
yum install -y kubectl-1.20.2-0 --disableexcludes=kubernetes
kubectl version执行后版本正确:
手动升级kubelet到1.20.2-0:
升级前的kubelet版本:kubelet --version
列出版本找到要升级的版本:
yum list --showduplicates kubelet --disableexcludes=kubernetes
升级 kubelet到1.20.2-0:
yum install -y kubelet-1.20.2-0 --disableexcludes=kubernetes
需要重启kubelet才会生效,否则node依然是1.19.3版本:
重启kubelet:
systemctl daemon-reload
systemctl restart kubelet
再次查看node版本:
最后全部重新验证一下:
kubeadm version:正确
kubectl version:正确
kubelet --version:正确
kubectl get nodes:正确
查看镜像版本:正确
kubectl get pods --all-namespaces -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
至此,kubernetes集群从v1.19.3升级到了v1.20.2。