마스터 노드 중 하나를 삭제한 후 etcd가 비정상이 됩니다. 수정 사항을 찾고 있습니다.

마스터 노드 중 하나를 삭제한 후 etcd가 비정상이 됩니다. 수정 사항을 찾고 있습니다.

3개의 마스터 노드인 kubeadm을 사용하여 Kubernetes 클러스터를 설정했습니다. 어느 날 마스터 노드 중 하나를 폐기(인프라 마이그레이션)해야 해서 'kubectl delete node ***'를 실행하여 해당 마스터 노드를 삭제했습니다. 며칠 전까지만 해도 새 VM을 설치하고 이를 마스터로 클러스터에 다시 연결하려고 시도했지만 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 포드의 로그를 확인했는데, 마스터 노드가 삭제된 이후 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 클러스터에 여전히 남아 있는 삭제된 마스터 노드를 제거하기 위해 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라는 configmap이 있는데, 이는 삭제된 마스터 노드를 API 엔드포인트 중 하나로 여전히 기억합니다. 이는 etcd 클러스터 상태를 확인하는 단계에서 새 마스터 노드에 합류하는 것을 차단합니다. kubeadm이 해당 구성 맵을 읽고 삭제된 것을 확인할 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

관련 정보