베어메탈용 Anthos 클러스터의 손상된 노드 강제 삭제

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

베어메탈용 Anthos 클러스터 1.6.0에서 노드 강제 삭제

Anthos on bare metal 1.6.0 출시 버전에서는 상위 노드 풀에서 노드를 제거하면 다음과 같은 결과가 발생합니다.

  • 노드 드레이닝
  • Kubernetes 클러스터에서 노드 삭제
  • Anthos on bare metal을 설치하기 전 상태로 머신 재설정

하지만 노드에 액세스할 수 없으면 노드 드레이닝이 완료되지 않습니다. 컨트롤러가 노드 드레이닝을 반복해서 시도하고 작업이 진행되지 않습니다.

임시 해결 방법으로, 드레이닝 및 재설정 단계를 우회하도록 다음 변경사항을 적용할 수 있습니다.

주의: 이 작업을 수행하려면 Kubernetes 커스텀 리소스의 특정 구현 필드를 주의해서 업데이트해야 합니다. 노드를 복구할 수 없다고 확신하는 경우가 아니라면 진행하지 마세요.

노드 풀에서 손상된 노드를 물리적으로 삭제하고 관리 클러스터에서 변경사항을 적용한 후 이 단계를 수행합니다.

  1. ADMIN_KUBECONFIGkubeconfig 파일의 경로이고 CLUSTER_NAMESPACE가 해당 클러스터 네임스페이스인 관리 클러스터에서 클러스터 API 머신 커스텀 리소스를 찾습니다.

    kubectl --kubeconfig ADMIN_KUBECONFIG \
    -n CLUSTER_NAMESPACE get ma 10.200.0.8
    

    이 명령어는 다음과 비슷한 결과를 반환합니다.

    NAME         PROVIDERID               PHASE
    10.200.0.8   baremetal://10.200.0.8   Deleting
    

    이 예시에서 10.200.0.8은 삭제 단계에서 멈춘 노드의 IP 주소입니다.

  2. 머신 커스텀 리소스를 수정하고 machine.cluster.x-k8s.io/exclude-node-draining 주석을 추가합니다. 키가 있는 한 주석 값 자체는 중요하지 않으며, 드레이닝이 생략됩니다.

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    annotate ma 10.200.0.8 machine.cluster.x-k8s.io/exclude-node-draining=true
    
  3. 관리 클러스터에서 베어메탈 머신 커스텀 리소스를 찾습니다.

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    get baremetalmachine 10.200.0.8
    

    이 명령어는 다음과 비슷한 결과를 반환합니다.

    NAME         CLUSTER    READY   INSTANCEID               MACHINE
    10.200.0.8   cluster1   true    baremetal://10.200.0.8   10.200.0.8
    
  4. 종료자를 삭제하여 재설정 단계를 건너뛰고 노드 삭제를 잠금 해제합니다.

    kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
    patch baremetalmachine 10.200.0.8 --type json -p='[{"op": "remove", "path": "/metadata/finalizers"}]'
    

    몇 초 후 노드가 클러스터에서 삭제됩니다.

베어메탈용 Anthos 클러스터 1.6.1에서 노드 강제 삭제

베어메탈용 Anthos 클러스터 1.6.1에서는 주석을 추가하여 강제 삭제할 노드를 표시할 수 있습니다.

상위 노드 풀에서 노드를 삭제한 후 다음 명령어를 실행하여 해당 오류가 발생한 머신에 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 클러스터가 노드를 성공적으로 삭제합니다.

제어 영역 노드 강제 삭제

제어 영역 노드를 강제 삭제하는 것은 제어 영역 노드에서 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. 수정된 구성 맵을 저장하면 오류가 발생한 노드가 클러스터에서 삭제됩니다.