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 워크로드에 적합한 솔루션이 됩니다.
포드의 네트워크 인터페이스 요청의 일반적인 사용 사례는 다음과 같습니다.
- 사용 가능한 모든 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 모두 동일한 NIC 집합을 관리하려고 시도하므로 드라이버와 API를 함께 사용하는 것은 지원되지 않습니다. 이렇게 하면 설정이 잘못되고 예측할 수 없는 동작이 발생할 수 있습니다.
요구사항
GKE 관리 DRANET을 사용하려면 환경이 다음 요구사항을 충족해야 합니다.
- GKE 버전 1.34.1-gke.1829001 이상
- 클러스터에서 GKE Dataplane V2가 사용 설정되어 있습니다.
- (미리보기) GKE DRANET은 A4X Max 머신에서 사용할 수 있습니다.
제한사항
GKE DRANET에는 다음과 같은 제한사항이 있습니다.
- GKE DRANET을 사용하여 기본 네트워크 인터페이스 카드 (NIC) 또는 가상 NIC (예: veth)를 할당할 수 없습니다.
- 클러스터 자동 확장 및 Autopilot은 지원되지 않습니다.
secondaryPodRange를 구성한 인터페이스에서는 GKE DRANET을 사용할 수 없습니다.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- 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을 지정합니다.
ResourceClaimTemplate를 만들어 RDMA 기기를 할당하는 방법을 정의합니다. 다음 매니페스트는 노드에서 사용 가능한 모든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
특정 수의 네트워크 기기 요청
앞의 예에서는 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의 자동 네트워킹 구성에 대해 자세히 알아보세요.