5장. SR-IOV를 위한 RDMA 하위 시스템 구성
RDMA(원격 직접 메모리 액세스)를 사용하면 두 시스템의 운영 체제를 거치지 않고도 두 시스템 간의 직접 메모리 액세스가 가능합니다. SR-IOV(Single Root I/O Virtualization)에서 RDMA 컨테이너 네트워크 인터페이스(CNI)를 구성하여 컨테이너 간에 고성능, 저지연 통신을 구현할 수 있습니다. RDMA와 SR-IOV를 결합하면 DPDK(Data Plane Development Kit) 애플리케이션 내부에서 사용할 수 있도록 Mellanox 이더넷 장치의 하드웨어 카운터를 노출하는 메커니즘을 제공합니다.
5.1. SR-IOV RDMA CNI 구성 링크 복사링크가 클립보드에 복사되었습니다!
SR-IOV에서 RDMA CNI를 구성합니다.
이 절차는 Mellanox 장치에만 적용됩니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - SR-IOV Network Operator가 설치되어 있습니다.
프로세스
다음 예와 같이
SriovNetworkPoolConfigCR을 만들고sriov-nw-pool.yaml로 저장합니다.예제
SriovNetworkPoolConfigCRapiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkPoolConfig metadata: name: worker namespace: openshift-sriov-network-operator spec: maxUnavailable: 1 nodeSelector: matchLabels: node-role.kubernetes.io/worker: "" rdmaMode: exclusive1 - 1
- RDMA 네트워크 네임스페이스 모드를
배타로 설정합니다.
다음 명령을 실행하여
SriovNetworkPoolConfig리소스를 만듭니다.$ oc create -f sriov-nw-pool.yaml다음 예와 같이
SriovNetworkNodePolicyCR을 만들고sriov-node-policy.yaml로 저장합니다.예제
SriovNetworkNodePolicyCRapiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-nic-pf1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice isRdma: true1 nicSelector: pfNames: ["ens3f0np0"] nodeSelector: node-role.kubernetes.io/worker: "" numVfs: 4 priority: 99 resourceName: sriov_nic_pf1- 1
- RDMA 모드를 활성화합니다.
다음 명령을 실행하여
SriovNetworkNodePolicy리소스를 만듭니다.$ oc create -f sriov-node-policy.yaml다음 예와 같이
SriovNetworkCR을 만들고sriov-network.yaml로 저장합니다.예시
SriovNetworkCRapiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-nic-pf1 namespace: openshift-sriov-network-operator spec: networkNamespace: sriov-tests resourceName: sriov_nic_pf1 ipam: |- metaPlugins: | { "type": "rdma"1 }- 1
- RDMA 플러그인을 생성합니다.
다음 명령을 실행하여
SriovNetwork리소스를 만듭니다.$ oc create -f sriov-network.yaml
검증
다음 예와 같이
PodCR을 만들고sriov-test-pod.yaml로 저장합니다.런타임 구성 예
apiVersion: v1 kind: Pod metadata: name: sample-pod annotations: k8s.v1.cni.cncf.io/networks: |- [ { "name": "net1", "mac": "20:04:0f:f1:88:01", "ips": ["192.168.10.1/24", "2001::1/64"] } ] spec: containers: - name: sample-container image: <image> imagePullPolicy: IfNotPresent command: ["sleep", "infinity"]다음 명령을 실행하여 테스트 포드를 만듭니다.
$ oc create -f sriov-test-pod.yaml다음 명령을 실행하여 테스트 포드에 로그인합니다.
$ oc rsh testpod1 -n sriov-tests다음 명령을 실행하여
hw-counters디렉토리 경로가 있는지 확인하세요.$ ls /sys/bus/pci/devices/${PCIDEVICE_OPENSHIFT_IO_SRIOV_NIC_PF1}/infiniband/*/ports/1/hw_counters/출력 예
duplicate_request out_of_buffer req_cqe_flush_error resp_cqe_flush_error roce_adp_retrans roce_slow_restart_trans implied_nak_seq_err out_of_sequence req_remote_access_errors resp_local_length_error roce_adp_retrans_to rx_atomic_requests lifespan packet_seq_err req_remote_invalid_request resp_remote_access_errors roce_slow_restart rx_read_requests local_ack_timeout_err req_cqe_error resp_cqe_error rnr_nak_retry_err roce_slow_restart_cnps rx_write_requests