Autopilot 클러스터 문제해결


이 페이지에서는 Google Kubernetes Engine(GKE) Autopilot 클러스터의 문제를 해결하는 방법을 설명합니다.

클러스터 문제

클러스터를 만들 수 없음: 등록된 노드 0개

다음 문제는 사용 중지되었거나 필요한 권한이 없는 IAM 서비스 계정으로 Autopilot 클러스터를 만들려고 할 때 발생합니다. 다음 오류 메시지와 함께 클러스터 만들기가 실패합니다.

All cluster resources were brought up, but: only 0 nodes out of 2 have registered.

문제를 해결하려면 다음 단계를 따르세요.

  1. 기본 Compute Engine 서비스 계정 또는 사용하려는 커스텀 IAM 서비스 계정이 사용 중지되었는지 확인합니다.

    gcloud iam service-accounts describe SERVICE_ACCOUNT
    

    SERVICE_ACCOUNTmy-iam-account@my-first-project.iam.gserviceaccount.com과 같은 서비스 계정 이메일 주소로 바꿉니다.

    서비스 계정이 사용 중지되면 출력이 다음과 비슷하게 표시됩니다.

    disabled: true
    displayName: my-service-account
    email: my-service-account@my-project.iam.gserviceaccount.com
    ...
    
  2. 서비스 계정이 사용 중지되었으면 사용 설정합니다.

    gcloud iam service-accounts enable SERVICE_ACCOUNT
    

서비스 계정을 사용 설정했지만 오류가 지속되면 서비스 계정에 GKE에 필요한 최소 사용 권한을 부여합니다:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:SERVICE_ACCOUNT" \
    --role roles/container.nodeServiceAccount

클러스터에 노드가 0개 있을 때 종료 중 네임스페이스가 종료 중 상태로 멈춤

클러스터가 0개 노드로 축소된 후 클러스터에서 네임스페이스를 삭제하면 다음 문제가 발생합니다. metrics-server 구성요소에 복제본이 없으므로 네임스페이스 삭제 요청을 수락할 수 없습니다.

이 문제를 진단하려면 다음 명령어를 실행하세요.

kubectl describe ns/NAMESPACE_NAME

NAMESPACE_NAME를 네임스페이스 이름으로 바꿉니다.

출력은 다음과 같습니다.

Discovery failed for some groups, 1 failing: unable to retrieve the complete
list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to
handle the request

이 문제를 해결하려면 워크로드를 확장하여 GKE가 새 노드를 만들도록 트리거합니다. 노드가 준비되면 네임스페이스 삭제 요청이 자동으로 완료됩니다. GKE가 네임스페이스를 삭제한 후에는 워크로드를 다시 축소합니다.

확장 문제

노드 확장 실패: 포드가 예약되지 않을 위험이 있습니다.

Google Cloud 프로젝트에서 직렬 포트 로깅이 사용 중지되었으면 다음 문제가 발생합니다. 노드 문제를 효율적으로 디버깅하려면 GKE Autopilot 클러스터에 직렬 포트 로깅이 필요합니다. 직렬 포트 로깅이 사용 중지되었으면 Autopilot가 워크로드를 실행할 노드를 프로비저닝할 수 없습니다.

Kubernetes 이벤트 로그의 오류 메시지는 다음과 비슷합니다.

LAST SEEN   TYPE      REASON          OBJECT                          MESSAGE
12s         Warning   FailedScaleUp   pod/pod-test-5b97f7c978-h9lvl   Node scale up in zones associated with this pod failed: Internal error. Pod is at risk of not being scheduled

compute.disableSerialPortLogging 제약조건을 적용하는 조직 정책을 통해 조직 수준에서 직렬 포트 로깅을 사용 중지할 수 있습니다. 프로젝트 또는 가상 머신(VM) 인스턴스 수준에서 직렬 포트 로깅이 사용 중지될 수도 있습니다.

이 문제를 해결하려면 다음 단계를 따르세요.

  1. Google Cloud 조직 정책 관리자에게 Autopilot 클러스터가 있는 프로젝트에서 compute.disableSerialPortLogging 제약조건을 삭제하도록 요청합니다.
  2. 이 제약조건을 적용하는 조직 정책이 없으면 프로젝트 메타데이터에서 직렬 포트 로깅을 사용 설정해보세요. 이 작업에는 compute.projects.setCommonInstanceMetadata IAM 권한이 필요합니다.

노드 확장 실패: 포드 영역 리소스 초과

새 노드가 리소스 한도를 위반하여 Autopilot이 특정 영역의 포드에 대해 새 노드를 프로비저닝하지 않으면 다음 문제가 발생합니다.

로그의 오류 메시지는 다음과 비슷합니다.

    "napFailureReasons": [
            {
              "messageId": "no.scale.up.nap.pod.zonal.resources.exceeded",
              ...

이 오류는 노드 자동 프로비저닝이 영역 내 포드의 노드 그룹을 프로비저닝하지 않았을 때의 noScaleUp 이벤트를 나타냅니다.

이 오류가 발생하면 다음을 확인하세요.

워크로드 문제

포드가 대기중 상태로 멈춰 있음

포드에 사용할 특정 노드를 선택하면 포드가 Pending 상태로 멈춰 있을 수 있지만 노드에서 실행해야 하는 포드 및 DaemonSets의 리소스 요청 합계가 노드의 최대 할당 가능 용량을 초과합니다. 이로 인해 포드가 Pending 상태가 되고 예약되지 않은 상태로 유지될 수 있습니다.

이 문제를 방지하려면 배포된 워크로드 크기가 Autopilot에 대해 지원되는 최대 리소스 요청 이내인지 확인합니다.

일반 워크로드 포드를 예약하기 전에 DaemonSet를 예약해 볼 수도 있습니다.

특정 노드에서 지속적으로 신뢰할 수 없는 워크로드 성능

GKE 버전 1.24 이상에서 특정 노드의 워크로드에 중단, 비정상 종료 또는 이와 유사한 신뢰할 수 없는 동작이 지속적으로 발생하는 경우 다음 명령어를 사용하여 문제가 있는 노드를 차단하고 이를 GKE에 알릴 수 있습니다.

kubectl drain NODE_NAME --ignore-daemonsets

NODE_NAME을 문제가 있는 노드의 이름으로 바꿉니다. kubectl get nodes를 실행하면 멤버십 이름을 찾을 수 있습니다.

GKE는 다음을 수행합니다.

  • 노드에서 기존 워크로드를 제거하고 해당 노드에서 워크로드 예약을 중지합니다.
  • 배포 또는 StatefulSet와 같은 컨트롤러에서 관리하는 제거된 워크로드를 다른 노드에서 자동으로 다시 만듭니다.
  • 노드에 남아 있는 모든 워크로드를 종료하고 향후 노드를 복구하거나 다시 만듭니다.
  • Autopilot을 사용하면 GKE는 노드를 즉시 종료하고 교체하며 구성된 모든 PodDisruptionBudgets을 무시합니다.