Anthos clusters on bare metal의 손상된 노드 강제 삭제

노드가 손상되었거나 복구 또는 교체를 위해 클러스터에서 노드를 삭제해야 할 경우 클러스터에서 강제로 삭제할 수 있습니다.

워커 노드 강제 삭제

Anthos clusters on bare metal에서는 주석을 추가하여 강제 삭제할 노드를 표시할 수 있습니다.

상위 노드 풀에서 노드를 삭제한 후 다음 명령어를 실행하여 해당 오류가 발생한 머신에 baremetal.cluster.gke.io/force-remove 주석을 추가합니다. 주석 자체의 값은 중요하지 않습니다.

kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
  annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true

Anthos clusters on bare metal이 노드를 성공적으로 삭제합니다.

제어 영역 노드 강제 삭제

제어 영역 노드를 강제 삭제하는 것은 제어 영역 노드에서 kubeadm reset을 수행하는 것과 유사하며 추가 단계를 수행해야 합니다.

노드 풀에서 제어 영역 노드를 강제 삭제하려면 오류가 발생한 제어 영역 노드가 포함된 클러스터에 대해 다음 작업을 수행해야 합니다.

  • etcd 클러스터에서 실패 노드의 실행 중인 실패한 etcd 구성원 삭제
  • kube의 ClusterStatus를 업데이트하여 해당 apiEndpoint 삭제.

오류가 발생한 etcd 구성원 삭제

오류가 발생한 제어 영역 노드를 삭제하려면 먼저 남은 정상 상태의 etcd 포드에서 etcdctl을 실행합니다. 이 작업에 대한 일반적인 내용은 이 Kubernetes 문서를 참조하세요.

다음 절차에서 CLUSTER_KUBECONFIG는 클러스터의 kubeconfig 파일 경로입니다.

  1. 다음 명령어를 사용하여 etcd Pod를 찾습니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG get \
     pod -n kube-system -l component=etcd -o wide
    

    이 명령어는 다음 노드 목록을 반환합니다. 이 예시에서는 10.200.0.8 노드가 액세스할 수 없고 복구할 수 없다고 가정합니다.

    NAME                READY   STATUS    RESTARTS   AGE     IP           NODE
    etcd-357b68f4ecf0   1/1     Running   0          9m2s    10.200.0.6   357b68f4ecf0
    etcd-7d7c21db88b3   1/1     Running   0          33m     10.200.0.7   7d7c21db88b3
    etcd-b049141e0802   1/1     Running   0          8m22s   10.200.0.8   b049141e0802
    

  2. 남은 정상 상태의 etcd Pod 중 하나에 Exec를 수행합니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. 현재 구성원을 조회하여 오류가 발생한 구성원의 ID를 찾습니다. 이 명령어는 다음 목록을 반환합니다.

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt  member list
    

    이 명령어는 예를 들어 다음을 반환합니다.

    23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false
    772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false
    f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
    
  4. 오류가 발생한 구성원을 삭제합니다.

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \
     member remove f64f66ad8d3e7960
    

ClusterStatus 업데이트 및 오류가 발생한 apiEndpoint 삭제

다음 절차에서 CLUSTER_KUBECONFIG는 클러스터의 kubeconfig 파일 경로입니다.

  1. kubeadm-config 구성 맵 내에서 ClusterStatus 섹션을 찾습니다.

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \
    kube-system kubeadm-config
    

    이 명령어는 아래 표시된 것과 비슷한 결과를 반환합니다.

    ...
    ClusterStatus:
    ----
    apiEndpoints:
    7d7c21db88b3:
      advertiseAddress: 10.200.0.6
      bindPort: 6444
    357b68f4ecf0:
      advertiseAddress: 10.200.0.7
      bindPort: 6444
    b049141e0802:
      advertiseAddress: 10.200.0.8
      bindPort: 6444
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
    ...
    
  2. 구성 맵을 수정하여 실패한 IP가 포함된 섹션을 삭제합니다(이 예시에서는 kubectl edit 명령어를 사용하여 10.200.0.8 삭제 결과를 보여줍니다).

    kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \
    -n kube-system kubeadm-config
    

    수정 후 구성 맵은 다음과 유사합니다.

    ...
    ClusterStatus: |
      apiEndpoints:
        7d7c21db88b3:
          advertiseAddress: 10.200.0.6
          bindPort: 6444
        357b68f4ecf0:
          advertiseAddress: 10.200.0.7
          bindPort: 6444
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterStatus
    ...
    
  3. 수정된 구성 맵을 저장하면 오류가 발생한 노드가 클러스터에서 삭제됩니다.