GKE 관리 DRANET을 사용하여 네트워크 리소스 할당

Google Kubernetes Engine (GKE) DRANET은 네트워킹 리소스용 Kubernetes DRA API를 구현하는 오픈소스 DRANET 프로젝트를 기반으로 하는 관리형 GKE 기능입니다. DRANET을 사용하면 원격 직접 메모리 액세스 (RDMA)를 지원하는 네트워크 인터페이스를 비롯한 포드의 고성능 네트워킹 리소스를 요청하고 할당할 수 있습니다. 이 접근 방식은 네트워크 리소스 관리를 위한 휴대 가능하고 업스트림에 정렬된 API를 제공합니다.

이 문서에서는 GKE DRANET의 개념적 개요를 제공하고 GKE 클러스터의 워크로드에 네트워크 리소스를 할당하는 방법을 보여줍니다.

이 문서는 조직의 네트워크를 설계하는 클라우드 설계자 및 네트워킹 전문가를 대상으로 합니다. 모든 GKE 문서의 개요는 GKE 문서 살펴보기를 참고하세요. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 태스크에 대해 알아보려면 일반 GKE 사용자 역할 및 태스크를 참고하세요.

이 문서를 읽으려면 먼저 다음 항목에 익숙해야 합니다.

GKE 관리형 DRANET 작동 방식

GKE 관리 DRANET은 networking-dra-driver DaemonSet을 통해 구현됩니다. 이 DaemonSet은 GKE DRANET이 사용 설정된 GPU 또는 TPU가 있는 노드에서 실행됩니다.

Kubernetes 동적 리소스 할당 (DRA) API를 통해 네트워크 인터페이스를 포드에서 검색하고 할당할 수 있도록 노드 수준 에이전트 역할을 합니다.

GKE 버전 1.34.1-gke.1829001 이상에서 GKE는 네트워킹을 위한 DeviceClass 리소스를 자동으로 설치합니다. 이러한 클래스는 요청할 수 있는 네트워크 기기 유형을 정의합니다. 예를 들어 GKE는 RDMA 지원 기기용 mrdma.google.com 클래스와 기타 네트워크 기기용 netdev.google.com 클래스를 만듭니다.

GKE DRANET을 사용하려면 먼저 GPU 또는 TPU가 있는 노드 풀에서 GKE DRANET 드라이버를 사용 설정합니다.

워크로드에 네트워크 기기를 요청하려면 ResourceClaimTemplate를 정의합니다. 이 템플릿은 노드에서 사용 가능한 모든 기기를 요청하는 등 DeviceClass 및 할당 모드를 지정합니다. 포드 사양의 resourceClaims 필드에서 이 템플릿을 참조하여 노드에서 요청된 네트워크 인터페이스에 대한 액세스 권한을 포드에 부여합니다.

GKE 관리형 DRANET을 사용해야 하는 경우

GKE DRANET은 토폴로지와 종속 항목을 인식하는 네트워크 리소스를 관리하는 표준화된 방법을 제공합니다. 이러한 표준화로 인해 고성능 네트워킹이 필요한 AI 및 ML 워크로드에 적합한 솔루션이 됩니다.

Pod의 네트워크 인터페이스 요청의 일반적인 사용 사례는 다음과 같습니다.

  • 사용 가능한 모든 RDMA 지원 인터페이스를 요청합니다.
  • 특정 수의 RDMA 지원 인터페이스를 요청합니다.
  • 사용 가능한 모든 비RDMA 인터페이스를 요청합니다.
  • 특정 수의 비RDMA 인터페이스를 요청합니다.

네트워킹을 위해 GKE 관리 DRANET 사용 시 주요 고려사항

네트워킹에 GKE DRANET을 사용하는 경우 다음 사항을 고려하세요.

  • 전용 네트워크 인터페이스

    GKE DRANET을 사용하여 포드의 네트워크 인터페이스를 요청하면 해당 인터페이스가 해당 포드 전용이 됩니다. 동일한 노드의 다른 포드는 이를 공유할 수 없습니다. 이 접근 방식을 사용하면 포드가 해당 인터페이스의 전체 대역폭과 리소스에 단독으로 액세스할 수 있습니다. 이는 성능에 민감한 워크로드에 중요한 이점입니다.

  • GKE 관리 DRANET 드라이버를 독립적으로 사용

    다른 GKE DRANET 드라이버를 사용 설정하지 않고도 GKE DRA 드라이버를 사용 설정하여 네트워크 리소스를 관리할 수 있습니다. 이렇게 하려면 GPU 및 TPU가 있는 노드 풀에 cloud.google.com/gke-networking-dra-driver=true 라벨을 추가합니다.

  • 다른 GKE DRA 드라이버 사용

    까다로운 AI/ML 워크로드에서 더 높은 처리량을 달성하려면 가속기 (예: GPU 및 TPU)용 DRA API를 GKE DRANET 관리 네트워킹과 결합하세요. 이 결합된 접근 방식을 통해 리소스 정렬 및 토폴로지 인식이 개선됩니다. 다른 리소스에 DRA를 사용하는 방법을 자세히 알아보려면 DRA 워크로드용 GKE 인프라 준비를 참고하세요.

  • 충돌하는 구성 방지

    GKE DRANET 드라이버는 보조 IP 주소 범위가 구성되지 않은 RDMA 인터페이스와 gVNIC를 관리합니다. 동일한 클러스터에서 Device 유형의 네트워크 리소스와 함께 GKE DRANET 드라이버와 GKE 멀티 네트워크 API를 모두 사용하지 마세요. 드라이버와 API를 함께 사용하면 두 API가 동일한 NIC 집합을 관리하려고 시도하므로 올바르지 않은 설정과 예측할 수 없는 동작이 발생할 수 있어 지원되지 않습니다.

  • DRANET 드라이버의 수명 주기 관리

    GKE 버전 1.34 이상에서 GKE는 클러스터에 관리형 gke-managed-networking-dra-driver 네임스페이스를 자동으로 만듭니다. 다른 여러 GKE 시스템 워크로드와 마찬가지로 DRANET 드라이버의 포드는 관련이 있는 노드 (예: GPU, TPU 및 기타 특수 하드웨어가 있는 노드)에서만 실행됩니다. 드라이버가 관련이 없는 노드에서는 이 드라이버의 포드가 실행되지 않습니다. networking-dra-driver DaemonSet을 수동으로 수정하지 마세요. nodeAffinity 필드 업데이트와 같은 수동 변경은 GKE의 DRANET 기능 관리를 방해하고 DRANET 데몬 포드가 지원되지 않는 노드에 예약되도록 할 수 있습니다.

요구사항

GKE 관리 DRANET을 사용하려면 환경이 다음 요구사항을 충족해야 합니다.

  • Standard: 1.34.1-gke.1829001 이상
  • Autopilot: 1.35.2-gke.1842000 이상
  • 클러스터에서 GKE Dataplane V2가 사용 설정되어 있습니다.

다음 가속기 최적화 머신 유형 중 하나를 사용해야 합니다.

머신 계열 머신 유형 가속기 모델 네트워킹 기술
A3 Ultra a3-ultragpu-8g NVIDIA H200 GPU RDMA
A4 a4-highgpu-8g NVIDIA B200 GPU RDMA
A4X a4x-highgpu-4g NVIDIA GB200 GPU RDMA
A4X Max a4x-maxgpu-4g-metal NVIDIA B300 GPU RDMA
TPU v7 tpu7x-standard-4t TPU v7 NetDevice
TPU v6e ct6e-standard-8t Trillium TPU NetDevice
TPU v6e ct6e-standard-4t Trillium TPU NetDevice
TPU v6e ct6e-standard-1t Trillium TPU NetDevice

제한사항

GKE DRANET에는 다음과 같은 제한사항이 있습니다.

  • GKE DRANET을 사용하여 기본 네트워크 인터페이스 카드 (NIC) 또는 가상 NIC (예: veth)를 할당할 수 없습니다.
  • 특정 인스턴스 유형(특히 a4x-max와 같은 베어메탈 노드)은 자동 확장 및 Autopilot 클러스터와 호환되지 않습니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치했으면 gcloud components update 명령어를 실행하여 최신 버전을 가져옵니다. 이전 gcloud CLI 버전에서는 이 문서의 명령어를 실행하지 못할 수 있습니다.

필요한 역할

노드 풀을 만들고 네트워크 리소스를 할당하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 Kubernetes Engine 관리자 (roles/container.admin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

클러스터 만들기

GKE Dataplane V2를 사용하는 GKE Standard 클러스터를 만듭니다.

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --region=CONTROL_PLANE_LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION

다음을 바꿉니다.

  • CLUSTER_NAME: 새 클러스터의 이름입니다.
  • CONTROL_PLANE_LOCATION: 클러스터 컨트롤 플레인의 리전 또는 영역입니다(예: us-central1 또는 us-central1-a).
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다.
  • CLUSTER_VERSION: 클러스터의 GKE 버전입니다. 이 버전은 1.34.1-gke.1829001 이상이어야 합니다.

GPU 노드 풀에서 RDMA 인터페이스 사용

다음 섹션에서는 GKE DRANET으로 RDMA 네트워크 인터페이스를 사용하도록 GPU 노드 풀과 워크로드를 구성하는 방법을 설명합니다.

GPU 노드 풀에서 GKE 관리형 DRANET 드라이버 사용 설정

RDMA를 지원하는 GPU 노드 풀에서 GKE DRANET 드라이버를 사용 설정하려면 노드 풀을 만들 때 cloud.google.com/gke-networking-dra-driver=true 라벨을 추가하세요.

gcloud beta container node-pools create NODE_POOL_NAME \
  --region=REGION \
  --cluster=CLUSTER_NAME \
  --node-locations=NODE_LOCATIONS \
  --accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
  --machine-type=MACHINE_TYPE \
  --num-nodes=NUM_NODES \
  --reservation-affinity=specific \
  --reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
  --accelerator-network-profile=auto \
  --node-labels=cloud.google.com/gke-networking-dra-driver=true

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • REGION: 클러스터의 Google Cloud 리전입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.
  • ACCELERATOR_TYPE: GPU 가속기의 유형입니다.

    예를 들면 다음과 같습니다.

    • A4 VM: nvidia-b200를 입력합니다.
    • A3 Ultra VM: nvidia-h200-141gb를 입력합니다.
  • ACCELERATOR_COUNT: 노드 풀의 노드에 연결할 GPU 수입니다. 예를 들어 a4-highgpu-8g 및 a3-ultragpu-8g VM의 GPU 수는 모두 8입니다.

  • DRIVER_VERSION: 사용할 GPU 드라이버 버전입니다. 예를 들면 default 또는 latest입니다.

  • MACHINE_TYPE: 노드 풀의 머신 유형(예: a3-ultragpu-8g)

  • NUM_NODES: 노드 풀의 노드 수입니다. flex-start의 경우 이 값을 0으로 설정해야 합니다.

  • RESERVATION_PROJECT: 예약의 프로젝트 ID입니다.

  • RESERVATION_NAME: 예약의 이름 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.

  • RESERVATION_BLOCK: 예약 내의 특정 블록 이름입니다. 이 값을 확인하려면 미래용 예약 요청 보기를 참고하세요.

이 명령어는 가속기 네트워크 프로필을 사용하여 가속기 VM의 VPC 네트워크와 서브넷을 자동으로 구성합니다. 또는 VPC 네트워크 및 서브넷을 명시적으로 지정할 수 있습니다.

워크로드 RDMA 리소스 배포

포드에 RDMA 리소스를 할당하려면 ResourceClaimTemplate를 지정합니다.

  1. RDMA 기기를 할당하는 방법을 정의하는 ResourceClaimTemplate를 만듭니다. 다음 매니페스트는 노드에서 사용 가능한 모든 mrdma 기기를 요청합니다. 매니페스트를 all-mrdma-template.yaml로 저장합니다.

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: All
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f all-mrdma-template.yaml
    
  3. 워크로드를 배포하고 ResourceClaimTemplate를 참조합니다. 다음 매니페스트는 all-mrdma 템플릿을 참조하는 포드를 배포합니다. 이 템플릿은 포드에 노드의 RDMA 인터페이스에 대한 액세스 권한을 부여합니다. 매니페스트를 agnhost-rdma-pod.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-rdma
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: rdma
          limits:
            nvidia.com/gpu: 1
      resourceClaims:
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  4. 매니페스트를 적용합니다.

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    다음 출력 예시에서는 기본 eth0lo 인터페이스와 할당된 RDMA 인터페이스(예: gpu0rdma0)를 보여줍니다. 네트워크 인터페이스 (NIC)의 수와 이름은 GKE 노드의 머신 유형에 따라 다릅니다.

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

TPU 노드 풀에서 RDMA가 아닌 네트워크 인터페이스 사용

다음 섹션에서는 GKE DRANET과 함께 RDMA가 아닌 네트워크 인터페이스를 사용하도록 TPU 노드 풀과 워크로드를 구성하는 방법을 설명합니다.

네트워킹 DeviceClass 확인

네트워킹을 위한 DeviceClass 리소스가 클러스터에 있는지 확인합니다.

kubectl get deviceclass netdev.google.com

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

NAME                AGE
netdev.google.com   2d22h

TPU 슬라이스 노드 풀에서 GKE 관리 DRANET 드라이버 사용 설정

TPU 슬라이스 노드 풀을 만들 때 GKE DRANET 드라이버를 사용 설정하려면 cloud.google.com/gke-networking-dra-driver=true 라벨을 추가하세요.

gcloud beta container node-pools create NODE_POOL_NAME \
    --location=LOCATION \
    --cluster=CLUSTER_NAME \
    --node-locations=NODE_LOCATIONS \
    --machine-type=MACHINE_TYPE \
    --tpu-topology=TPU_TOPOLOGY \
    --num-nodes=NUM_NODES \
    --accelerator-network-profile=auto \
    --node-labels=cloud.google.com/gke-networking-dra-driver=true

다음을 바꿉니다.

  • NODE_POOL_NAME: 새 노드 풀의 이름입니다.
  • LOCATION: 클러스터의 Google Cloud 리전 또는 영역입니다.
  • CLUSTER_NAME: 클러스터 이름입니다.
  • NODE_LOCATIONS: 노드 풀에 있는 노드의 Google Cloud 영역입니다.
  • MACHINE_TYPE: 노드에 사용할 머신 유형입니다. TPU 호환 머신 유형에 대한 자세한 내용은 TPU 버전 선택을 참고하세요.
  • TPU_TOPOLOGY: TPU 토폴로지(예: 2x4x4) 토폴로지 형식은 TPU 버전에 따라 달라집니다. TPU 토폴로지에 대한 자세한 내용은 토폴로지 선택을 참고하세요.
  • NUM_NODES: 노드 풀의 노드 수입니다.

자세한 내용은 단일 호스트 TPU 슬라이스 노드 풀 만들기를 참고하세요.

모든 네트워크 기기를 요청하는 워크로드 배포

포드에 비RDMA 네트워크 기기를 할당하려면 ResourceClaimTemplate를 지정합니다.

  1. netdev.google.com DeviceClass를 참조하는 ResourceClaimTemplate를 만듭니다. 다음 매니페스트는 노드에서 사용 가능한 모든 비RDMA 네트워크 기기를 요청합니다.

    매니페스트를 all-netdev-template.yaml로 저장합니다.

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-netdev
    spec:
      spec:
        devices:
          requests:
          - name: req-netdev
            exactly:
              deviceClassName: netdev.google.com
              allocationMode: All
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f all-netdev-template.yaml
    
  3. 워크로드를 배포하고 ResourceClaimTemplate를 참조합니다. 다음 매니페스트는 all-netdev 템플릿을 사용하여 포드에 노드의 모든 비RDMA 네트워크 기기에 대한 액세스 권한을 부여하는 포드를 배포합니다. 매니페스트를 netdev-pod.yaml로 저장합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: agnhost-netdev
      namespace: default
      labels:
        app: agnhost
    spec:
      containers:
      - name: agnhost
        image: registry.k8s.io/e2e-test-images/agnhost:2.39
        args: ["netexec", "--http-port", "80"]
        ports:
        - name: agnhost-port
          containerPort: 80
        resources:
          claims:
          - name: netdev
          limits:
            google.com/tpu: 4
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR
        cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
      resourceClaims:
      - name: netdev
        resourceClaimTemplateName: all-netdev
    

    다음을 바꿉니다.

    • TPU_ACCELERATOR: TPU 가속기 유형입니다(예: tpu-v5p-slice).
    • TPU_TOPOLOGY: TPU 토폴로지(예: 2x4x4)
  4. 매니페스트를 적용합니다.

    kubectl apply -f netdev-pod.yaml
    
  5. 추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    다음 출력 예시에서는 기본 eth0lo 인터페이스와 할당된 네트워크 기기(eth1eth2와 같은 이름이 있음)를 보여줍니다. NIC 수와 이름은 GKE 노드의 머신 유형에 따라 다릅니다.

    eth0
    eth1
    eth2
    lo
    

커스텀 ComputeClass로 DRANET 사용 설정

Autopilot 클러스터에서 또는 Standard 클러스터의 노드 자동 프로비저닝과 함께 GKE 관리 DRANET을 사용하려면 커스텀 ComputeClass 리소스를 사용하여 기능을 선택해야 합니다.

  1. DRANET 드라이버를 사용 설정하고 가속기 네트워크 프로필을 auto로 설정하는 ComputeClass 매니페스트를 만듭니다.

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dranet-compute-class
    spec:
      nodePoolAutoCreation:
        enabled: true
      nodePoolConfig:
        dra:
          networking:
            enabled: true
      priorities:
      - machineType: MACHINE_TYPE
        gpu:
          count: GPU_COUNT
          type: GPU_TYPE
        acceleratorNetworkProfile: auto
    

    다음을 바꿉니다.

    • MACHINE_TYPE: 노드 풀의 머신 유형입니다(예: a3-ultragpu-8g).
    • GPU_COUNT: 머신 유형의 GPU 수입니다.
    • GPU_TYPE: GPU 유형(예: nvidia-h200)
  2. 매니페스트를 적용합니다.

    kubectl apply -f COMPUTE_CLASS_FILENAME.yaml
    
  3. 포드 사양에서 cloud.google.com/compute-class 노드 선택기를 사용하여 ComputeClass를 참조합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: dranet-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: "dranet-compute-class"
      ...
    

특정 수의 네트워크 기기 요청

앞의 예에서는 allocationModeAll로 설정하여 특정 유형의 사용 가능한 모든 네트워크 기기를 요청하는 방법을 보여줍니다. 대신 특정 수의 기기를 요청해야 하는 경우 ResourceClaimTemplate에서 allocationModeExactCount로 설정하면 됩니다.

다음 예시에서는 두 개의 RDMA 네트워크 기기를 요청합니다.

apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: two-mrdma
spec:
  spec:
    devices:
      requests:
      - name: req-mrdma
        exactly:
          deviceClassName: mrdma.google.com
          allocationMode: ExactCount
          count: 2

다음 단계