集羣框架:
node
172.30.0.81 k8s-master1nginx
172.30.0.109 k8s-master2docker
172.30.0.89 k8s-node1api
172.30.2.60 nginx vip網絡
K8S master高可用配置 方便升級集羣的流量切換:app
K8S集羣初始化安裝的版本爲1.10.1,後續考慮到集羣平滑升級方案,再次作了一系列測試,方案適用於1.10.1升級至1.11.0,1.11.0升級至1.12.0親測,整個升級過程不影響正常業務容器,須要提早設置後master負載均衡,摘除準備升級的master節點,將master節點上的容器「排幹」,在升級node節點的時候如是,對容器「排幹」操做,避免業務容器出現中斷的可能。負載均衡
注意:kubeadm 集羣升級,只能按階梯升級,不能跨兩級從1.10直接升級至1.12框架
準備工做:ide
1.準備版本升級所須要的master,node節點的容器鏡像,能夠到官網下載指定版本,或者經過獲取kubeadm默認版本的配置文件,拉取指定的鏡像,如測試
# kubeadm config print init-defaults > init-default.yaml
更換鏡像拉取地址爲阿里雲的,默認是k8s官網的,須要×××
imageRepository: registry.aliyuncs.com/google_containers
# kubeadm upgrade image pull --config=init-default.yaml
鏡像拉取到以後,須要修改標籤,要否則在升級部署的過程k8s會報鏡像拉取失敗,如
升級過程:
1.切換master節點的流量,將須要升級的master節點下掉
2.升級kubeadm到指定版本
# yum update kubeadm-1.12.0 --disableexcludes=kubernetes
查看是否爲預期版本
# kubeadm version
輸出升級版本的config.yaml
# kubeadm config migrate --old-config /app/config.yaml-1.11 --new-config /app/kubeadm-config-1.11.yaml
PS:158行添加
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
kubeadm config print-default > kubeadm-config-default.yaml
(對比 kubeadm-config-default.yaml kubeadm-config-1.11.yaml,補全kubeadm-config-1.11.yaml)
3.查看升級計劃是否正常
# kubeadm upgrade plan
正常則返回success
4.kubeadm upgrade apply --config=/app/kubeadm-config-1.11.yaml
注意:升級過程當中若遇到阻塞,能夠查看控制檯的master相關pod,通常是由於標籤不對拉不到鏡像,須要更改鏡像標籤
此時這臺升級的master的kube-apiserver,controller-manager,scheduler,kube-proxy組件均已升級完畢,能夠經過kubectl describe pod查看版本
(若卡住:kubeadm reset;tar -xf /etc/kubernetes/kubeconf.tar.gz -C /etc/kubernetes/;kubeadm init --config /app/kubeadm-config-1.11.yaml)
5.升級kubelet,修改kubelet配置文件,升級爲升級版本的配置
# yum upgrade kubelet-1.12.0 kubectl-1.12.0 -y
# kubeadm upgrade node config --kubelet-version 1.12.0
重啓kubelet
# systemctl daemon-reload && systemctl restart kubelet
查看系統日誌看節點是否正常
# tail -F /var/log/message
查看節點是否升級成功
# kubectl get node 節點已升級至1.12.0
6.切換nginx流量,下掉另外一臺沒有升級的master'
7.升級第二臺master的kubelet至1.12.0,從新加載kubelet配置
# yum upgrade kubelet-1.12.0 -y
# kubeadm upgrade node config --kubelet-version 1.12.0
重啓kubelet
# systemctl daemon-reload && systemctl restart kubelet
查看系統日誌看節點是否正常
# tail -F /var/log/message
查看節點是否升級成功
# kubectl get node 節點已升級至1.12.0
8.node worker節點升級,升級kubelet,加載新版本配置,從新啓動kubelet便可
9.升級完成
注意:在1.10升級至1.11後 worker節點的kubelet會缺乏一段cni網絡配置,會致使worker節點上的pod ip變爲當前docker服務的ip地址從而沒法通訊
解決方式:
worker 1.10.1-->1.11.0 sudo yum install kubelet-1.11.0 kubeadm-1.11.0 -y sudo kubeadm upgrade node config --kubelet-version v1.11.0 從master複製/var/lib/kubelet/kubeadm-flags.env到worker節點的/var/lib/kubelet/目錄 sudo systemctl daemon-reload && sudo systemctl restart kubelet && sudo systemctl enable kubelet.service