1. 程式人生 > >將Kubeadm單Master叢集平滑升級至HA Master叢集_Kubernetes中文社群

將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-