5장. SR-IOV의 RDMA 하위 시스템 구성
RDMA(Remote Direct Memory Access)를 사용하면 두 시스템 간의 직접 메모리 액세스를 통해 두 시스템의 운영 체제 없이 직접 메모리에 액세스할 수 있습니다. SR-IOV(Single Root I/O Virtualization)에서 RDMA CNI(Container Network Interface)를 구성하여 컨테이너 간에 고성능 대기 시간이 짧은 통신을 활성화할 수 있습니다. 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로 저장합니다.SriovNetworkPoolConfigCR의 예apiVersion: 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.yamlSriovNetworkNodePolicyCR을 생성하고 다음 예와 같이sriov-node-policy.yaml로 저장합니다.SriovNetworkNodePolicyCR의 예apiVersion: 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.yamlSriovNetworkCR을 생성하고 다음 예와 같이sriov-network.yaml로 저장합니다.SriovNetworkCR의 예apiVersion: 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"]다음 명령을 실행하여 테스트 Pod를 생성합니다.
$ oc create -f sriov-test-pod.yaml다음 명령을 실행하여 테스트 Pod에 로그인합니다.
$ 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