kubernetes升级1.8--1.9--1.10--1.11--1.12

kubernetes升级1.8–>1.9–>1.10–>1.11–>1.12

kubernetes中的docker升级到docker-ce请参考本人文章 https://blog.csdn.net/u010285941/article/details/85276207

介绍下目前使用的kubernetes版本是1.8,计划升级到1.12.3。官方提供的升级文档中,有很多小坑 >_<

升级 kubernetes集群,只能逐版本升级。只能从 1.8 升级到 1.9 而不能从 1.8 直接升级到 1.10

升级步骤: 1.8—>1.9.11—>1.10.11—>1.11.5—>1.12.3

需要注意的地方是,kubernetes从1.11版本开始变化比较大,CoreDNS已作为默认DNS。
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf中的环境变量被分配为三个文件:/var/lib/kubelet/config.yaml (其中cgroup驱动默认cgroupfs)、/var/lib/kubelet/kubeadm-flags.env (cgroup驱动默认systemd,优先权)、/etc/sysconfig/kubelet
全新安装的kubernetes集群是有网络CNI配置的,升级安装的是没有CNI配置的,配置文件/var/lib/kubelet/kubeadm-flags.env。依赖的镜像tag抬头从gcr.io/google_containers变成k8s.gcr.io,升级基本使用gcr.io/google_containers,全新安装则使用k8s.gcr.io>_<

从1.8开始为kube-proxy组件引入了IPVS模式,1.11版本开始正式支持IPVS,默认不开启,1.12以上版本默认开启,不开启则使用iptables模式

开启IPVS方法如下,并加入开机启动项,ipvsadm -ln可以看到相关Service的ipvs规则

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
yum install -y ipset ipvsadm

1. 准备升级镜像

提前准备好升级所需的镜像image,并打成官方标准tag。
master节点需要所有镜像,node节点仅需要dns、proxy、pause镜像

1.1 Master节点下载各版本镜像

#1.9.11
#gcr.io/google_containers/kube-proxy-amd64:v1.9.11
#gcr.io/google_containers/kube-scheduler-amd64:v1.9.11
#gcr.io/google_containers/kube-controller-manager-amd64:v1.9.11
#gcr.io/google_containers/kube-apiserver-amd64:v1.9.11
#gcr.io/google_containers/etcd-amd64:3.1.11
#gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.7
#gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7
#gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.7
#gcr.io/google_containers/pause-amd64:3.0
images=(kube-proxy-amd64:v1.9.11 kube-scheduler-amd64:v1.9.11 \
kube-controller-manager-amd64:v1.9.11 kube-apiserver-amd64:v1.9.11 \
etcd-amd64:3.1.11 k8s-dns-sidecar-amd64:1.14.7 pause-amd64:3.0 \
k8s-dns-kube-dns-amd64:1.14.7 k8s-dns-dnsmasq-nanny-amd64:1.14.7)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/google_containers/$imageName
docker tag mirrorgooglecontainers/google_containers/$imageName gcr.io/google_containers/$imageName
docker rmi mirrorgooglecontainers/google_containers/$imageName
done

#1.10.11
#gcr.io/google_containers/kube-proxy-amd64:v1.10.11
#gcr.io/google_containers/kube-scheduler-amd64:v1.10.11
#gcr.io/google_containers/kube-controller-manager-amd64:v1.10.11
#gcr.io/google_containers/kube-apiserver-amd64:v1.10.11
#gcr.io/google_containers/etcd-amd64:3.1.12
#gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8
#gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8
#gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8
#gcr.io/google_containers/pause-amd64:3.1
images=(kube-proxy-amd64:v1.10.11 kube-scheduler-amd64:v1.10.11 \
kube-controller-manager-amd64:v1.10.11 kube-apiserver-amd64:v1.10.11 \
etcd-amd64:3.1.12 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 \
k8s-dns-dnsmasq-nanny-amd64:1.14.8 pause-amd64:3.1)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/google_containers/$imageName
docker tag mirrorgooglecontainers/google_containers/$imageName gcr.io/google_containers/$imageName
docker rmi mirrorgooglecontainers/google_containers/$imageName
done

# 1.11.5
#gcr.io/google_containers/kube-proxy-amd64:v1.11.5
#gcr.io/google_containers/kube-scheduler-amd64:v1.11.5
#gcr.io/google_containers/kube-controller-manager-amd64:v1.11.5
#gcr.io/google_containers/kube-apiserver-amd64:v1.11.5
#gcr.io/google_containers/etcd-amd64:3.2.18
#gcr.io/google_containers/pause-amd64:3.1
#k8s.gcr.io/pause-amd64:3.1
#k8s.gcr.io/pause:3.1
#gcr.io/google_containers/coredns:1.1.3
images=(kube-proxy-amd64:v1.11.5 kube-scheduler-amd64:v1.11.5 \
kube-controller-manager-amd64:v1.11.5 kube-apiserver-amd64:v1.11.5 \
etcd-amd64:3.2.18 pause-amd64:3.1 pause:3.1)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/google_containers/$imageName
docker tag mirrorgooglecontainers/google_containers/$imageName gcr.io/google_containers/$imageName
docker rmi mirrorgooglecontainers/google_containers/$imageName
done
docker tag gcr.io/google_containers/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
docker tag gcr.io/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker pull coredns:coredns:1.1.3
docker tag coredns:coredns:1.1.3 gcr.io/google_containers/coredns:1.1.3
docker rmi coredns:coredns:1.1.3

#1.12.3
#gcr.io/google_containers/kube-proxy:v1.12.3
#gcr.io/google_containers/kube-scheduler:v1.12.3
#gcr.io/google_containers/kube-controller-manager:v1.12.3
#gcr.io/google_containers/kube-apiserver:v1.12.3
#gcr.io/google_containers/etcd:3.2.24
#gcr.io/google_containers/pause:3.1
#k8s.gcr.io/pause:3.1
#gcr.io/google_containers/coredns:1.2.2
images=(kube-proxy:v1.12.3 kube-scheduler:v1.12.3 \
kube-controller-manager:v1.12.3 kube-apiserver:v1.12.3 \
etcd:3.2.24 pause:3.1)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/google_containers/$imageName
docker tag mirrorgooglecontainers/google_containers/$imageName gcr.io/google_containers/$imageName
docker rmi mirrorgooglecontainers/google_containers/$imageName
done
docker tag gcr.io/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker pull coredns:coredns:1.2.2
docker tag coredns:coredns:1.2.2 gcr.io/google_containers/coredns:1.2.2
docker rmi coredns:coredns:1.2.2

1.2 Node节点下载各版本镜像

#gcr.io/google_containers/kube-proxy-amd64:v1.9.11 gcr.io/google_containers/kube-proxy-amd64:v1.10.11
#gcr.io/google_containers/kube-proxy-amd64:v1.11.5 gcr.io/google_containers/kube-proxy:v1.12.3
#gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.7 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.7 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.7
#gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8
#gcr.io/google_containers/coredns:1.1.3 gcr.io/google_containers/coredns:1.2.2
#gcr.io/google_containers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.1
#gcr.io/google_containers/pause:3.1 k8s.gcr.io/pause:3.1 k8s.gcr.io/pause-amd64:3.1
images=(kube-proxy-amd64:v1.9.11 kube-proxy-amd64:v1.10.11 kube-proxy-amd64:v1.11.5 kube-proxy:v1.12.3 \
k8s-dns-sidecar-amd64:1.14.7 k8s-dns-kube-dns-amd64:1.14.7 k8s-dns-dnsmasq-nanny-amd64:1.14.7 \
k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 \
pause-amd64:3.0 pause-amd64:3.1 pause:3.1)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/google_containers/$imageName
docker tag mirrorgooglecontainers/google_containers/$imageName gcr.io/google_containers/$imageName
docker rmi mirrorgooglecontainers/google_containers/$imageName
done
docker tag gcr.io/google_containers/pause-amd64:3.1 k8s.gcr.io/pause-amd64:3.1
docker tag gcr.io/google_containers/pause:3.1 k8s.gcr.io/pause:3.1
docker pull coredns:coredns:1.1.3
docker tag coredns:coredns:1.1.3 gcr.io/google_containers/coredns:1.1.3
docker rmi coredns:coredns:1.1.3
docker pull coredns:coredns:1.2.2
docker tag coredns:coredns:1.2.2 gcr.io/google_containers/coredns:1.2.2
docker rmi coredns:coredns:1.2.2

2. 节点升级

为了保证业务的正常运行,首先需要把升级kubernetes的节点标记为不可调度,并且将正在运行中的容器移到其他节点(kubernetes集群自身的kube服务与网络weave是无法移走的),在升级完成后恢复调度

注意:待所有节点升级到1.9版本后,才能再升级至1.10,如此往复

1.8.1升级到1.9.11

master节点

#设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon master其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain master其中一台的节点名 --ignore-daemonsets --delete-local-data

#先升级kubeadm
yum install -y kubeadm-1.9.11

#保持kubernetes与docker的Cgroup Driver一致。默认不调整kubernetes的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#执行升级,确保上面已经准备好镜像image
kubeadm upgrade apply v1.9.11
#看到如下,说明升级成功
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.9.11". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets in turn.

#容器进行初始化,查看系统服务pod是否恢复正常运行。
kubectl get pod -o wide --all-namespaces

#升级kubelet kubectl
yum install -y kubelet-1.9.11 kubectl-1.9.11

#确保容器AGE在一分钟以上,再重启服务
systemctl daemon-reload && systemctl restart kubelet

#查看master节点版本已成功升级
kubectl get nodes

#恢复调度
kubectl uncordon master节点名称

node节点

#设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon node其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain node其中一台的节点名 --ignore-daemonsets --delete-local-data

#节点上执行,升级kubelet kubeadm kubectl
yum install -y kubelet-1.9.11 kubectl-1.9.11 kubeadm-1.9.11

#保持kubernetes与docker的Cgroup Driver一致。默认不调整docker的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#重启服务
systemctl daemon-reload && systemctl restart kubelet

#恢复调度
kubectl uncordon node节点名称

1.9.11升级到1.10.11

master节点

#设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon master其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain master其中一台的节点名 --ignore-daemonsets --delete-local-data

#先升级kubeadm
yum install -y kubeadm-1.10.11

#保持kubernetes与docker的Cgroup Driver一致。默认不调整kubernetes的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#执行升级,确保上面已经准备好镜像image
kubeadm upgrade apply v1.10.11
#看到如下,说明升级成功
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.10.11". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets in turn.

#容器进行初始化,查看系统服务pod是否恢复正常运行。
kubectl get pod -o wide --all-namespaces

#升级kubelet kubectl
yum install -y kubelet-1.10.11 kubectl-1.10.11

#确保容器AGE在一分钟以上,再重启服务
systemctl daemon-reload && systemctl restart kubelet

#查看master节点版本已成功升级
kubectl get nodes

#恢复调度
kubectl uncordon master节点名称

node节点

#设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon node其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain node其中一台的节点名 --ignore-daemonsets --delete-local-data

#节点上执行,升级kubelet kubeadm kubectl
yum install -y kubelet-1.10.11 kubectl-1.10.11 kubeadm-1.10.11

#保持kubernetes与docker的Cgroup Driver一致。默认不调整docker的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#重启服务
systemctl daemon-reload && systemctl restart kubelet

#恢复调度
kubectl uncordon node节点名称

1.10.11升级到1.11.5

master节点

#设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon master其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain master其中一台的节点名 --ignore-daemonsets --delete-local-data

#先升级kubeadm
yum install -y kubeadm-1.11.5

#保持kubernetes与docker的Cgroup Driver一致。默认不调整kubernetes的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#执行升级,确保上面已经准备好镜像image
kubeadm upgrade apply v1.11.5
#看到如下,说明升级成功
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.11.5". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets in turn.

#容器进行初始化,查看系统服务pod是否恢复正常运行。
kubectl get pod -o wide --all-namespaces

#升级kubelet kubectl
yum install -y kubelet-1.11.5 kubectl-1.11.5

#配置文件/var/lib/kubelet/config.yaml中的cgroupDriver需要保持与docker的Cgroup Driver一致
sed -i 's/cgroupfs/systemd/g' /var/lib/kubelet/config.yaml

#配置文件/var/lib/kubelet/kubeadm-flags.env中的cgroupDriver需要保持与docker的Cgroup Driver一致
echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env

#确保容器AGE在一分钟以上,再重启服务
systemctl daemon-reload && systemctl restart kubelet

#查看master节点版本已成功升级
kubectl get nodes

#恢复调度
kubectl uncordon master节点名称

node节点

#设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon node其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain node其中一台的节点名 --ignore-daemonsets --delete-local-data

#节点上执行,升级kubelet kubeadm kubectl
yum install -y kubelet-1.11.5 kubectl-1.11.5 kubeadm-1.11.5

#保持kubernetes与docker的Cgroup Driver一致。默认不调整docker的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#升级node节点的配置,配置文件/var/lib/kubelet/config.yaml中的cgroupDriver需要保持与docker的Cgroup Driver一致
kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
sed -i 's/cgroupfs/systemd/g' /var/lib/kubelet/config.yaml

#配置文件/var/lib/kubelet/kubeadm-flags.env中的cgroupDriver需要保持与docker的Cgroup Driver一致
echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env

#重启服务
systemctl daemon-reload && systemctl restart kubelet

#恢复调度
kubectl uncordon node节点名称

1.11.5升级到1.12.3

master节点

#设置升级docker的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon master其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain master其中一台的节点名 --ignore-daemonsets --delete-local-data

#先升级kubeadm
yum install -y kubeadm-1.12.3

#保持kubernetes与docker的Cgroup Driver一致。默认不调整kubernetes的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#执行升级,确保上面已经准备好镜像image
kubeadm upgrade apply v1.12.3
#看到如下,说明升级成功
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.12.3". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets in turn.

#容器进行初始化,查看系统服务pod是否恢复正常运行。
kubectl get pod -o wide --all-namespaces

#升级kubelet kubectl
yum install -y kubelet-1.12.3 kubectl-1.12.3

#配置文件/var/lib/kubelet/config.yaml中的cgroupDriver需要保持与docker的Cgroup Driver一致
sed -i 's/cgroupfs/systemd/g' /var/lib/kubelet/config.yaml

#配置文件/var/lib/kubelet/kubeadm-flags.env中的cgroupDriver需要保持与docker的Cgroup Driver一致
echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env

#确保容器AGE在一分钟以上,再重启服务
systemctl daemon-reload && systemctl restart kubelet

#查看master节点版本已成功升级
kubectl get nodes

#恢复调度
kubectl uncordon master节点名称

node节点

#设置升级kubernetes的节点为不可调度,并且将剩余的pod驱逐,通过kubectl get nodes命令看到该节点已被标记不可调度
kubectl cordon node其中一台的节点名

#忽略了所有的daemonset的pod,并且将剩余的pod驱逐
kubectl drain node其中一台的节点名 --ignore-daemonsets --delete-local-data

#节点上执行,升级kubelet kubeadm kubectl
yum install -y kubelet-1.12.3 kubectl-1.12.3 kubeadm-1.12.3

#保持kubernetes与docker的Cgroup Driver一致。默认不调整docker的cgroup驱动,查询得知为systemd
docker info | grep -i cgroup

#docker的Cgroup Driver模式是cgroupfs则更改,systemd则不用。(通过docker info | grep Cgroup查看)
#sed -i 's/cgroup-driver=systemd/cgroup-driver=cgroupfs/g' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf  #kubeadm在1.10版本及以下
#echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env  #kubeadm在1.11版本及以上

#升级node节点的配置,配置文件/var/lib/kubelet/config.yaml中的cgroupDriver需要保持与docker的Cgroup Driver一致
kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
sed -i 's/cgroupfs/systemd/g' /var/lib/kubelet/config.yaml

#配置文件/var/lib/kubelet/kubeadm-flags.env中的cgroupDriver需要保持与docker的Cgroup Driver一致
echo 'KUBELET_KUBEADM_ARGS=--cgroup-driver=systemd --cni-bin-dir=/opt/cni/bin --cni-conf-dir=/etc/cni/net.d --network-plugin=cni' > /var/lib/kubelet/kubeadm-flags.env

#重启服务
systemctl daemon-reload && systemctl restart kubelet

#恢复调度
kubectl uncordon node节点名称

3. 验证

验证节点是否正常

自己通过方法验证吧
注意:待所有节点升级到1.9版本后,才能再升级至1.10,如此往复

4. 清理镜像

#1.8.1
images=(kube-proxy-amd64:v1.8.1 kube-scheduler-amd64:v1.8.1 \
kube-controller-manager-amd64:v1.8.1 kube-apiserver-amd64:v1.8.1 \
etcd-amd64:3.0.17 k8s-dns-sidecar-amd64:1.14.5 k8s-dns-kube-dns-amd64:1.14.1 \
k8s-dns-kube-dns-amd64:1.14.5 k8s-dns-dnsmasq-nanny-amd64:1.14.5)
for imageName in ${images[@]} ; do
docker rmi -f gcr.io/google_containers/$imageName
done

#1.9.11
images=(kube-proxy-amd64:v1.9.11 kube-scheduler-amd64:v1.9.11 \
kube-controller-manager-amd64:v1.9.11 kube-apiserver-amd64:v1.9.11 \
etcd-amd64:3.1.11 k8s-dns-sidecar-amd64:1.14.7 \
k8s-dns-kube-dns-amd64:1.14.7 k8s-dns-dnsmasq-nanny-amd64:1.14.7)
for imageName in ${images[@]} ; do
docker rmi -f gcr.io/google_containers/$imageName
done

#1.10.11
images=(kube-proxy-amd64:v1.10.11 kube-scheduler-amd64:v1.10.11 \
kube-controller-manager-amd64:v1.10.11 kube-apiserver-amd64:v1.10.11 \
etcd-amd64:3.1.12 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 \
k8s-dns-dnsmasq-nanny-amd64:1.14.8)
for imageName in ${images[@]} ; do
docker rmi -f gcr.io/google_containers/$imageName
done

# 1.11.5
images=(kube-proxy-amd64:v1.11.5 kube-scheduler-amd64:v1.11.5 \
kube-controller-manager-amd64:v1.11.5 kube-apiserver-amd64:v1.11.5 \
etcd-amd64:3.2.18 coredns:1.1.3)
for imageName in ${images[@]} ; do
docker rmi -f gcr.io/google_containers/$imageName
done

猜你喜欢

转载自blog.csdn.net/u010285941/article/details/85276064