將Kubeadm單Master叢集平滑升級至HA Master叢集_Kubernetes中文社群
文章楔子
本文旨在通過最簡易的方式指導讀者將現有的,kubeadm建立的單master叢集升級為HA master叢集。
升級過程無痛,使用kubeadm原生的功能實現,不需要重啟docker及無關容器。
除k8s叢集控制相關功能(部署、升級、刪除、檢視、排程等),使用者的服務不會被中斷。
升級過程可以將原來是worker的機器平滑納入HA master中,同時不影響原來worker上的容器。
本文中的自動化部署指令碼可以在Lentil1016/kubeadm-ha找到,歡迎Star/Fork/提issue和PR。
在我的環境上進行示例升級的錄影可以在該連結檢視。
額外的,考慮到需要平滑升級的叢集一般為正在使用中的叢集,甚至可能涉及到生產叢集,因此特別提醒讀者
本文升級過程中如果產生故障,通常需要手動修改ETCD的Cluster狀態以回退或繼續升級。
因此要求維護人員對於ETCD叢集重建,成員新增、刪除等有一定經驗。
資料無價,請不要貿然操作。
本文升級過程為作者原創(可能是首創),尚處於驗證的早期,僅在為數不多的叢集上進行過測試。
本指導文章很可能還會繼續演進,完善指導,並新增故障恢復等內容。
作者在kubernetes/website提交了一份proposal,想申請將”平滑升級”的內容加入到官方文件。
如果有人對該文件有什麼需求或者期望可以去上面的連結裡提,讓社群看到這種需求是存在的。
但也不要隨便@人家哈,社群的維護者比較忙。
升級前
升級摘要
升級後,原來的單master將變成HA master中的master-1,另外會有兩臺master備機作為master-2/master-3被加入叢集,其中master-2/master-3既可以是新的、叢集外部的機器,也可以是原來叢集中的worker機器。
升級的基本步驟如下:
- 刪除master-1上原有的 KubeConfig、manifest/etcd、pki/etcd-server、pki/etcd-peer、pki/apiserver
- 使用 kubeadm alpha phase 命令重新建立上列配置
- 重啟master-1上的 apiserver/controller/scheduler/etcd 容器
- 修改master-1上ETCD中0號member的PeerUrl=https://127.0.0.1:2380為https://{master_1_IP}:2380
- 配置新的master備機到叢集中
各個機器的主機資訊以及IP分佈如下:
- Distribute: CentOS 7
- Docker: 17.03.2-ce
- Kernel: 4.4.152-1.el7.elrepo.x86_64
- Kubernetes: 1.11.0
- NetPlugin: Calico
- Proxy-Mode: IPVS
- Master-Mode: HA Master
- DNS: CoreDNS
Host Name | Old Role | New Role | IP |
---|---|---|---|
centos-7-x86-64-29-80 | master | master-1 | 10.130.29.80 |
centos-7-x86-64-29-81 | worker | master-2 | 10.130.29.81 |
centos-7-x86-64-29-82 | Not in cluster | master-3 | 10.130.29.82 |
harbor | image registry | image registry | 10.130.38.80 |
– | Virtual IP | 10.130.29.83 |
前置條件
- master-2/master-3上已經正確的部署了kubeadm/kubectl/kubelet/docker
- 叢集所有機器上的核心版本高於4.0,並且安裝了ipvsadm。以便開啟ipvs,如果不想開啟,請自行修改升級指令碼,去掉kube-proxy的ipvs配置
- master-1/master-2/master-3上已經安裝了keepalived,並且規劃了一個VIP以備使用。
- master-1/master-2/master-3上可以拉取到k8s相關映象。如果需要離線包,請參考kubeadm HA叢集搭建指南中“安裝私有映象庫”一節
配置免密碼登陸
請格外注意,請以現有的單master作為master-1機器,另兩臺master備機分別作為master-2 master-3。
ssh-keygen# 三次回車後,金鑰生成完成 cat ~/.ssh/id_rsa.pub # 得到該機器的公鑰如下圖
將該公鑰複製,並分別登陸到master-1 master-2 master-3的root使用者,將它令起一行貼上到 ~/.ssh/authorized_keys 檔案中,包括master-1自己
複製完成後,從master-1上分別登陸master-1 master-2 master-3測試是否可以免密碼登陸(請不要跳過這一步),可以的話便可以繼續執行下一步
升級至HA Master
升級指令碼解析
本節內容為升級指令碼的過程簡介,章節中出現的程式碼均為從升級指令碼中節選的程式碼,不需要單獨執行。具體的升級命令在下一節給出。
升級指令碼和kubeadm HA叢集搭建指南一文中的自動部署指令碼只有細微的不同,在kubeha-gen.sh指令碼中本應執行“kubeadm init”命令的地方,在kubeha-upgrade.sh指令碼中變成了以下步驟
- 刪除master-1上原有的 KubeConfig、manifest/etcd、pki/etcd-server、pki/etcd-peer、pki/apiserver
- 使用 kubeadm alpha phase 命令重新建立上列配置
- 重啟master-1上的 apiserver/controller/scheduler/etcd 容器
- 修改master-1的PeerUrl=https://127.0.0.1:2380為https://{master_1_IP}:2380
在升級指令碼中,上述步驟對應的程式碼如下
pushd /etc/kubernetes; # 刪除master-1上原有的 KubeConfig、manifest/etcd、pki/etcd-server、pki/etcd-peer、pki/apiserver rm admin.conf controller-manager.conf kubelet.conf scheduler.conf manifests/etcd.yaml pki/apiserver.crt pki/apiserver.key pki/etcd/server.crt pki/etcd/server.key pki/etcd/peer.crt pki/etcd/peer.key # 使用 kubeadm alpha phase 命令重新建立上列配置 kubeadm alpha phase certs apiserver --config /etc/kubernetes/kubeadm-config.yaml kubeadm alpha phase certs etcd-server --config /etc/kubernetes/kubeadm-config.yaml kubeadm alpha phase certs etcd-peer --config /etc/kubernetes/kubeadm-config.yaml kubeadm alpha phase etcd local --config /etc/kubernetes/kubeadm-config.yaml kubeadm alpha phase kubeconfig all --config /etc/kubernetes/kubeadm-config.yaml # 重啟master-1上的 apiserver/controller/scheduler/etcd 容器 echo "Restarting etcd/apiserver/controller/scheduler containers." docker ps|grep -E 'k8s_kube-scheduler|k8s_kube-controller-manager|k8s_kube-apiserver|k8s_etcd'|awk '{print $1}'|xargs -i docker rm -f {} > /dev/null systemctl restart kubelet cp /etc/kubernetes/admin.conf ~/.kube/config popd # 修改master-1的PeerUrl=https://127.0.0.1:2380為https://{master_1_IP}:2380 ETCD=`kubectl get pods -n kube-system 2>&1|grep etcd|awk '{print $3}'` echo "Waiting for etcd bootup..." while [ "${ETCD}" != "Running" ]; do sleep 1 ETCD=`kubectl get pods -n kube-system 2>&1|grep etcd|awk '{print $3}'` done ETCD_MASTER_ID=`kubectl exec \ -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --endpoints=https://${CP0_IP}:2379 \ member list | awk -F ':' '{print $1}'` echo "Updating the PeerUrl of ETCD master [${ETCD_MASTER_ID}]" kubectl exec \ -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --endpoints=https://${CP0_IP}:2379 \ member update ${ETCD_MASTER_ID} https://${CP0_IP}:2380 kubectl exec \ -n kube-system etcd-${CP0_HOSTNAME} -- etcdctl \ --ca-file /etc/kubernetes/pki/etcd/ca.crt \ --cert-file /etc/kubernetes/pki/etcd/peer.crt \ --key-file /etc/kubernetes/pki/etcd/peer.key \ --endpoints=https://${CP0_IP}:2379 \ member list
開始升級
請格外注意,請以現有的單master作為master-1機器,對應下面cluster-info中的CP0,另兩臺master備機分別作為master-2 master-3。否則可能部署失敗,使叢集狀態難以恢復。
示例升級的過程可以在該連結檢視。
# 建立叢集資訊檔案 echo """ CP0_IP=10.130.29.80 CP0_HOSTNAME=centos-7-x86-64-29-80 CP1_IP=10.130.29.81 CP1_HOSTNAME=centos-7-x86-64-29-81 CP2_IP=10.130.29.82 CP2_HOSTNAME=centos-7-x86-64-29-82 VIP=10.130.29.83 NET_IF=eth0 CIDR=172.168.0.0/16 """ > ./cluster-info bash -c "$(curl -fsSL https://raw.githubusercontent.com/Lentil1016/kubeadm-ha/1.11.0/kubeha-upgrade.sh)" # 該步驟將可能持續2到10分鐘,在該指令碼進行安裝部署前,將有一次對安裝資訊進行檢查確認的機會
隨後升級完成
後續處理
剛剛升級完成後,三臺master機器上都被加上了node-role.kubernetes.io/master:NoSchedule這個瑕疵,即使之前已經刪除掉,升級後也會被重新加上。如果需要某個節點既做master又做worker,還需要重新執行下面的命令去掉這個瑕疵
kubectl taint node {node_name} node-role.kubernetes.io/master-