학습 및 추론 워크로드를 실행하는 노드의 호스트 유지보수 실행

이 문서에서는 Google Kubernetes Engine (GKE) 클러스터의 노드에 대한 기본 Compute Engine 인스턴스의 호스트 유지보수를 수행하는 방법을 설명합니다. GPU 및 TPU가 있는 인스턴스를 비롯하여 라이브 마이그레이션되지 않는 특정 유형의 Compute Engine 인스턴스에 대해서만 이 유지보수를 적극적으로 관리하면 됩니다. 이 문서에 설명된 전략은 학습 및 추론 워크로드에 적합합니다. 개별 노드에 대해서만 호스트 유지보수 를 수동으로 수행해야 하거나 워크로드가 자동 호스트 유지보수를 허용할 수 있는 경우 GKE에서 호스트 유지보수를 수행하는 방법 이해를 참조하세요.

이러한 전략은 노드 그룹에 대한 호스트 유지보수를 수행하고 선택적으로 GKE 클러스터 업그레이드를 시작합니다.

학습 워크로드의 노드와 같이 단일 기간의 다운타임이 허용되는 워크로드의 노드에는 병렬 전략을 사용합니다. 추론 워크로드의 노드와 같이 대부분의 리소스 가용성을 유지하면서 다운타임 배치를 허용할 수 있는 워크로드의 노드에는 순차적 전략을 사용합니다.

병렬 전략을 사용하여 학습 워크로드의 노드 업데이트

이 전략은 가속기를 사용하는 노드 그룹에 대해 동시에 변경사항을 수행합니다. 이 전략은 학습 워크로드에 사용할 수 있습니다. 또는 그룹의 모든 노드와 해당 노드에서 실행되는 워크로드에 대해 완전한 다운타임의 단일 기간을 갖는 것이 변경사항을 수행하는 가장 중단을 최소화하는 방법인 다른 유형의 워크로드에 사용할 수 있습니다.

이 전략은 다음과 같은 주요 단계를 따릅니다.

  1. 워크로드 중지: 노드 풀을 선택하고 노드 풀에서 실행 중인 워크로드를 중지하거나 워크로드를 계속 사용 가능한 다른 노드로 이동합니다.
  2. 호스트 유지보수 트리거: 선택한 모든 노드에 동시에 유지보수 라벨을 적용하고 모든 노드에서 프로세스가 완료될 때까지 기다립니다.
  3. GKE 버전 업그레이드: 노드의 GKE 버전을 변경합니다.
  4. 워크로드 다시 시작: 모든 호스트 유지보수 및 업그레이드가 완료된 후 워크로드를 다시 시작합니다.

제공된 안내는 단일 노드 풀에 대한 변경사항을 수행합니다. 하지만 단계를 조정하여 여러 노드 풀에 대해 동시에 변경사항을 수행할 수 있습니다. 이러한 단계를 시작하기 전에 이 워크로드가 이러한 노드에서 실행될 필요가 없는 시간이 최소 몇 시간 있는지 확인합니다.

기본 Compute Engine 인스턴스와 GKE 노드 모두에 대한 중요한 변경사항을 수신하는 동안 중단을 최소화하려면 이 다운타임 기간을 사용하여 호스트 유지보수와 GKE 버전 업그레이드를 모두 수행합니다. 하지만 GKE 노드의 버전을 업그레이드하지 않으려면 호스트 유지보수만 수행할 수 있습니다.

시작하기 전에 고려해야 할 사항

시작하기 전에 다음 고려사항을 검토하세요.

  • 워크로드 재배포 방지: PodDisruptionBudgets으로 인한 불필요한 지연을 방지하려면 모든 단계를 완료할 때까지 워크로드를 재배포하지 마세요.
  • 중단 계획: 워크로드가 일정 기간 동안 중단될 수 있는지 확인합니다. 이러한 단계는 주로 호스트 유지보수에 필요한 시간으로 인해 완료하는 데 몇 시간이 걸립니다.

모든 노드에 대해 동시에 업데이트 수행

호스트 유지보수 및 선택적으로 GKE 버전 업그레이드를 수행하려면 다음 단계를 완료하세요.

  1. 워크로드 준비: 워크로드를 중지하거나 최근 스냅샷 또는 체크포인트를 생성했는지 확인합니다.
  2. 호스트 유지보수 시작: 선택한 노드 풀의 모든 노드에 유지보수 라벨을 적용합니다.

    kubectl label nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME cloud.google.com/perform-maintenance=true --overwrite
    

    Compute Engine은 기본 인스턴스를 동시에 드레이닝하고 업데이트하기 시작합니다. 이 프로세스는 몇 시간이 걸릴 수 있습니다. 자세한 내용은 정상 종료 프로세스를 참조하세요.

  3. 호스트 유지보수 상태 모니터링: GKE는 유지보수가 완료되면 유지보수 라벨을 삭제합니다. 유지보수가 완료되면 Cloud Logging에서 다음 메시지가 포함된 로그를 찾을 수 있습니다.

    Maintenance window has completed for this instance. All maintenance
    notifications on the instance have been removed.
    
  4. 선택사항: GKE 노드 버전 업그레이드: 안내에 따라 노드의 GKE 버전을 업그레이드합니다.

순차적 전략을 사용하여 추론 워크로드의 노드 업데이트

이 전략은 추론 워크로드를 실행하는 GKE 노드에서 유지보수를 수행하는 수동 접근 방식을 설명합니다. 서비스 가용성을 유지하기 위해 노드를 일괄적으로 업데이트하는 작업이 포함됩니다. 이 방법은 일정 비율의 복제본이 일시적으로 오프라인 상태가 되는 것을 허용할 수 있는 워크로드에 가장 적합합니다.

이 전략은 다음과 같은 주요 단계를 따릅니다.

  1. 노드 식별 및 일괄 처리: 업데이트할 노드 풀을 선택합니다. 워크로드의 장애 허용 오차에 따라 노드를 일괄 처리합니다.
  2. 일괄 처리 반복: 각 일괄 처리의 경우 유지보수 라벨을 적용하고 라벨이 삭제될 때까지 노드 일괄 처리를 모니터링합니다.
  3. GKE 버전 업그레이드: 모든 일괄 처리가 호스트 유지보수를 완료한 후 GKE 노드의 버전을 변경합니다.

시작하기 전에 고려해야 할 사항

시작하기 전에 다음 고려사항을 검토하세요.

  • 배포 이해: 성공하려면 워크로드 배포, 복제본 배치, 장애 도메인에 대한 자세한 지식이 필요합니다. 프로세스 전반에 걸쳐 충분한 제공 용량을 유지해야 합니다.
  • 일괄 처리 크기 계획: 노드를 일괄 처리로 업데이트합니다. 각 일괄 처리의 크기는 워크로드의 장애 허용 오차에 따라 결정됩니다. 고려해야 할 요소는 다음과 같습니다.
    • 제공 모델당 복제본 수입니다.
    • 노드 및 장애 도메인 전반의 복제본 배포입니다.
    • PodDisruptionBudgets 은 동시에 다운되는 최대 포드 수를 적용하는 데 도움이 될 수 있습니다.
    • 권장사항: 관리를 간소화하려면 서로 다른 복제본 집합에 서로 다른 노드 풀을 할당하는 것이 좋습니다. 이렇게 하면 노드 풀 수준에서 장애 도메인을 격리할 수 있습니다.
  • 시간 제약조건 계산: 다음 타이밍 요소를 고려하세요.
    • 각 일괄 처리는 호스트 유지보수 단계를 완료하는 데 몇 시간이 걸릴 수 있습니다.
    • 모든 유지보수가 필요한 기한 내에 완료되도록 최소 배치 크기를 계산합니다.
      1. MAINTENANCE_BLOCKS = floor(HOURS_TO_MAINTENANCE / 4) (HOURS_TO_MAINTENANCE는 사용 가능한 총 시간임)
      2. MIN_PER_BATCH = TOTAL_NODE_COUNT / MAINTENANCE_BLOCKS
    • 선택한 배치 크기는 MIN_PER_BATCH 이상이어야 합니다.
  • 특정 워크로드 유형 검토: 각 구성 유형에 대해 다음을 고려하세요.
    • 전문가 혼합 (MOE): 일괄 처리 전략이 각 모델에 필요한 최소 복제본 수를 유지하는지 확인합니다.
    • 분리된 제공: 일괄 처리를 계획할 때 분리된 설정과 관련된 모든 복제본을 추적해야 합니다.
    • 멀티 호스트 노드 풀 (TPU, MNNVL): 이러한 구성의 경우 한 번에 전체 노드 풀을 다운할 수 있습니다. 여러 노드 풀에서 장애 도메인을 계획합니다.

일괄 처리로 순차적 업데이트 수행

순차적 업데이트를 수행하려면 다음 단계를 완료하세요.

  1. 유지보수할 노드 식별: 유지보수를 수행할 모든 노드를 식별하고 이 목록을 저장합니다. 노드를 식별하려면 다음 방법 중 하나를 사용하거나 수동으로 선택합니다.

    • 가속기 (TPU 또는 GPU)를 사용하는 클러스터의 모든 노드를 가져옵니다.

      kubectl get nodes -o json | jq -r '.items[] | select(.spec.taints[]? | select(.key=="nvidia.com/gpu" or .key=="google.com/tpu")) | .metadata.name'
      
    • 특정 노드 풀의 모든 노드를 가져옵니다.

      kubectl get nodes -l cloud.google.com/gke-nodepool=NODE_POOL_NAME --no-headers -o custom-columns=":metadata.name"
      

      NODE_POOL_NAME을 노드 풀의 이름으로 바꿉니다.

    • 특정 라벨이 있는 모든 노드를 가져옵니다.

      kubectl get nodes -l LABEL -o jsonpath='{.items[*].metadata.name}'
      

      LABEL을 노드 라벨로 바꿉니다.

  2. 노드를 일괄 처리로 나누기: 식별된 노드를 동일한 일괄 처리로 나눕니다. 이전 시작하기 전에 고려해야 할 사항 섹션의 시간 제약조건 계산 목록 항목에 설명된 수식을 사용하여 배치 크기를 결정합니다.

  3. 호스트 유지보수 수행: 각 일괄 처리의 경우 다음 단계를 완료합니다.

    1. 노드 일괄 처리를 선택하고 유지보수 라벨을 적용합니다.

      kubectl label nodes LIST_OF_NODES_IN_BATCH cloud.google.com/perform-maintenance=true --overwrite
      

      LIST_OF_NODES_IN_BATCH를 일괄 처리의 공백으로 구분된 노드 목록으로 바꿉니다. 예를 들어 node-1 node-2 node-3입니다.

    2. 호스트 유지보수 상태를 모니터링합니다. GKE는 유지보수가 완료되면 유지보수 라벨을 삭제합니다. 유지보수가 완료되면 Logging에서 다음 메시지가 포함된 로그를 찾을 수 있습니다.

      Maintenance window has completed for this instance. All maintenance
      notifications on the instance have been removed.
      
    3. 모든 일괄 처리의 호스트 유지보수가 완료될 때까지 각 나머지 일괄 처리에 대해 이전 두 단계를 반복합니다.

  4. 선택사항: GKE 노드 버전 업그레이드: 유지보수가 아직 완료되지 않은 호스트에 GKE 노드가 배포되는 시나리오를 방지하려면 모든 노드에 대해 호스트 유지보수가 완료된 후에만 이 단계를 수행합니다. 다음 섹션의 안내를 참조하세요.

노드의 GKE 버전 업그레이드

동시에 업그레이드할 노드 수를 고려하세요. 병렬 전략을 사용하면 전체 노드 풀 또는 여러 노드 풀에 대해 동시에 호스트 유지보수를 수행했습니다. 순차적 전략을 사용하면 일괄 처리로 호스트 유지보수를 수행했습니다. 노드 그룹의 크기에 따라 사용할 업그레이드 방법을 결정합니다.

  • 병렬 전략: 노드 풀에 영역당 노드가 20개 이하인 경우 일시 급증 업그레이드를 사용합니다. 노드 풀에 영역당 노드가 20개를 초과하는 경우 노드 풀을 삭제하고 다시 만듭니다.
  • 순차적 전략: 일괄 처리에 영역당, 노드당 노드가 20개 이하인 경우 일시 급증 업그레이드를 사용합니다. 일괄 처리에 영역당, 노드 풀당 노드가 20개를 초과하는 경우 노드를 삭제하고 다시 만듭니다.

일시 급증 업그레이드 사용

  1. 일시 급증 업그레이드를, 구성합니다. maxUnavailable 설정을 사용하여 노드 풀에서 영역당 동시에 사용할 수 없는 노드 수를 결정합니다. 예를 들어 노드 풀의 한 영역에 노드가 18개 있는 경우 maxUnavailable 필드의 값을 18로 설정합니다.

    이 설정은 여유 용량이 없는 예약의 용량을 사용할 때 가장 적합합니다. 이 설정을 사용하는 이유에 대한 자세한 내용은 리소스가 제한된 환경에서 업그레이드를 참조하세요.

  2. 다음 명령어를 실행하여 노드 풀을 업그레이드합니다. 여러 노드 풀을 업그레이드하려면 각 노드 풀에 대해 이 명령어를 실행합니다.

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool NODE_POOL_NAME \
        --cluster-version VERSION \
        --location CONTROL_PLANE_LOCATION \
        --quiet
    

    다음을 바꿉니다.

노드 삭제 및 다시 만들기

노드 풀을 삭제하고 최신 버전을 사용하여 다시 만듭니다.

  1. 노드 풀을 삭제합니다.

    gcloud container node-pools delete NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION
    
  2. --cluster-version 플래그를 사용하여 새 버전을 전달하여 노드 풀을 다시 만듭니다. 노드 풀의 권장 자동 업그레이드 대상을 전달합니다. 자세한 내용은 Standard 클러스터 노드 풀의 업그레이드 정보 가져오기를 참조하세요. 클러스터에 권장 자동 업그레이드 대상이 없는 경우 GKE 출시 노트에서 최신 버전 업데이트 항목을 확인하세요.