第6章 SR-IOV 用の RDMA サブシステムの設定
Remote Direct Memory Access (RDMA) を使用すると、2 つのシステム間で、どちらのシステムのオペレーティングシステムも介さずに直接メモリーにアクセスできます。Single Root I/O Virtualization (SR-IOV) で RDMA Container Network Interface (CNI) を設定すると、コンテナー間の高性能で低遅延の通信が可能になります。RDMA と SR-IOV を組み合わせると、Data Plane Development Kit (DPDK) アプリケーション内で使用するために Mellanox Ethernet デバイスのハードウェアカウンターを公開するメカニズムが提供されます。
6.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 ネットワーク namespace モードを
exclusiveに設定します。
次のコマンドを実行して、
SriovNetworkPoolConfigリソースを作成します。$ oc create -f sriov-nw-pool.yaml次の例に示すように、
SriovNetworkNodePolicyCR を作成し、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.yaml次の例に示すように、
SriovNetworkCR を作成し、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