23.12. ハードウェアオフロードの設定
クラスター管理者は、互換性のあるノードでハードウェアオフロードを設定して、データ処理パフォーマンスを向上させ、ホスト CPU の負荷を軽減できます。
23.12.1. ハードウェアのオフロードについて
Open vSwitch ハードウェアオフロードは、ネットワークタスクを CPU から迂回させ、ネットワークインターフェイスコントローラー上の専用プロセッサーにオフロードすることにより、ネットワークタスクを処理する方法です。その結果、クラスターは、データ転送速度の高速化、CPU ワークロードの削減、およびコンピューティングコストの削減の恩恵を受けることができます。
この機能の重要な要素は、SmartNIC と呼ばれる最新クラスのネットワークインターフェイスコントローラーです。SmartNIC は、計算量の多いネットワーク処理タスクを処理できるネットワークインターフェイスコントローラーです。専用のグラフィックカードがグラフィックパフォーマンスを向上させるのと同じように、SmartNIC はネットワークパフォーマンスを向上させることができます。いずれの場合も、専用プロセッサーにより、特定のタイプの処理タスクのパフォーマンスが向上します。
OpenShift Container Platform では、互換性のある SmartNIC を持つベアメタルノードのハードウェアオフロードを設定できます。ハードウェアオフロードは、SR-IOV Network Operator によって設定および有効化されます。
ハードウェアのオフロードは、すべてのワークロードまたはアプリケーションタイプと互換性があるわけではありません。次の 2 つの通信タイプのみがサポートされています。
- pod-to-pod
- pod-to-service。サービスは通常の Pod に基づく ClusterIP サービスです。
すべての場合において、ハードウェアのオフロードは、それらの Pod とサービスが互換性のある SmartNIC を持つノードに割り当てられている場合にのみ行われます。たとえば、ハードウェアをオフロードしているノードの Pod が、通常のノードのサービスと通信しようとしているとします。通常のノードでは、すべての処理がカーネルで行われるため、Pod からサービスへの通信の全体的なパフォーマンスは、その通常のノードの最大パフォーマンスに制限されます。ハードウェアオフロードは、DPDK アプリケーションと互換性がありません。
ノードでのハードウェアのオフロードを有効にし、使用する Pod を設定しないと、Pod トラフィックのスループットパフォーマンスが低下する可能性があります。OpenShift Container Platform で管理される Pod のハードウェアオフロードを設定することはできません。
23.12.2. サポートされるデバイス
ハードウェアオフロードは、次のネットワークインターフェイスコントローラーでサポートされています。
製造元 | モデル | ベンダー ID | デバイス ID |
---|---|---|---|
Mellanox | MT27800 Family [ConnectX‑5] | 15b3 | 1017 |
Mellanox | MT28880 Family [ConnectX‑5 Ex] | 15b3 | 1019 |
Mellanox | MT2892 Family [ConnectX‑6 Dx] | 15b3 | 101d |
Mellanox | MT2894 ファミリー [ConnectX-6 Lx] | 15b3 | 101f |
Mellanox | ConnectX-6 NIC モードの MT42822 BlueField-2 | 15b3 | a2d6 |
23.12.3. 前提条件
- クラスターに、ハードウェアのオフロードがサポートされているネットワークインターフェイスコントローラーを備えたベアメタルマシンが少なくとも 1 台ある。
- SR-IOV Network Operator をインストール している。
- クラスターで OVN-Kubernetes ネットワークプラグインを使用 している。
-
OVN-Kubernetes ネットワークプラグイン設定 で、
gatewayConfig.routingViaHost
フィールドがfalse
に設定されています。
23.12.4. SR-IOV Network Operator の systemd モードへの設定
ハードウェアオフロードをサポートするには、まず SR-IOV Network Operator を systemd
モードに設定する必要があります。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
すべての SR-IOV Operator コンポーネントをデプロイするには、
SriovOperatorConfig
カスタムリソース (CR) を作成します。次の YAML を含む
sriovOperatorConfig.yaml
という名前のファイルを作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default 1 namespace: openshift-sriov-network-operator spec: enableInjector: true enableOperatorWebhook: true configurationMode: "systemd" 2 logLevel: 2
次のコマンドを実行して、リソースを作成します。
$ oc apply -f sriovOperatorConfig.yaml
23.12.5. ハードウェアオフロード用のマシン設定プールの設定
ハードウェアオフロードを有効にするには、専用のマシン設定プールを作成し、SR-IOV Network Operator と連携するように設定する必要があります。
前提条件
-
SR-IOV Network Operator がインストールされ、
systemd
モードに設定されている。
手順
ハードウェアオフロードを使用するマシンのマシン設定プールを作成します。
次の例のようなコンテンツを含む
mcp-offloading.yaml
などのファイルを作成します。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: mcp-offloading 1 spec: machineConfigSelector: matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,mcp-offloading]} 2 nodeSelector: matchLabels: node-role.kubernetes.io/mcp-offloading: "" 3
マシン設定プールの設定を適用します。
$ oc create -f mcp-offloading.yaml
マシン設定プールにノードを追加します。プールのノードロールラベルで各ノードにラベルを付けます。
$ oc label node worker-2 node-role.kubernetes.io/mcp-offloading=""
オプション: 新しいプールが作成されたことを確認するには、次のコマンドを実行します。
$ oc get nodes
出力例
NAME STATUS ROLES AGE VERSION master-0 Ready master 2d v1.27.3 master-1 Ready master 2d v1.27.3 master-2 Ready master 2d v1.27.3 worker-0 Ready worker 2d v1.27.3 worker-1 Ready worker 2d v1.27.3 worker-2 Ready mcp-offloading,worker 47h v1.27.3 worker-3 Ready mcp-offloading,worker 47h v1.27.3
このマシン設定プールを
SriovNetworkPoolConfig
カスタムリソースに追加します。次の例のようなコンテンツを含むファイル (
sriov-pool-config.yaml
など) を作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkPoolConfig metadata: name: sriovnetworkpoolconfig-offload namespace: openshift-sriov-network-operator spec: ovsHardwareOffloadConfig: name: mcp-offloading 1
- 1
- ハードウェアオフロード用のマシン設定プールの名前。
設定を適用します。
$ oc create -f <SriovNetworkPoolConfig_name>.yaml
注記SriovNetworkPoolConfig
オブジェクトで指定された設定を適用すると、SR-IOV Operator は、マシン設定プール内のノードをドレインして再起動します。設定の変更が適用されるまでに数分かかる場合があります。
23.12.6. SR-IOV ネットワークノードポリシーの設定
SR-IOV ネットワークノードポリシーを作成することにより、ノードの SR-IOV ネットワークデバイス設定を作成できます。ハードウェアオフロードを有効にするには、値 "switchdev"
を使用して .spec.eSwitchMode
フィールドを定義する必要があります。
次の手順では、ハードウェアをオフロードするネットワークインターフェイスコントローラー用の SR-IOV インターフェイスを作成します。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
次の例のようなコンテンツを含むファイル (
sriov-node-policy.yaml
など) を作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-policy 1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice 2 eSwitchMode: "switchdev" 3 nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0 nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" numVfs: 6 priority: 5 resourceName: mlxnics
ポリシーの設定を適用します。
$ oc create -f sriov-node-policy.yaml
注記SriovNetworkPoolConfig
オブジェクトで指定された設定を適用すると、SR-IOV Operator は、マシン設定プール内のノードをドレインして再起動します。設定の変更が適用されるまでに数分かかる場合があります。
23.12.6.1. OpenStack の SR-IOV ネットワークノードポリシーの例
次の例は、Red Hat OpenStack Platform (RHOSP) でハードウェアオフロードを使用するネットワークインターフェイスコントローラー (NIC) の SR-IOV インターフェイスを示しています。
RHOSP でのハードウェアオフロードを備えた NIC の SR-IOV インターフェイス
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: ${name} namespace: openshift-sriov-network-operator spec: deviceType: switchdev isRdma: true nicSelector: netFilter: openstack/NetworkID:${net_id} nodeSelector: feature.node.kubernetes.io/network-sriov.capable: 'true' numVfs: 1 priority: 99 resourceName: ${name}
23.12.7. Virtual Function を使用したネットワークトラフィックのパフォーマンスの向上
この手順に従って、OVN-Kubernetes 管理ポートに Virtual Function を割り当て、そのネットワークトラフィックパフォーマンスを向上させます。
この手順により 2 つのプールが作成されます。1 つ目には OVN-Kubernetes によって使用される Virtual Function があり、2 つ目は残りの Virtual Function で構成されます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
次のコマンドを実行して、SmartNIC が存在する各ワーカーノードに
network.operator.openshift.io/smart-nic
ラベルを追加します。$ oc label node <node-name> network.operator.openshift.io/smart-nic=
oc get nodes
コマンドを使用して、使用可能なノードのリストを取得します。次の例のような内容を含む、管理ポート用の
sriov-node-mgmt-vf-policy.yaml
という名前のポリシーを作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-mgmt-vf-policy namespace: openshift-sriov-network-operator spec: deviceType: netdevice eSwitchMode: "switchdev" nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0#0-0 1 nodeSelector: network.operator.openshift.io/smart-nic: "" numVfs: 6 2 priority: 5 resourceName: mgmtvf
次の例のような内容を含む
sriov-node-policy.yaml
という名前のポリシーを作成します。apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-node-policy namespace: openshift-sriov-network-operator spec: deviceType: netdevice eSwitchMode: "switchdev" nicSelector: deviceID: "1019" rootDevices: - 0000:d8:00.0 vendor: "15b3" pfNames: - ens8f0#1-5 1 nodeSelector: network.operator.openshift.io/smart-nic: "" numVfs: 6 2 priority: 5 resourceName: mlxnics
注記sriov-node-mgmt-vf-policy.yaml
ファイルには、pfNames
キーとresourceName
キーの値がsriov-node-policy.yaml
ファイルとは異なります。両方のポリシーの設定を適用します。
$ oc create -f sriov-node-policy.yaml
$ oc create -f sriov-node-mgmt-vf-policy.yaml
管理設定用にクラスター内に Cluster Network Operator (CNO) ConfigMap を作成します。
次の内容を含む
hardware-offload-config.yaml
という名前の ConfigMap を作成します。apiVersion: v1 kind: ConfigMap metadata: name: hardware-offload-config namespace: openshift-network-operator data: mgmt-port-resource-name: openshift.io/mgmtvf
ConfigMap の設定を適用します。
$ oc create -f hardware-offload-config.yaml
23.12.8. ネットワーク接続定義の作成
マシン設定プールと SR-IOV ネットワークノードポリシーを定義した後、指定したネットワークインターフェイスカードのネットワーク接続定義を作成できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 -
cluster-admin
ロールを持つユーザーとしてクラスターにアクセスできる。
手順
次の例のようなコンテンツを含むファイル (
net-attach-def.yaml
など) を作成します。apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: net-attach-def 1 namespace: net-attach-def 2 annotations: k8s.v1.cni.cncf.io/resourceName: openshift.io/mlxnics 3 spec: config: '{"cniVersion":"0.3.1","name":"ovn-kubernetes","type":"ovn-k8s-cni-overlay","ipam":{},"dns":{}}'
ネットワーク接続定義の設定を適用します。
$ oc create -f net-attach-def.yaml
検証
次のコマンドを実行して、新しい定義が存在するかどうかを確認します。
$ oc get net-attach-def -A
出力例
NAMESPACE NAME AGE net-attach-def net-attach-def 43h
23.12.9. ネットワーク接続定義を Pod へ追加
マシン設定プール、SriovNetworkPoolConfig
および SriovNetworkNodePolicy
カスタムリソース、およびネットワーク接続定義を作成した後、ネットワーク接続定義を Pod 仕様に追加することにより、これらの設定を Pod に適用できます。
手順
Pod 仕様で、
.metadata.annotations.k8s.v1.cni.cncf.io/networks
フィールドを追加し、ハードウェアオフロード用に作成したネットワーク接続定義を指定します。.... metadata: annotations: v1.multus-cni.io/default-network: net-attach-def/net-attach-def 1
- 1
- 値は、ハードウェアオフロード用に作成したネットワーク接続定義の名前と namespace である必要があります。