노드가 손상되었거나 복구 또는 교체를 위해 클러스터에서 노드를 삭제해야 할 경우 클러스터에서 강제로 삭제할 수 있습니다.
베어메탈용 Anthos 클러스터 1.6.0에서 노드 강제 삭제
Anthos on bare metal 1.6.0 출시 버전에서는 상위 노드 풀에서 노드를 제거하면 다음과 같은 결과가 발생합니다.
- 노드 드레이닝
- Kubernetes 클러스터에서 노드 삭제
- Anthos on bare metal을 설치하기 전 상태로 머신 재설정
하지만 노드에 액세스할 수 없으면 노드 드레이닝이 완료되지 않습니다. 컨트롤러가 노드 드레이닝을 반복해서 시도하고 작업이 진행되지 않습니다.
임시 해결 방법으로, 드레이닝 및 재설정 단계를 우회하도록 다음 변경사항을 적용할 수 있습니다.
주의: 이 작업을 수행하려면 Kubernetes 커스텀 리소스의 특정 구현 필드를 주의해서 업데이트해야 합니다. 노드를 복구할 수 없다고 확신하는 경우가 아니라면 진행하지 마세요.
노드 풀에서 손상된 노드를 물리적으로 삭제하고 관리 클러스터에서 변경사항을 적용한 후 이 단계를 수행합니다.
ADMIN_KUBECONFIG가
kubeconfig
파일의 경로이고 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 주소입니다.
머신 커스텀 리소스를 수정하고
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
관리 클러스터에서 베어메탈 머신 커스텀 리소스를 찾습니다.
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
종료자를 삭제하여 재설정 단계를 건너뛰고 노드 삭제를 잠금 해제합니다.
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
파일 경로입니다.
다음 명령어를 사용하여
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
남은 정상 상태의
etcd
Pod 중 하나에 Exec를 수행합니다.kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \ kube-system etcd-357b68f4ecf0 -- /bin/sh
현재 구성원을 조회하여 오류가 발생한 구성원의 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
오류가 발생한 구성원을 삭제합니다.
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
파일 경로입니다.
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 ...
구성 맵을 수정하여 실패한 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 ...
수정된 구성 맵을 저장하면 오류가 발생한 노드가 클러스터에서 삭제됩니다.