클러스터 자동 확장 처리가 확장되지 않는 문제 해결


이 페이지에서는 Google Kubernetes Engine(GKE) 클러스터에서 클러스터 자동 확장 처리가 노드를 확장하지 않는 문제를 발견하고 해결하는 방법을 설명합니다.

이 페이지는 앱 또는 서비스의 예상치 못한 부정적인 상황을 해결하려는 애플리케이션 개발자와 제품 및 서비스 제공 중단을 방지하려는 플랫폼 관리자 및 운영자를 위해 작성되었습니다.

클러스터 자동 확장 처리가 노드를 확장하는 경우 이해

문제 해결 단계를 진행하기 전에 클러스터 자동 확장 처리가 노드를 확장하려고 시도하는 시점을 이해하는 것이 좋습니다. 클러스터 자동 확장 처리는 기존 리소스가 부족할 때만 노드를 추가합니다.

클러스터 자동 확장 처리는 10초마다 예약할 수 없는 포드가 있는지 확인합니다. Kubernetes 스케줄러가 리소스 부족, 노드 제약 조건 또는 충족되지 않은 포드 요구사항으로 인해 기존 노드에 포드를 배치할 수 없는 경우 포드를 예약할 수 없게 됩니다.

클러스터 자동 확장 처리가 예약할 수 없는 포드를 발견할 경우 노드를 추가해 포드를 예약할 수 있는지 평가합니다. 노드를 추가해 포드를 예약할 수 있으면 클러스터 자동 확장 처리가 관리형 인스턴스 그룹(MIG)에 새 노드를 추가합니다. 그러면 Kubernetes 스케줄러가 새로 프로비저닝된 노드에서 포드를 예약할 수 있습니다.

예약할 수 없는 포드가 있는지 확인

클러스터를 확장해야 하는지 확인하려면 예약되지 않은 포드가 있는지 확인합니다.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. 필터 필드에 unschedulable을 입력하고 Enter 키를 누릅니다.

    포드가 나열되면 예약할 수 없는 포드가 있는 것입니다. 예약할 수 없는 포드 문제를 해결하려면 오류: 포드 예약 불가를 참조하세요. 예약할 수 없는 포드의 근본 원인을 해결하면 클러스터 자동 확장 처리에서 확장할 수 있는 경우가 많습니다. 클러스터 자동 확장 처리와 관련된 오류를 식별하고 해결하려면 다음 섹션을 살펴보세요.

    포드가 나열되지 않으면 클러스터 자동 확장 처리가 확장할 필요가 없으며 예상대로 작동하고 있는 것입니다.

이전에 예약할 수 없는 포드가 있었는지 확인

이전에 클러스터 자동 확장 처리가 실패한 원인을 조사하는 경우 이전에 예약할 수 없었던 포드가 있었는지 확인합니다.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 보려는 로그 항목의 시간 범위를 지정합니다.

  3. 쿼리 창에 다음 쿼리를 입력합니다.

    logName="projects/PROJECT_ID/logs/events"
    jsonPayload.source.component="default-scheduler"
    jsonPayload.reason="FailedScheduling"
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  4. 쿼리 실행을 클릭합니다.

    결과가 표시되면 지정된 기간에 예약할 수 없는 포드가 있었음을 의미합니다.

제한사항으로 인한 문제인지 확인

예약되지 않은 포드가 있는지 확인한 후 클러스터 자동 확장 처리의 문제로 인해 발생한 문제가 클러스터 자동 확장 처리의 제한사항 중 하나가 아닌지 확인합니다.

오류 보기

오류 메시지를 확인하여 확장 문제의 원인을 진단할 수 있는 경우가 많습니다.

알림에서 오류 보기

발견한 문제가 72시간 이내에 발생한 경우 Google Cloud 콘솔에서 오류에 관한 알림을 확인하세요. 이러한 알림은 클러스터 자동 확장 처리가 확장되지 않은 이유에 관한 유용한 정보를 제공하고 오류를 해결하고 추가 조사를 위해 관련 로그를 보는 방법에 관한 조언을 제공합니다.

Google Cloud 콘솔에서 알림을 보려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.

    Kubernetes 클러스터로 이동

  2. 알림 열을 검토합니다. 다음 알림은 확장 문제와 관련이 있습니다.

    • Can't scale up
    • Can't scale up pods
    • Can't scale up a node pool
  3. 관련 알림을 클릭하면 문제의 원인과 문제 해결을 위한 권장 조치에 관한 세부정보가 포함된 창이 표시됩니다.

  4. 선택사항: 이 이벤트의 로그를 보려면 로그를 클릭합니다. 이 작업을 수행하면 확장 이벤트를 추가로 조사하는 데 도움이 되는 미리 채워진 쿼리가 포함된 로그 탐색기로 이동합니다. 확장 이벤트의 작동 방식에 대한 자세한 내용은 클러스터 자동 확장 처리 이벤트 보기를 참조하세요.

알림의 안내를 검토한 후에도 문제가 계속되면 오류 메시지 표에서 추가 도움말을 확인하세요.

이벤트에서 오류 보기

관찰된 문제가 72시간 이상 전에 발생한 경우 Cloud Logging에서 이벤트를 확인하세요. 오류가 발생하면 이벤트에 기록되는 경우가 많습니다.

Google Cloud 콘솔에서 클러스터 자동 확장 처리 로그를 보려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.

    Kubernetes 클러스터로 이동

  2. 조사하려는 클러스터의 이름을 선택하여 클러스터 세부정보 페이지를 엽니다.

  3. 클러스터 세부정보 페이지에서 로그 탭을 클릭합니다.

  4. 로그 탭에서 자동 확장 처리 로그 탭을 클릭하여 로그를 봅니다.

  5. 선택사항: 고급 필터를 적용하여 결과의 범위를 좁히려면 페이지 오른쪽의 화살표가 있는 버튼을 클릭하여 로그 탐색기에서 로그를 봅니다.

확장 이벤트의 작동 방식에 대한 자세한 내용은 클러스터 자동 확장 처리 이벤트 보기를 참조하세요. Cloud Logging을 사용하는 방법의 예시는 다음 문제 해결 예시를 참조하세요.

예: 72시간이 지난 문제 해결

다음 예시는 클러스터가 확장되지 않는 문제를 조사하고 해결하는 방법을 보여줍니다.

시나리오: 지난 1시간 동안 포드가 예약 불가능으로 표시되었습니다. 클러스터 자동 확장 처리가 포드를 예약하기 위해 새 노드를 프로비저닝하지 않았습니다.

해결책:

  1. 문제가 발생한 지 72시간이 지났으므로 알림 메시지를 확인하는 대신 Cloud Logging을 사용하여 문제를 조사합니다.
  2. Cloud Logging에서 이벤트에서 오류 보기에 설명된 대로 클러스터 자동 확장 처리 이벤트의 로깅 세부정보를 찾습니다.
  3. triggeringPods 필드에서 조사 중인 포드가 포함된 scaleUp 이벤트를 검색합니다. 특정 JSON 필드 값으로 필터링을 비롯한 로그 항목 필터링이 가능합니다. 고급 로그 쿼리에서 자세히 알아보세요.

  4. 확장 이벤트가 없습니다. 하지만 scaleUp 이벤트와 동일한 eventId가 포함된 EventResult를 찾을 수 있습니다. 그런 다음 errorMsg 필드를 보고 가능한 scaleUp 오류 메시지 목록을 참조할 수 있습니다.

  5. scaleUp 이벤트를 찾지 못했으므로 noScaleUp 이벤트를 계속 검색하고 다음 필드를 검토합니다.

    • unhandledPodGroups: 포드(또는 포드의 컨트롤러)에 대한 정보를 포함합니다.
    • reason: 확장이 차단될 수 있음을 나타내는 전역 이유를 제공합니다.
    • skippedMigs: 일부 MIG를 건너뛸 수 있는 이유를 제공합니다.
  6. 포드의 noScaleUp 이벤트를 발견했고, rejectedMigs 필드의 모든 MIG에 두 파라미터 "NodeAffinity""node(s) did not match node selector"가 포함된 동일한 이유 메시지 ID "no.scale.up.mig.failing.predicate"가 있습니다.

해결 방법:

오류 메시지 목록을 참조한 후 대기 중인 포드의 예약 조건자가 실패하여 클러스터 자동 확장 처리가 노드 풀을 확장할 수 없다는 것을 알게 됩니다. 파라미터는 실패한 조건자의 이름과 실패한 이유입니다.

이 문제를 해결하려면 포드의 매니페스트를 검토하고 클러스터의 MIG와 일치하지 않는 노드 선택기가 있음을 확인합니다. 포드의 매니페스트에서 선택기를 삭제하고 포드를 다시 만듭니다. 클러스터 자동 확장 처리가 새 노드를 추가하고 포드가 예약됩니다.

확장 오류 해결

오류를 파악했으면 다음 표를 사용하여 오류의 원인과 해결 방법을 알아보세요.

scaleUp 오류

scaleUp 이벤트의 이벤트 오류 메시지는 해당 eventResult 이벤트의 resultInfo.results[].errorMsg 필드에 있습니다.

메시지 세부정보 매개변수 위험 완화
"scale.up.error.out.of.resources" GPU 또는 CPU와 같은 Compute Engine 리소스를 현재 사용할 수 없어서 요청을 처리할 수 없는 영역에서 새 리소스를 요청하려고 하면 오류가 발생합니다. 실패 MIG ID Compute Engine 문서의 리소스 가용성 문제 해결 단계를 따릅니다.
"scale.up.error.quota.exceeded" Compute Engine 할당량 초과로 인해 일부 MIG를 늘릴 수 없어 scaleUp 이벤트가 실패했습니다. 실패 MIG ID Google Cloud 콘솔의 MIG에 있는 오류 탭에서 초과되는 할당량을 확인합니다. 초과된 할당량을 확인한 후 안내에 따라 할당량 증가를 요청합니다.
"scale.up.error.waiting.for.instances.timeout" 시간 초과로 인해 관리형 인스턴스 그룹을 수직 확장할 수 없습니다. 실패 MIG ID 이 메시지는 일시적입니다. 문제가 계속되면 추가 조사를 위해 Cloud Customer Care에 문의하세요.
"scale.up.error.ip.space.exhausted" 일부 관리형 인스턴스 그룹의 인스턴스에서 IP가 소진되었기 때문에 수직 확장할 수 없습니다. 즉, 클러스터에 새 노드 또는 포드를 추가하는 데 사용할 할당되지 않은 IP 주소 공간이 충분하지 않습니다. 실패 MIG ID 포드의 IP 주소 공간 부족의 문제 해결 단계를 따르세요.
"scale.up.error.service.account.deleted" 서비스 계정이 삭제되었기 때문에 수직 확장할 수 없습니다. 실패 MIG ID 서비스 계정 삭제 취소를 시도합니다. 이 절차가 실패하면 추가 조사를 위해 Cloud Customer Care에 문의하세요.

noScaleUp 이벤트의 이유

noScaleUp 이벤트는 클러스터에 예약할 수 없는 포드가 있고 클러스터 자동 확장 처리가 포드를 예약하도록 클러스터를 확장할 수 없을 때 주기적으로 발생합니다. noScaleUp 이벤트는 최선의 방법이며 가능한 모든 사례를 포괄하지는 않습니다.

NoScaleUp 최상위 수준 이유

noScaleUp 이벤트의 최상위 수준 이유 메시지는 noDecisionStatus.noScaleUp.reason 필드에 표시됩니다. 메시지에는 클러스터 자동 확장 처리가 클러스터를 확장할 수 없는 최상위 수준 이유가 포함되어 있습니다.

메시지 세부정보 위험 완화
"no.scale.up.in.backoff" 수직 확장이 백오프 기간(일시적으로 차단됨)이기 때문에 수직 확장되지 않았습니다. 이 메시지는 포드 수가 많은 확장 이벤트 중에 발생할 수 있습니다. 이 메시지는 일시적입니다. 몇 분 후에 이 오류를 확인하세요. 이 메시지가 지속되면 추가 조사를 위해 Cloud Customer Care에 문의하세요.

noScaleUp 최상위 수준 노드 자동 프로비저닝 이유

noScaleUp 이벤트의 최상위 수준 노드 자동 프로비저닝 이유 메시지는 noDecisionStatus.noScaleUp.napFailureReason 필드에 표시됩니다. 메시지에는 클러스터 자동 확장 처리가 새 노드 풀을 프로비저닝할 수 없는 최상위 수준 이유가 포함되어 있습니다.

메시지 세부정보 위험 완화
"no.scale.up.nap.disabled"

클러스터 수준에서 노드 자동 프로비저닝이 사용 설정되지 않아 노드 자동 프로비저닝을 확장할 수 없습니다.

노드 자동 프로비저닝을 사용 중지한 경우 대기 중인 포드에 기존 노드 풀로 충족할 수 없는 요구사항이 있으면 새 노드가 자동으로 프로비저닝되지 않습니다.

클러스터 구성을 검토하고 노드 자동 프로비저닝 사용 설정을 고려하세요.

noScaleUp MIG 수준 이유

noScaleUp 이벤트의 MIG 수준 이유 메시지는 noDecisionStatus.noScaleUp.skippedMigs[].reasonnoDecisionStatus.noScaleUp.unhandledPodGroups[].rejectedMigs[].reason 필드에 표시됩니다. 메시지에는 클러스터 자동 확장 처리가 특정 MIG의 크기를 늘릴 수 없는 이유가 포함되어 있습니다.

메시지 세부정보 매개변수 위험 완화
"no.scale.up.mig.skipped" 시뮬레이션 중에 MIG를 건너뛰었기 때문에 MIG를 확장할 수 없습니다. MIG를 건너뛴 이유(예: 포드 요구사항 누락) 오류 메시지에 포함된 파라미터를 검토하고 MIG를 건너뛴 이유를 확인합니다.
"no.scale.up.mig.failing.predicate" 대기 중인 피드에 대한 실패한 예약 조건자로 인해 노드 풀을 수직 확장할 수 없습니다. 실패 조건자의 이름 및 실패 이유 어피니티 규칙, taint 또는 톨러레이션(toleration)과 같은 포드 요구사항과 리소스 요구사항을 검토합니다.

noScaleUp Pod 그룹 수준 노드 자동 프로비저닝 이유

noScaleUp 이벤트의 포드 그룹 수준 노드 자동 프로비저닝 이유 메시지는 noDecisionStatus.noScaleUp.unhandledPodGroups[].napFailureReasons[] 필드에 표시됩니다. 메시지에는 클러스터 자동 확장 처리가 특정 포드 그룹을 예약하기 위해 새 노드 풀을 프로비저닝할 수 없는 이유가 포함되어 있습니다.

메시지 세부정보 매개변수 위험 완화
"no.scale.up.nap.pod.gpu.no.limit.defined" 대기 중인 포드에 GPU 요청이 있으므로 노드 자동 프로비저닝이 노드 그룹을 프로비저닝할 수 없지만 GPU 리소스 제한은 클러스터 수준에서 정의되지 않습니다. 요청된 GPU 유형 대기 중인 포드의 GPU 요청을 검토하고 클러스터 수준 노드 자동 프로비저닝 GPU 한도 구성을 업데이트합니다.
"no.scale.up.nap.pod.gpu.type.not.supported" 알 수 없는 GPU 유형에 대한 요청이 있으므로 노드 자동 프로비저닝이 포드의 노드 그룹을 프로비저닝하지 않았습니다. 요청된 GPU 유형 GPU 유형의 대기 중인 포드 구성을 확인하여 지원되는 GPU 유형과 일치하는지 확인합니다.
"no.scale.up.nap.pod.zonal.resources.exceeded" 클러스터 전체 최대 리소스 한도를 위반하거나, 영역의 사용 가능한 리소스를 초과하거나, 요청에 맞는 머신 유형이 없으므로 노드 자동 프로비저닝이 이 영역에 있는 포드의 노드 그룹을 프로비저닝하지 않았습니다. 고려된 영역의 이름 클러스터 전체 최대 리소스 한도, 포드 리소스 요청 또는 노드 자동 프로비저닝에 사용할 수 있는 영역을 검토하고 업데이트합니다.
"no.scale.up.nap.pod.zonal.failing.predicates" 실패한 조건자 때문에 노드 자동 프로비저닝이 이 영역에 있는 포드의 노드 그룹을 프로비저닝하지 않았습니다. 고려된 영역의 이름 및 조건자 실패 이유 어피니티 규칙, taint, 톨러레이션(toleration)과 같은 대기 중인 포드 요구사항과 리소스 요구사항을 검토합니다.

추가 조사 실시

다음 섹션에서는 로그 탐색기와 gcpdiag를 사용하여 오류에 대한 추가 정보를 얻는 방법을 안내합니다.

로그 탐색기에서 오류 조사

오류 메시지를 자세히 조사하려면 오류와 관련된 로그를 확인하세요.

  1. Google Cloud 콘솔에서 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 쿼리 창에 다음 쿼리를 입력합니다.

    resource.type="k8s_cluster"
    log_id("container.googleapis.com/cluster-autoscaler-visibility")
    jsonPayload.resultInfo.results.errorMsg.messageId="ERROR_MESSAGE"
    

    ERROR_MESSAGE를 조사하려는 메시지로 바꿉니다. 예를 들면 scale.up.error.out.of.resources입니다.

  3. 쿼리 실행을 클릭합니다.

gcpdiag로 일부 오류 디버그

gcpdiag는 Google Cloud 기술 엔지니어의 지원을 받아 개발한 오픈소스 도구입니다. 공식적으로 지원되는 Google Cloud 제품이 아닙니다.

다음 오류 메시지 중 하나가 표시되면 gcpdiag를 사용하여 문제를 해결할 수 있습니다.

  • scale.up.error.out.of.resources
  • scale.up.error.quota.exceeded
  • scale.up.error.waiting.for.instances.timeout
  • scale.up.error.ip.space.exhausted
  • scale.up.error.service.account.deleted

모든 gcpdiag 도구 플래그의 목록과 설명은 gcpdiag 사용 안내를 참조하세요.

복잡한 확장 오류 해결

다음 섹션에서는 완화에 여러 단계가 포함된 오류와 클러스터 자동 확장 처리 이벤트 메시지가 연결되지 않은 오류를 해결하는 방법을 안내합니다.

문제: 포드가 노드에 맞지 않음

클러스터 자동 확장 처리는 포드의 요구사항을 충족하기에 충분한 리소스(예: GPU, 메모리, 스토리지)가 있는 노드가 있는 경우에만 노드에 포드를 예약합니다. 이로 인해 클러스터 자동 확장 처리가 확장되지 않았는지 확인하려면 리소스 요청을 제공된 리소스와 비교합니다.

다음 예시는 CPU 리소스를 확인하는 방법을 보여줍니다. 하지만 동일한 단계가 GPU, 메모리, 스토리지 리소스에도 적용됩니다. CPU 요청을 프로비저닝된 CPU와 비교하려면 다음 단계를 완료하세요.

  1. Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.

    워크로드로 이동

  2. PodUnschedulable 오류 메시지를 클릭합니다.

  3. 세부정보 창에서 포드 이름을 클릭합니다. 포드가 여러 개인 경우 첫 번째 포드부터 시작하여 각 포드에 대해 다음 프로세스를 반복합니다.

  4. 포드 세부정보 페이지에서 이벤트 탭으로 이동합니다.

  5. 이벤트 탭에서 YAML 탭으로 이동합니다.

  6. 포드에 각 컨테이너의 리소스 요청을 기록하여 총 리소스 요청을 확인합니다. 예를 들어 다음 포드 구성에서는 포드에 vCPU 2개가 필요합니다.

    resources:
      limits:
        cpu: "3"
     requests:
        cpu: "2"
    
  7. 예약되지 않은 포드가 있는 클러스터의 노드 풀 세부정보를 확인합니다.

    1. Google Cloud 콘솔에서 Kubernetes 클러스터 페이지로 이동합니다.

      Kubernetes 클러스터로 이동

    2. Pods unschedulable 오류 메시지가 있는 클러스터의 이름을 클릭합니다.

    3. 클러스터 세부정보 페이지에서 노드 탭으로 이동합니다.

  8. 노드 풀 섹션에서 머신 유형 열의 값을 확인합니다. 예를 들면 n1-standard-1입니다.

  9. 리소스 요청을 머신 유형에서 제공하는 vCPU와 비교합니다. 예를 들어 포드가 vCPU 2개를 요청했지만 사용 가능한 노드에 n1-standard-1 머신 유형이 있는 경우 노드에는 vCPU가 1개만 있습니다. 이와 같은 구성에서는 새 노드를 추가하더라도 이 포드가 노드에 맞지 않으므로 클러스터 자동 확장 처리가 확장을 트리거하지 않습니다. 사용 가능한 머신 유형에 대해 자세히 알아보려면 Compute Engine 문서의 머신 계열 리소스 및 비교 가이드를 참조하세요.

또한 노드의 할당 가능한 리소스는 총 리소스보다 적은데, 일부 리소스는 시스템 구성요소를 실행하는 데 사용되기 때문입니다. 계산 방법에 관한 자세한 내용은 할당 가능한 노드 리소스를 참조하세요.

이 문제를 해결하려면 워크로드에 정의된 리소스 요청이 요구사항에 적합한지 결정합니다. 머신 유형을 변경하면 안 되는 경우 포드에서 오는 요청을 지원할 수 있는 머신 유형으로 노드 풀을 만듭니다. 포드 리소스 요청이 정확하지 않으면 포드가 노드에 맞도록 포드 정의가 업데이트됩니다.

문제: 비정상 클러스터로 인해 확장이 방해됨

클러스터 자동 확장 처리가 클러스터를 비정상으로 간주하면 확장이 실행되지 않을 수 있습니다. 클러스터 비정상 상태는 컨트롤 플레인의 상태가 아니라 정상 상태 노드와 준비 상태 노드의 비율에 따라 결정됩니다. 클러스터의 노드 중 45% 가 비정상 상태이거나 준비 상태가 아니면 클러스터 자동 확장 처리가 모든 작업을 중지합니다.

이로 인해 클러스터 자동 확장 처리가 확장하지 않으면 클러스터 자동 확장 처리 ConfigMap에 Warning 유형의 이벤트가 있다는 것이고 그 이유로 ClusterUnhealthy가 표시됩니다.

ConfigMap을 보려면 다음 명령어를 실행합니다.

kubectl describe configmap cluster-autoscaler-status -n kube-system

이 문제를 해결하려면 비정상 노드 수를 줄이세요.

클러스터 자동 확장 처리에서 준비 상태로 간주하지 않더라도 일부 노드는 준비 상태일 수 있습니다. 이 문제는 노드에 ignore-taint.cluster-autoscaler.kubernetes.io/ 프리픽스가 있는 taint가 있는 경우에 발생합니다. 클러스터 자동 확장 처리는 이러한 taint가 있는 노드를 NotReady로 간주합니다.

이 동작의 원인이 ignore-taint.cluster-autoscaler.kubernetes.io/.* taint인 경우 이를 삭제합니다.

다음 단계