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 또는 스토리지 최적화 VM이 있는 노드에서 실행됩니다.
Kubernetes 동적 리소스 할당 (DRA) API를 통해 네트워크 인터페이스를 검색하고 포드에 할당할 수 있도록 하는 노드 수준 에이전트 역할을 합니다.
GKE 버전 1.34.1-gke.1829001 이상에서는 GKE가 네트워킹을 위해 DeviceClass 리소스를 자동으로 설치합니다. 이러한 클래스는 요청할 수 있는 네트워크 기기 유형을 정의합니다. 예를 들어 GKE는 GPU VM의 경우 mrdma.google.com 클래스, TPU 및 기타 네트워크 기기의 경우 netdev.google.com 클래스, 스토리지 최적화 VM (예: Z4M)의 경우 irdma.google.com 클래스를 만듭니다.
GKE DRANET을 사용하려면 먼저 GPU, TPU 또는 스토리지 최적화 VM이 있는 노드 풀에서 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 또는 스토리지 최적화 VM이 있는 노드 풀에
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를 함께 사용하는 것은 지원되지 않습니다. 이로 인해 잘못된 설정과 예측할 수 없는 동작이 발생할 수 있습니다.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 이상 (Z4M VM의 경우 1.36.3-gke.1767000 이상)
- Autopilot: 1.35.2-gke.1842000 이상 (Z4M VM의 경우 1.37.0-gke.4713000 이상)
- 클러스터에서 GKE Dataplane V2가 사용 설정되어 있습니다.
또한 다음 가속기 최적화 또는 스토리지 최적화 머신 유형 중 하나를 사용해야 합니다.
| 머신 시리즈 | 머신 유형 | 가속기 모델 | 네트워킹 기술 | DeviceClass |
|---|---|---|---|---|
| A3 Ultra | a3-ultragpu-8g |
NVIDIA H200 GPU | RDMA | mrdma.google.com |
| A4 | a4-highgpu-8g |
NVIDIA B200 GPU | RDMA | mrdma.google.com |
| A4X | a4x-highgpu-4g |
NVIDIA GB200 GPU | RDMA | mrdma.google.com |
| A4X Max | a4x-maxgpu-4g-metal |
NVIDIA B300 GPU | RDMA | mrdma.google.com |
| TPU v7 | tpu7x-standard-4t |
TPU v7 | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-8t |
Trillium TPU | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-4t |
Trillium TPU | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-1t |
Trillium TPU | NetDevice | netdev.google.com |
| Z4M | IRDMA를 지원하는 모든 Z4M 머신 유형 | 해당 사항 없음 (스토리지 최적화) | RDMA | irdma.google.com |
제한사항
GKE DRANET에는 다음과 같은 제한사항이 있습니다.
- GKE DRANET을 사용하여 기본 네트워크 인터페이스 카드 (NIC) 또는 가상 NIC (예: veth)를 할당할 수 없습니다.
- 특정 인스턴스 유형, 특히
a4x-max과 같은 베어메탈 노드는 자동 확장 및 Autopilot 클러스터와 호환되지 않습니다.
머신별 고려사항
노드의 기본 하드웨어 아키텍처에 따라 일부 머신 시리즈에는 GKE DRANET으로 RDMA 인터페이스를 구성하기 위해 추가 노드 풀 플래그, 컨테이너 이미지 패키지 또는 시스템 DaemonSet가 필요합니다.
A4X Max 베어메탈
- asapd-lite 배포: A4X Max와 같은 베어메탈 GPU 노드를 사용하는 경우 클러스터에
asapd-liteDaemonSet를 배포해야 합니다.asapd-liteDaemonSet는 RDMA 네트워크 인터페이스 카드 (NIC)를 구성합니다. 이 기능이 없으면 하위 인터페이스가 생성되지 않고dranet드라이버가 RDMA NIC를 필터링하여 포드 내에서 RDMA 기능을 사용할 수 없습니다. 전체 설정 안내는 asapd-lite로 MRDMA NIC 구성을 참조하세요.
Z4M 스토리지 최적화 VM
- 컨테이너 이미지 요구사항: Z4M 인스턴스에서 RDMA를 사용하려면 필수 사용자 공간 RDMA 패키지로 구성된 Rocky Linux 8 컨테이너 이미지를 사용해야 합니다. Ubuntu 또는 Debian과 같은 다른 배포판은 지원되지 않습니다.
이러한 배포의 표준 업스트림 패키지에는 IRDMA 드라이버에 필요한 커스텀 ABI 확장 프로그램이 없습니다. 이러한 확장 프로그램이 없으면 런타임 시 패키지가
-ENOSPC오류와 함께 실패합니다. 설정 방법은 스토리지 최적화 노드 풀에서 RDMA 인터페이스 사용을 참조하세요.
시작하기 전에
시작하기 전에 다음 태스크를 수행했는지 확인합니다.
- 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 버전입니다.- Z4M VM:
1.36.3-gke.1767000이상 - 기타 지원되는 모든 VM 또는 베어메탈 인스턴스:
1.34.1-gke.1829001이상
- Z4M VM:
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 노드 풀 및 워크로드를 구성하는 방법을 설명합니다.
네트워킹 DeviceClasses 확인
네트워킹을 위한 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
스토리지 최적화 노드 풀에서 RDMA 인터페이스 사용
다음 섹션에서는 Z4M (z4m-highmem-192) VM을 예시로 사용하여 GKE DRANET에서 RDMA 네트워크 인터페이스를 사용하도록 스토리지 최적화 노드 풀과 워크로드를 구성하는 방법을 설명합니다.
스토리지 최적화 노드 풀 만들기
GKE가 기본 Falcon VPC 네트워크, 서브넷, 보조 네트워크 인터페이스를 자동으로 프로비저닝하고 연결하도록 --accelerator-network-profile=auto 플래그를 사용하여 스토리지 최적화 노드 풀을 만듭니다. Z4M 노드 풀에서 GKE는 기본적으로 DRANET을 사용 설정하므로 노드 풀을 만들 때 cloud.google.com/gke-networking-dra-driver=true 노드 라벨을 지정할 필요가 없습니다. 이 예시에서는 이중 물리적 Titanium NIC가 있고 RDMA 인터페이스 2개를 제공하는 z4m-highmem-192 머신 유형을 사용합니다. 지원되는 머신 유형 목록은 요구사항을 참조하세요.
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--project=PROJECT_ID \
--zone=ZONE \
--machine-type=z4m-highmem-192 \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto
다음을 바꿉니다.
NODE_POOL_NAME: 새 노드 풀의 이름입니다.CLUSTER_NAME: 클러스터 이름입니다.PROJECT_ID: Google Cloud 프로젝트 ID입니다.ZONE: 노드 풀의 Google Cloud 영역입니다.NUM_NODES: 노드 풀의 노드 수입니다.rdma-server및rdma-client포드 예시를 사용하여 노드 간 RDMA 트래픽을 테스트하려면 최소2를 지정합니다.
스토리지 최적화 워크로드 컨테이너 이미지 준비
스토리지 최적화 노드에서 Cloud RDMA를 사용하는 워크로드에는 Cloud RDMA용 커스텀 사용자 공간 RDMA 라이브러리(rdma-core)가 설치된 Rocky Linux 8 컨테이너 이미지가 필요합니다. 기본 업스트림 패키지를 사용하지 마세요. 호스트 IRDMA 드라이버에 필요한 커스텀 ABI 확장 프로그램이 없으며 런타임 시 -ENOSPC 오류가 발생합니다. IP 주소 할당을 확인하고 RDMA 연결을 테스트하려면 iproute, libibverbs-utils, librdmacm-utils, infiniband-diags, perftest도 설치합니다.
필수 패키지 저장소를 구성하는 Dockerfile 예시는 Docker 이미지 준비를 참조하세요.
ip 명령어로 IP 할당을 검사할 수 있도록 dnf install 명령어에 iproute를 포함합니다.
필수 패키지에 대한 자세한 내용은 Cloud RDMA RPM을 참조하세요.
RDMA 리소스로 워크로드 배포
스토리지 최적화 노드의 포드에 RDMA 인터페이스를 할당하려면 irdma.google.com DeviceClass를 요청하는 ResourceClaimTemplate를 만듭니다.
ResourceClaimTemplate매니페스트를 만들고irdma-template.yaml로 저장합니다.apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: irdma-template spec: spec: devices: requests: - name: irdma exactly: deviceClassName: irdma.google.com allocationMode: ExactCount count: 2이 매니페스트에서 각 항목은 다음을 수행합니다.
deviceClassName: irdma.google.com: 스토리지 최적화 노드에서 GKE DRANET에서 관리하는 IRDMA 네트워크 인터페이스를 요청합니다.allocationMode: ExactCount및count: 2:z4m-highmem-192노드에서 사용 가능한 두 IRDMA 인터페이스를 모두 요청합니다. 워크로드에 단일 RDMA 인터페이스만 필요하거나 하나의 IRDMA 인터페이스를 제공하는 Z4M 머신 유형을 사용하는 경우1을 지정합니다.
매니페스트를 적용합니다.
kubectl apply -f irdma-template.yaml노드 간 RDMA 트래픽을 테스트할 수 있도록
rdma-server및rdma-client의 두 포드를 정의하는 매니페스트를 만듭니다. 각 포드는IPC_LOCK기능을 추가하고irdma-templateResourceClaimTemplate를 참조합니다. 매니페스트를irdma-pods.yaml로 저장합니다.apiVersion: v1 kind: Pod metadata: name: rdma-server labels: app: perftest role: server spec: restartPolicy: Never affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["perftest"] topologyKey: "kubernetes.io/hostname" containers: - name: perftest image: IMAGE_URI command: ["sleep", "infinity"] securityContext: capabilities: add: ["IPC_LOCK"] resources: claims: - name: irdma resourceClaims: - name: irdma resourceClaimTemplateName: irdma-template --- apiVersion: v1 kind: Pod metadata: name: rdma-client labels: app: perftest role: client spec: restartPolicy: Never affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["perftest"] topologyKey: "kubernetes.io/hostname" containers: - name: perftest image: IMAGE_URI command: ["sleep", "infinity"] securityContext: capabilities: add: ["IPC_LOCK"] resources: claims: - name: irdma resourceClaims: - name: irdma resourceClaimTemplateName: irdma-templateIMAGE_URI의 두 인스턴스를 모두 Rocky Linux 8 RDMA 컨테이너 이미지의 URI로 바꿉니다.이 매니페스트에서 각 항목은 다음을 수행합니다.
metadata.labels: 각 포드에app: perftest및role라벨을 지정합니다. 두 포드는app: perftest라벨을 공유하므로 안티 어피니티 규칙이 적용됩니다.role라벨은rdma-server포드 (role: server)를rdma-client포드(role: client)와 구분하여 노드 간 포드 간 RDMA 연결을 테스트할 수 있습니다.affinity.podAntiAffinity: Kubernetes가 동일한 노드에서app: perftest라벨을 공유하는 포드를 예약하지 못하게 합니다. 두 포드 모두에 이 라벨이 있으므로ResourceClaimTemplate가 하나의 인터페이스 (count: 1)만 요청하는 경우에도 교차 노드 RDMA 테스트를 위해 별도의 물리적 호스트에서 실행됩니다. 두 포드를 모두 예약하려면 노드 풀에 노드가 2개 이상 있어야 합니다.securityContext.capabilities.add: ["IPC_LOCK"]: 컨테이너가 메모리 페이지를 잠글 수 있도록 허용합니다. 이는 RDMA 사용자 공간 라이브러리가 직접 메모리 액세스를 위해 메모리 리전을 등록하는 데 필요합니다.spec.resourceClaims:irdma-templateResourceClaimTemplate에서 포드별ResourceClaim(irdma)를 생성합니다.containers.resources.claims:irdma클레임에 의해 할당된 인터페이스에 대한perftest컨테이너 액세스 권한을 부여합니다.
매니페스트를 적용합니다.
kubectl apply -f irdma-pods.yaml할당된 RDMA 인터페이스 (
rdma0및rdma1)가 서버 포드 내에 표시되는지 확인합니다.kubectl exec rdma-server -- ip -br addr show출력은 다음과 비슷합니다.
lo UNKNOWN 127.0.0.1/8 rdma1 UP 10.5.0.3/32 rdma0 UP 10.31.0.3/32 eth0@if18 UP 10.120.2.6/32
두 포드 간의 RDMA 트래픽을 확인하려면 rdma-server와 rdma-client 간에 rping를 실행합니다.
서버 포드에서
rping서버를 시작합니다.kubectl exec -it rdma-server -- rping -s -a RDMA_IP -v -dRDMA_IP를 서버 포드의rdma0또는rdma1IP 주소(예:10.31.0.3)로 바꿉니다.두 번째 터미널에서 클라이언트 포드에
rping클라이언트를 실행합니다.kubectl exec -it rdma-client -- rping -c -a RDMA_IP -C 5 -v -d클라이언트 출력에서 RDMA 연결이 성공했음을 나타내는 다음 지표를 확인합니다.
RDMA_CM_EVENT_ADDR_RESOLVED및RDMA_CM_EVENT_ROUTE_RESOLVED: RDMA 통신 관리자가 대상 RDMA IP 주소 및 경로를 확인했는지 확인합니다.ESTABLISHED및rdma_connect successful: 클라이언트가 큐 쌍 (qp), 완료 큐 (cq), 보호 도메인 (pd)을 만들고 RDMA 연결을 설정했음을 확인합니다.send completion,recv completion,ping data: rdma-ping-항목 5개: 연결을 닫기 전에 RDMA 인터페이스를 통해 RDMA 읽기 및 쓰기 왕복 반복이 5회 완료되었음을 확인합니다(destroy cm_id).
커스텀 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 # Omit the gpu section for storage-optimized VMs (such as Z4M). gpu: count: GPU_COUNT type: GPU_TYPE acceleratorNetworkProfile: auto다음을 바꿉니다.
MACHINE_TYPE: 노드 풀의 머신 유형입니다(예:a3-ultragpu-8g또는z4m-highmem-192).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" ...
특정 수의 네트워크 기기 요청
위의 GPU 및 TPU 예시에서는 allocationMode를 All로 설정하여 특정 유형의 사용 가능한 모든 네트워크 기기를 요청하는 방법을 보여줍니다. 대신 특정 수의 기기를 요청하려면 RDMA 리소스로 워크로드 배포에 표시된 대로 ResourceClaimTemplate에서 allocationMode를 ExactCount로 설정합니다.
다음 예시에서는 RDMA 네트워크 기기 2개를 요청합니다.
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의 자동화된 네트워킹 구성 자세히 알아보기