在我刪除一個主節點後,etcd 變得不健康,我正在尋找修復方法

在我刪除一個主節點後,etcd 變得不健康,我正在尋找修復方法

我有一個帶有 kubeadm 和 3 個主節點的 Kubernetes 叢集設定。有一天,其中一個主節點需要退役(基礎設施遷移),所以我透過執行「kubectl刪除節點***」刪除了該主節點。直到幾天前,我安裝了一個新的虛擬機器並嘗試將其作為主節點加入到叢集中,但在檢查 etcd 健康狀態時失敗了。

[check-etcd] Checking that the etcd cluster is healthy
error execution phase check-etcd: error syncing endpoints with etc: dial tcp 10.233.42.22:2379: connect: no route to host

然後我去檢查其餘 etcd pod 的日誌,看起來自從主節點被刪除後它開始報告 etcd 不健康。

rafthttp: health check for peer 55ab807fd1dc1d4 could not connect: dial tcp 10.233.42.22:2380: i/o timeout

kubectl logs etcd-ne1-prd-lnxstgivt01.ubisoft.org -n kube-system | grep 'could not connect: dial tcp 10.233.42.22:2380: i/o timeout' | awk '{ print $1 }' | uniq
2019-08-12
2019-08-13
2019-08-14
2019-08-15
2019-08-16
2019-08-17
2019-08-18
2019-08-19
2019-08-20
2019-08-21
2019-08-22

從上面可以看到,連續幾天報錯。我認為這可能是因為 etcd 仍然記得已刪除的節點。如果是這樣,我想在 etcd 中也永久刪除該節點,以避免出現不健康狀態。

不確定您是否遇到過這個問題並得到了解決方案。

謝謝。

答案1

最後我想出了一個解決方案。

首先,您需要附加到任何 etcd pod 中,以刪除仍保留在 etcd 叢集中的已刪除主節點,並確保叢集最終健康。

**List current nodes to get failed node id**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
55ab807fd1dc1d4: name=ae1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.233.42.22:2380 clientURLs=https://10.233.42.22:2379 isLeader=false
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true

**Remove the dead one**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member remove 55ab807fd1dc1d4
Removed member 55ab807fd1dc1d4 from cluster

**Verify it is removed**
/ # etcdctl --endpoint=https://10.0.1.31:2379 --ca-file=/etc/kubernetes/pki/etcd/ca.crt --cert-file=/etc/kubernetes/pki/etcd/peer.crt --key-file=/etc/kubernetes/pki/etcd/peer.key member list
3da60ac5e6f29b0e: name=pdc-prd-lnxstginvt01.ubisoft.org peerURLs=https://10.0.1.31:2380 clientURLs=https://10.0.1.31:2379 isLeader=false
d13a6c20fbb32f2d: name=ne1-prd-lnxstgivt01.ubisoft.org peerURLs=https://10.136.66.170:2380 clientURLs=https://10.136.66.170:2379 isLeader=true

其次,在 kube-public 命名空間中有一個名為 kubeadm-config 的配置映射,它仍然記住已刪除的主節點作為 api 端點之一。這會阻止您在檢查 etcd 叢集健康狀態的階段加入新的主節點,因為 kubeadm 會讀取該 configmap 並將已刪除的主節點作為要檢查的 etcd 節點。因此,將該命名空間匯出到 yaml 文件,編輯該文件並將其套用回來,以將其從 api 端點清單中刪除。

kubectl get configmap kubeadm-config -n kube-system -o yaml
apiVersion: v1
data:
  ClusterStatus: |
    apiEndpoints:
      ae1-prd-lnxstgivt01.ubisoft.org:
        advertiseAddress: 10.233.42.22
        bindPort: 6443
      ne1-prd-lnxstgivt01.ubisoft.org:
        advertiseAddress: 10.136.66.170
        bindPort: 6443
      pdc-prd-lnxstginvt01.ubisoft.org:
        advertiseAddress: 10.0.1.31
        bindPort: 6443
    apiVersion: kubeadm.k8s.io/v1beta1
    kind: ClusterStatus
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: …

測試版本:1.14.3

相關內容