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-driverDaemonSet을 수동으로 수정하지 마세요.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를 입력합니다.
- A4 VM:
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를 지정합니다.
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매니페스트를 적용합니다.
kubectl apply -f all-mrdma-template.yaml워크로드를 배포하고
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매니페스트를 적용합니다.
kubectl apply -f agnhost-rdma-pod.yaml추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.
kubectl exec agnhost-rdma -- ls /sys/class/net다음 출력 예시에서는 기본
eth0및lo인터페이스와 할당된 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를 지정합니다.
netdev.google.comDeviceClass를 참조하는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매니페스트를 적용합니다.
kubectl apply -f all-netdev-template.yaml워크로드를 배포하고
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)
매니페스트를 적용합니다.
kubectl apply -f netdev-pod.yaml추가로 할당된 네트워크 인터페이스가 포드 내에 표시되는지 확인합니다.
kubectl exec agnhost-netdev -- ls /sys/class/net다음 출력 예시에서는 기본
eth0및lo인터페이스와 할당된 네트워크 기기(eth1및eth2와 같은 이름이 있음)를 보여줍니다. NIC 수와 이름은 GKE 노드의 머신 유형에 따라 다릅니다.eth0 eth1 eth2 lo
커스텀 ComputeClass로 DRANET 사용 설정
Autopilot 클러스터에서 또는 Standard 클러스터의 노드 자동 프로비저닝과 함께 GKE 관리 DRANET을 사용하려면 커스텀 ComputeClass 리소스를 사용하여 기능을 선택해야 합니다.
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)
매니페스트를 적용합니다.
kubectl apply -f COMPUTE_CLASS_FILENAME.yaml포드 사양에서
cloud.google.com/compute-class노드 선택기를 사용하여 ComputeClass를 참조합니다.apiVersion: v1 kind: Pod metadata: name: dranet-pod spec: nodeSelector: cloud.google.com/compute-class: "dranet-compute-class" ...
특정 수의 네트워크 기기 요청
앞의 예에서는 allocationMode을 All로 설정하여 특정 유형의 사용 가능한 모든 네트워크 기기를 요청하는 방법을 보여줍니다. 대신 특정 수의 기기를 요청해야 하는 경우 ResourceClaimTemplate에서 allocationMode을 ExactCount로 설정하면 됩니다.
다음 예시에서는 두 개의 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
다음 단계
- 동적 리소스 할당에 대해 자세히 알아보세요.
- 액셀러레이터 VM의 자동화된 네트워킹 구성에 대해 자세히 알아보세요.