1. 程式人生 > >kubernetes升級1.8--1.9--1.10--1.11--1.12

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