자동 노드 복구 및 상태 점검

Google Distributed Cloud에서는 주기적인 상태 점검과 자동 노드 복구가 기본적으로 사용 설정되어 있습니다.

노드 자동 복구 기능은 클러스터에서 비정상 노드를 지속적으로 감지하고 복구합니다.

주기적인 상태 점검은 15분마다 실행됩니다. 이는 gkectl diagnose cluster에서 수행하는 것과 동일합니다. 결과는 관리자 클러스터의 클러스터 객체에 로그 및 이벤트로 표시됩니다.

관리자 클러스터와 사용자 클러스터 각각에 자동 노드 복구에 사용할 수 있는 추가 IP 주소가 있는지 확인합니다.

비정상 노드 조건

다음 조건은 노드가 비정상이라는 것을 나타냅니다.

  • 노드 조건 NotReady는 약 10분 동안 true입니다.

  • 생성 후 머신 상태는 약 10분 동안 Unavailable입니다.

  • VM 생성 후 머신 상태는 약 30분 동안 Available이 아닙니다.

  • 약 10분 동안 Available 상태의 머신에 해당하는 노드 객체(nodeRef가 nil)가 없습니다.

  • 노드 조건 DiskPressure는 약 30분 동안 true입니다.

노드 복구 전략

노드가 이전 목록의 조건 중 하나 이상을 충족하면 Google Distributed Cloud가 노드에서 복구를 시작합니다.

복구 시 비정상 노드가 드레이닝되고 새 VM이 생성됩니다. 노드 드레이닝이 1시간 동안 실패하면 복구는 강제로 드레이닝하고 연결된 Kubernetes 관리형 디스크를 안전하게 분리합니다.

동일한 MachineDeployment에 여러 비정상 노드가 있으면 한 번에 이러한 노드 중 하나에만 복구가 수행됩니다.

노드 풀의 시간당 복구 수는 다음의 최댓값으로 제한됩니다.

  • 3
  • 노드 풀에 있는 노드 수의 10%

새 클러스터의 노드 복구 및 상태 점검 사용 설정

관리자 또는 사용자 클러스터 구성 파일에 대해 autoRepair.enabledtrue로 설정합니다.

autoRepair:
  enabled: true

관리자 또는 사용자 클러스터를 만드는 단계를 계속 진행합니다.

기존 사용자 클러스터에 노드 복구 및 상태 점검 사용 설정

사용자 클러스터 구성 파일에서 autoRepair.enabledtrue로 설정합니다.

클러스터를 업데이트합니다.

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

다음을 바꿉니다.

  • ADMIN_CLUSTER_KUBECONFIG: 관리자 클러스터 kubeconfig 파일의 경로

  • USER_CLUSTER_CONFIG: 사용자 클러스터 구성 파일의 경로

기존 관리자 클러스터에 노드 복구 및 상태 점검 사용 설정

관리자 클러스터 구성 파일에서 autoRepair.enabledtrue로 설정합니다.

클러스터를 업데이트합니다.

gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG

ADMIN_CLUSTER_CONFIG를 관리자 클러스터 구성 파일의 경로로 바꿉니다.

상태 확인기에서 로그 보기

관리자 클러스터에 모든 상태 점검기 pod를 나열합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --all-namespaces | grep cluster-health-controller

출력은 다음과 비슷합니다.

kube-system       cluster-health-controller-6c7df455cf-zlfh7   2/2   Running
my-user-cluster   cluster-health-controller-5d5545bb75-rtz7c   2/2   Running

특정 상태 점검기에서 로그를 보려면 pod 중 하나에서 cluster-health-controller 컨테이너 로그를 가져옵니다. 예를 들어 앞의 출력에 표시된 my-user-cluster 로그를 가져오려면 다음 명령어를 실행합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster logs \
    cluster-health-controller-5d5545bb75-rtz7c cluster-health-controller

상태 점검기에서 이벤트 보기

관리자 클러스터에 모든 클러스터 객체를 나열합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get clusters --all-namespaces

출력은 다음과 비슷합니다.

default            gke-admin-ldxh7   2d15h
my-user-cluster    my-user-cluster   2d12h

특정 클러스터의 이벤트를 보려면 --show-events 플래그를 사용하여 kubectl describe cluster를 실행합니다. 예를 들어 앞의 출력에 표시된 my-user-cluster 이벤트를 보려면 다음 명령어를 실행합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster \
    describe --show-events cluster my-user-cluster

출력 예시:

Events:
  Type     Reason             Age   From                                 Message
  ----     ------             ----  ----                                 -------
  Warning  ValidationFailure  17s   cluster-health-periodics-controller  validator for Pod returned with status: FAILURE, reason: 1 pod error(s).

사용자 클러스터의 노드 복구 및 상태 점검 사용 중지

사용자 클러스터 구성 파일에서 autoRepair.enabledfalse로 설정합니다.

클러스터를 업데이트합니다.

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

관리자 클러스터의 노드 복구 및 상태 점검 사용 중지

관리자 클러스터 구성 파일에서 autoRepair.enabledfalse로 설정합니다.

클러스터를 업데이트합니다.

gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG

노드 자동 복구 디버깅

관리자 클러스터에서 머신 및 노드 객체를 설명하여 노드 자동 복구 문제를 조사할 수 있습니다. 예를 들면 다음과 같습니다.

머신 객체를 나열합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG  get machines

출력 예시:

default     gke-admin-master-wcbrj
default     gke-admin-node-7458969ff8-5cg8d
default     gke-admin-node-7458969ff8-svqj7
default     xxxxxx-user-cluster-41-25j8d-567f9c848f-fwjqt

머신 객체 중 하나를 설명합니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe machine gke-admin-master-wcbrj

출력에서 cluster-health-controller의 이벤트를 확인합니다.

마찬가지로, 노드 객체를 나열하고 설명할 수 있습니다. 예를 들면 다음과 같습니다.

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get nodes
...
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe node gke-admin-master-wcbrj

수동 노드 복구

관리 제어 영역 노드

관리자 제어 영역 노드에는 일반적인 수동 복구가 작동하지 않으므로 전용 복구 명령어가 있습니다.

gkectl repair admin-master를 사용하여 관리자 제어 영역 노드를 복구합니다.

Controlplane V2 사용자 클러스터 제어 영역 노드

Controlplane V2 사용자 클러스터 제어 영역 노드는 다른 노드와 별도로 관리됩니다.

kubeception 사용자 클러스터와 유사하게 Controlplane V2 사용자 클러스터의 제어 영역 머신 객체는 관리자 클러스터에 있습니다. 노드 자동 복구에 관리자 클러스터 노드 자동 복구가 적용됩니다.

관리자 클러스터 노드 자동 복구 로직이 적용되지 않는 노드 문제가 있거나 관리자 클러스터 노드 자동 복구를 사용 설정하지 않은 경우 수동 복구를 수행할 수 있습니다. 그러면 노드가 삭제되고 다시 생성됩니다.

  1. 노드에 해당하는 머신 객체의 이름을 가져옵니다.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get machines
    

    다음을 바꿉니다.

    • ADMIN_CLUSTER_KUBECONFIG: 관리자 kubeconfig 파일의 경로
    • USER_CLUSTER_NAME: 대상 사용자 클러스터 이름
  2. 머신 객체에 repair 주석을 추가합니다.

    kubectl annotate --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
    

    MACHINE_NAME을 머신 객체의 이름으로 바꿉니다.

  3. 머신 객체를 삭제합니다.

    kubectl delete --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME
    

HA 제어 영역에 대해 노드를 하나씩 다시 만듭니다. 그렇지 않으면 제어 영역이 예기치 않게 중단될 수 있습니다.

기타 노드

자동 복구 로직이 적용되지 않는 노드 문제가 있거나 노드 자동 복구를 사용 설정하지 않은 경우 수동 복구를 수행할 수 있습니다. 그러면 노드가 삭제되고 다시 생성됩니다.

노드에 해당하는 머신 객체의 이름을 가져옵니다.

kubectl --kubeconfig CLUSTER_KUBECONFIG get machines

CLUSTER_KUBECONFIG를 관리자 또는 사용자 클러스터 kubeconfig 파일의 경로로 바꿉니다.

머신 객체에 repair 주석을 추가합니다.

kubectl annotate --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true

MACHINE_NAME을 머신 객체의 이름으로 바꿉니다.

머신 객체를 삭제합니다.

kubectl delete --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME