第3章 SR-IOV イーサネットネットワーク割り当ての設定
クラスター内の Single Root I/O Virtualization (SR-IOV) デバイスのイーサネットネットワーク割り当てを設定できます。
次のドキュメントでタスクを実行する前に、SR-IOV Network Operator がインストールされていることを確認してください。
3.1. イーサネットデバイス設定オブジェクト リンクのコピーリンクがクリップボードにコピーされました!
イーサネットネットワークデバイスは、SriovNetwork オブジェクトを定義して設定できます。
以下の YAML は SriovNetwork オブジェクトを説明しています。
- 1
- オブジェクトの名前。SR-IOV Network Operator は、同じ名前を持つ
NetworkAttachmentDefinitionオブジェクトを作成します。 - 2
- SR-IOV Network Operator がインストールされている namespace。
- 3
- この追加ネットワークの SR-IOV ハードウェアを定義する
SriovNetworkNodePolicyオブジェクトのspec.resourceNameパラメーターの値。 - 4
SriovNetworkオブジェクトのターゲット namespace。ターゲット namespace の Pod のみを追加ネットワークに割り当てることができます。- 5
- オプション: 追加ネットワークに割り当てる VLAN ID を指定します。デフォルト値
0の場合、この追加ネットワークには VLAN ID タグが付与されません。サポートされる VLAN ID 値の範囲は1-4094です。 - 6
- オプション: VF の spoof チェックモード。許可される値は、文字列の
"on"および"off"です。重要指定する値は引用符で囲む必要があります。引用符で囲まないと、オブジェクトが SR-IOV Network Operator によって拒否されます。
- 7
- YAML ブロックスケーラーとしての IPAM CNI プラグインの設定オブジェクトプラグインは、アタッチメント定義への IP アドレスの割り当てを管理します。
- 8
- オプション: Virtual Function (VF) のリンク状態。許可される値は、
enable、disable、およびautoです。 - 9
- オプション: VF の最大伝送レート (Mbps)。
- 10
- オプション: VF の最小伝送レート (Mbps)。この値は、最大伝送レート以下である必要があります。注記
Intel NIC は
minTxRateパラメーターをサポートしません。詳細は、BZ#1772847 を参照してください。 - 11
- オプション: VF の IEEE 802.1p 優先度レベル。デフォルト値は
0です。 - 12
- オプション: VF の信頼モード。許可される値は、文字列の
"on"および"off"です。重要指定する値を引用符で囲む必要があります。囲まないと、SR-IOV Network Operator はオブジェクトを拒否します。
- 13
- オプション: この追加ネットワークに設定する機能。
'{ "ips": true }'を指定して IP アドレスのサポートを有効にするか、'{ "mac": true }'を指定して MAC アドレスのサポートを有効にすることができます。
3.1.1. デュアルスタック IP アドレスを動的に割り当てる設定の作成 リンクのコピーリンクがクリップボードにコピーされました!
Pod が IPv4 と IPv6 アドレスの両方で通信できるように、デュアルスタック IP アドレスをセカンダリーネットワークに動的に割り当てることができます。
ipRanges パラメーターでは、以下の IP アドレスの割り当てタイプを設定できます。
- IPv4 アドレス
- IPv6 アドレス
- 複数の IP アドレスの割り当て
手順
-
typeをwhereaboutsに設定します。 以下の例のように、
ipRangesを使用して IP アドレスを割り当てます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - セカンダリーネットワークを Pod にアタッチします。詳細は、「セカンダリーネットワークへの Pod の追加」を参照してください。
検証
次のコマンドを入力して、すべての IP アドレスが Pod のネットワーク namespace 内のネットワークインターフェイスに割り当てられていることを確認します。
$ oc exec -it <pod_name> -- ip a
$ oc exec -it <pod_name> -- ip aCopy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
<podname>- Pod の名前。
3.1.2. ネットワークアタッチメントの IP アドレス割り当ての設定 リンクのコピーリンクがクリップボードにコピーされました!
セカンダリーネットワークの場合、Dynamic Host Configuration Protocol (DHCP) や静的割り当てなどのさまざまな割り当て方法をサポートする IP アドレス管理 (IPAM) CNI プラグインを使用して IP アドレスを割り当てることができます。
IP アドレスの動的割り当てを担当する DHCP IPAM CNI プラグインは、2 つの異なるコンポーネントを使用して動作します。
- CNI プラグイン:Kubernetes ネットワークスタックと統合して、IP アドレスを要求および解放できます。
- DHCP IPAM CNI Daemon: IP アドレス割り当て要求を処理するために環境内の既存の DHCP サーバーと連携する DHCP イベントのリスナー。このデーモンは、DHCP サーバー自体ではありません。
IPAM 設定で type: dhcp が必要なネットワークの場合、DHCP サーバーが以下の条件を満たしていることを確認してください。
- DHCP サーバーが環境内で利用可能かつ実行されている。
- DHCP サーバーはクラスターの外部にあり、そのサーバーがお客様の既存のネットワークインフラストラクチャーに含まれる必要があります。
- DHCP サーバーが、ノードに IP アドレスを提供するように適切に設定されている。
環境で DHCP サーバーが利用できない場合は、Whereabouts IPAM CNI プラグインの使用を検討してください。Whereabouts CNI は、外部 DHCP サーバーを必要とせずに同様の IP アドレス管理機能を提供します。
外部 DHCP サーバーが存在しない場合、または静的 IP アドレス管理が優先される場合は、Whereabouts CNI プラグインを使用します。Whereabouts プラグインには、古くなった IP アドレスの割り当てを管理するためのリコンサイラーデーモンが含まれています。
別のデーモンである DHCP IPAM CNI デーモンを組み込むことで、コンテナーの有効期間全体で DHCP リースが定期的に更新されるようにします。DHCP IPAM CNI デーモンをデプロイするには、セカンダリーネットワーク設定の一部としてこのデーモンのデプロイをトリガーするように Cluster Network Operator (CNO) 設定を変更します。
3.1.2.1. 静的 IP アドレス割り当ての設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の表は、静的 IP アドレスの割り当ての設定を説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
IPAM のアドレスタイプ。値 |
|
|
| 仮想インターフェイスに割り当てる IP アドレスを指定するオブジェクトの配列。IPv4 と IPv6 の IP アドレスの両方がサポートされます。 |
|
|
| Pod 内で設定するルートを指定するオブジェクトの配列です。 |
|
|
| オプション: DNS の設定を指定するオブジェクトの配列です。 |
addresses の配列には、以下のフィールドのあるオブジェクトが必要です。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
指定する IP アドレスおよびネットワーク接頭辞。たとえば、 |
|
|
| Egress ネットワークトラフィックをルーティングするデフォルトのゲートウェイ。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
CIDR 形式の IP アドレス範囲 ( |
|
|
| ネットワークトラフィックをルーティングするゲートウェイ。 |
| フィールド | 型 | 説明 |
|---|---|---|
|
|
| DNS クエリーが送信される 1 つ以上の IP アドレスの配列。 |
|
|
|
ホスト名に追加するデフォルトのドメイン。たとえば、ドメインが |
|
|
|
DNS ルックアップのクエリー時に非修飾ホスト名に追加されるドメイン名の配列 (例: |
静的 IP アドレス割り当ての設定例
3.1.2.2. 動的 IP アドレス (DHCP) 割り当ての設定 リンクのコピーリンクがクリップボードにコピーされました!
Pod の作成時に、Pod は元の DHCP リースを取得します。リースは、クラスターで実行している最小限の DHCP サーバーデプロイメントで定期的に更新する必要があります。
イーサネットネットワークアタッチメントの場合、SR-IOV Network Operator は DHCP サーバーデプロイメントを作成しません。Cluster Network Operator は最小限の DHCP サーバーデプロイメントを作成します。
DHCP サーバーのデプロイメントをトリガーするには、以下の例にあるように Cluster Network Operator 設定を編集して shim ネットワーク割り当てを作成する必要があります。
shim ネットワーク割り当ての定義例
ここでは、以下のようになります。
type- クラスターの動的 IP アドレスの割り当てを指定します。
3.1.2.2.1. Whereabouts を使用した動的 IP アドレス割り当ての設定 リンクのコピーリンクがクリップボードにコピーされました!
Whereabouts CNI プラグインは、DHCP サーバーを使用せずに、セカンダリーネットワークに IP アドレスを動的に割り当てる場合に役立ちます。
また、Whereabouts CNI プラグインは、重複する IP アドレス範囲と、別々の NetworkAttachmentDefinition CRD 内で同じ CIDR 範囲を複数回設定することをサポートしています。これにより、マルチテナント環境での柔軟性と管理機能が向上します。
3.1.2.2.1.1. 動的 IP アドレス設定パラメーター リンクのコピーリンクがクリップボードにコピーされました!
以下の表は、Whereabouts を使用した動的 IP アドレス割り当ての設定オブジェクトを説明しています。
| フィールド | 型 | 説明 |
|---|---|---|
|
|
|
IPAM のアドレスタイプ。値 |
|
|
| IP アドレスと範囲を CIDR 表記。IP アドレスは、この範囲内のアドレスから割り当てられます。 |
|
|
| オプション: CIDR 表記の IP アドレスと範囲 (0 個以上) のリスト。除外されたアドレス範囲内の IP アドレスは割り当てられません。 |
|
|
| オプション: 同じ範囲の IP アドレスを共有する場合でも、Pod の各グループまたはドメインが独自の IP アドレスセットを取得するようにします。このフィールドを設定することは、特にマルチテナント環境でネットワークを分離して整理しておく場合に重要です。 |
3.1.2.2.1.2. IP アドレス範囲を除外する Whereabouts による動的 IP アドレス割り当て設定 リンクのコピーリンクがクリップボードにコピーされました!
次の例は、Whereabouts を使用する NAD ファイル内の動的アドレス割り当て設定を示しています。
特定の IP アドレス範囲を除外する Whereabouts 動的 IP アドレス割り当て
3.1.2.2.1.3. IP アドレス範囲が重複する場合に Whereabouts を使用した動的 IP アドレス割り当て リンクのコピーリンクがクリップボードにコピーされました!
次の例は、マルチテナントネットワークで重複する IP アドレスの範囲を使用する、動的な IP アドレスの割り当てを示しています。
NetworkAttachmentDefinition 1
ここでは、以下のようになります。
network_name-
オプションのパラメーター。設定されている場合、
NetworkAttachmentDefinition 2のnetwork_nameと一致する必要があります。
NetworkAttachmentDefinition 2
ここでは、以下のようになります。
network_name-
オプションのパラメーター。設定されている場合、
NetworkAttachmentDefinition 1のnetwork_nameと一致する必要があります。
3.1.2.3. SR-IOV の追加ネットワークの設定 リンクのコピーリンクがクリップボードにコピーされました!
SriovNetwork オブジェクトを作成して、SR-IOV ハードウェアを使用する追加のネットワークを設定できます。SriovNetwork オブジェクトの作成時に、SR-IOV Network Operator は NetworkAttachmentDefinition オブジェクトを自動的に作成します。
SriovNetwork オブジェクトが running 状態の Pod に割り当てられている場合、これを変更したり、削除したりしないでください。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。
手順
SriovNetworkオブジェクトを作成してから、YAML を<name>.yamlファイルに保存します。<name>はこの追加ネットワークの名前になります。オブジェクト仕様は以下の例のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow オブジェクトを作成するには、以下のコマンドを入力します。
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ここで、
<name>は追加ネットワークの名前を指定します。オプション: 以下のコマンドを実行して、直前の手順で作成した
SriovNetworkオブジェクトに関連付けられたNetworkAttachmentDefinitionオブジェクトが存在することを確認するには、以下のコマンドを入力します。<namespace>をSriovNetworkオブジェクトで指定した networkNamespace に置き換えます。oc get net-attach-def -n <namespace>
$ oc get net-attach-def -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.2.4. SR-IOV ネットワークの VRF への割り当て リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者は、CNI VRF プラグインを使用して、SR-IOV ネットワークインターフェイスを VRF ドメインに割り当てることができます。
これを実行するには、VRF 設定を SriovNetwork リソースのオプションの metaPlugins パラメーターに追加します。
VRF を使用するアプリケーションを特定のデバイスにバインドする必要があります。一般的な使用方法として、ソケットに SO_BINDTODEVICE オプションを使用できます。SO_BINDTODEVICE は、渡されるインターフェイス名で指定されているデバイスにソケットをバインドします (例: eth1)。SO_BINDTODEVICE を使用するには、アプリケーションに CAP_NET_RAW 機能がある必要があります。
ip vrf exec コマンドを使用した VRF の使用は、OpenShift Container Platform Pod ではサポートされません。VRF を使用するには、アプリケーションを VRF インターフェイスに直接バインドします。
3.1.2.4.1. CNI VRF プラグインを使用した追加 SR-IOV ネットワーク割り当ての作成 リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV Network Operator は追加ネットワークの定義を管理します。作成する追加ネットワークを指定する場合、SR-IOV Network Operator は NetworkAttachmentDefinition カスタムリソース (CR) を自動的に作成します。
SR-IOV Network Operator が管理する NetworkAttachmentDefinition カスタムリソースは編集しないでください。これを実行すると、追加ネットワークのネットワークトラフィックが中断する可能性があります。
CNI Virtual Routing and Forwarding (VRF) プラグインを使用して追加の SR-IOV ネットワーク割り当てを作成するには、次の手順を実行します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - cluster-admin 権限を持つユーザーとして OpenShift Container Platform クラスターにログインします。
手順
追加の SR-IOV ネットワーク割り当て用の
SriovNetworkカスタムリソース (CR) を作成し、以下のサンプル CR のようにmetaPlugins設定を挿入します。YAML をsriov-network-attachment.yamlファイルとして保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
metaPlugins.type-
typeパラメーターをvrfに設定します。 metaPlugins.vrfname-
vrfnameパラメーターで VRF の名前を指定します。インターフェイスが VRF に割り当てられます。Pod 内の VRF の名前を指定しない場合は、SR-IOV Network Operator によって VRF の名前が自動的に生成されます。
SriovNetworkリソースを作成します。oc create -f sriov-network-attachment.yaml
$ oc create -f sriov-network-attachment.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
以下のコマンドを実行して、SR-IOV Network Operator が
NetworkAttachmentDefinitionCR を作成していることを確認します。予想される出力には、NAD CR の名前と作成後の経過時間 (分) が表示されます。oc get network-attachment-definitions -n <namespace>
$ oc get network-attachment-definitions -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow <namespace> : <namespace> を、ネットワーク割り当ての設定時に指定した namespace に置き換えます(例:additional-sriov-network-1)。注記SR-IOV Network Operator が CR を作成するまでに遅延が生じる可能性があります。
VRF CNI が正しく設定され、追加の SR-IOV ネットワーク割り当てが接続されていることを確認するには、以下を実行します。
- VRF CNI を使用する SR-IOV ネットワークを作成します。
- ネットワークを Pod に割り当てます。
Pod のネットワーク割り当てが SR-IOV の追加ネットワークに接続されていることを確認します。Pod にリモートシェルログインし、次のコマンドを実行していることを確認します。予想される出力には、VRF インターフェイスの名前とルーティングテーブル内の一意の ID が表示されます。
ip vrf show
$ ip vrf showCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、VRF インターフェイスがセカンダリーインターフェイスの
masterであることを確認します。出力例は5: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master red state UP モードを示しています。ip link
$ ip linkCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.2.5. イーサネットベースの SR-IOV 割り当てのランタイム設定 リンクのコピーリンクがクリップボードにコピーされました!
Pod を追加のネットワークに割り当てる場合、ランタイム設定を指定して Pod の特定のカスタマイズを行うことができます。たとえば、特定の MAC ハードウェアアドレスを要求できます。
Pod 仕様にアノテーションを設定して、ランタイム設定を指定します。アノテーションキーは k8s.v1.cni.cncf.io/networks で、ランタイム設定を記述する JSON オブジェクトを受け入れます。
イーサネットベースの SR-IOV ネットワーク割り当てのランタイム設定例
ここでは、以下のようになります。
k8s.v1.cni.cncf.io/networks.name-
SR-IOV ネットワーク割り当て定義 CR の名前。値の例は
iblです。 k8s.v1.cni.cncf.io/networks.mac-
オプションのパラメーター。SR-IOV ネットワーク割り当て定義 CR で定義されるリソースタイプから割り当てられる SR-IOV デバイスの MAC アドレス。この機能を使用するには、
SriovNetworkオブジェクトで{ "mac": true }も指定する必要があります。値の例はc2:11:22:33:44:55:66:77です。 k8s.v1.cni.cncf.io/networks.ips-
オプションのパラメーター。SR-IOV ネットワーク割り当て定義 CR で定義されるリソースタイプから割り当てられる SR-IOV デバイスの IP アドレス。IPv4 と IPv6 アドレスの両方がサポートされます。この機能を使用するには、
SriovNetworkオブジェクトで{ "ips": true }も指定する必要があります。値の例は192.168.10.1/24", "2001::1/64です。
3.1.2.6. セカンダリーネットワークに Pod を追加する リンクのコピーリンクがクリップボードにコピーされました!
セカンダリーネットワークに Pod を追加できます。Pod は、デフォルトネットワークで通常のクラスター関連のネットワークトラフィックを継続的に送信します。
Pod が作成されると、セカンダリーネットワークが Pod にアタッチされます。ただし、Pod がすでに存在する場合は、セカンダリーネットワークをその Pod にアタッチすることはできません。
Pod はセカンダリーネットワークと同じ namespace に存在する必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - クラスターにログインする。
手順
アノテーションを
Podオブジェクトに追加します。以下のアノテーション形式のいずれかのみを使用できます。カスタマイズせずにセカンダリーネットワークを割り当てるには、以下の形式でアノテーションを追加します。
metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
k8s.v1.cni.cncf.io/networks- Pod に関連付けるセカンダリーネットワークの名前を指定します。複数のセカンダリーネットワークを指定するには、各ネットワークをコンマで区切ります。コンマの間にはスペースを入れないでください。同じセカンダリーネットワークを複数回指定した場合、Pod は複数のネットワークインターフェイスをそのネットワークにアタッチします。
カスタマイズしてセカンダリーネットワークをアタッチするには、次の形式でアノテーションを追加します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
name-
NetworkAttachmentDefinitionオブジェクトによって定義されるセカンダリーネットワークの名前を指定します。 namespace-
NetworkAttachmentDefinitionオブジェクトが定義される namespace を指定します。 default-route-
オプションのパラメーター。デフォルトルートのオーバーライドを指定します(例:
192.168.17.1)。
以下のコマンドを入力して Pod を作成します。
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow <name>を Pod の名前に置き換えます。オプション:次のコマンドを入力して、アノテーションが
PodCR に存在することを確認します。<name>を Pod の名前に置き換えます。oc get pod <name> -o yaml
$ oc get pod <name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例では、
example-podPod がnet1セカンダリーネットワークにアタッチされています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
k8s.v1.cni.cncf.io/network-status- オブジェクトの JSON 配列を指定します。各オブジェクトは、Pod にアタッチされているセカンダリーネットワークのステータスを表します。アノテーションの値はプレーンテキストの値として保存されます。
3.1.2.6.1. vfio-pci SR-IOV デバイスの MTU を Pod に公開する リンクのコピーリンクがクリップボードにコピーされました!
追加のネットワークに Pod を追加した後、SR-IOV ネットワークで MTU が使用可能であることを確認できます。
手順
次のコマンドを実行して、Pod アノテーションに MTU が含まれていることを確認します。
oc describe pod example-pod
$ oc describe pod example-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例はサンプル出力を示しています。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Pod 内の
/etc/podnetinfo/で MTU が使用可能であることを確認します。oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtu
$ oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtuCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例はサンプル出力を示しています。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.2.7. SR-IOV ネットワークポリシーの更新中に並列ノードドレインを設定する リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、SR-IOV Network Operator は、ポリシーを変更するたびに、ノードからワークロードをドレイン (解放) します。Operator は、再設定がワークロードに影響を与えないように、このアクションを一度に 1 つのノードで実行します。
大規模なクラスターでは、ノードを順番にドレインするには時間がかかり、数時間または数日かかることもあります。時間に敏感な環境では、SriovNetworkPoolConfig カスタムリソース (CR) で並列ノードドレインを有効にして、SR-IOV ネットワーク設定のロールアウトを高速化できます。
並列ドレインを設定するには、SriovNetworkPoolConfig CR を使用してノードプールを作成します。次に、プールにノードを追加し、Operator が並行してドレインできるプール内のノードの最大数を定義できます。このアプローチでは、実行中のワークロードを処理するために十分なノードがプール内に残っていることを確認しながら、並列ドレインを有効にして再設定を高速化できます。
ノードは 1 つの SR-IOV ネットワークプール設定にのみ属することができます。ノードがプールに含まれていない場合、そのノードは、一度に 1 つのノードだけをドレインするように設定された仮想のデフォルトプールに追加されます。
ドレイン処理中にノードが再起動する可能性があります。
この手順では、SR-IOV リソースを作成し、ノードを並列ドレインする必要があります。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
cluster-admin権限を持つユーザーとしてログインしている。 - SR-IOV Network Operator がインストールされている。
- ノードには SR-IOV をサポートするハードウェアがある。
手順
SriovNetworkPoolConfigリソースを定義する YAML ファイルを作成します。sriov-nw-pool.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
name-
SriovNetworkPoolConfigオブジェクトの名前を指定します。 namespace- SR-IOV Network Operator がインストールされている namespace を指定します。
maxUnavailable- 更新中にプール内で使用できなくなるノードの整数値またはパーセンテージ値を指定します。たとえば、ノードが 10 個あり、使用不可の最大数を 2 に設定した場合は、一度に並列ドレインできるノードは 2 個だけとなり、ワークロードの処理には 8 個のノードが残ります。
nodeSelector-
ノードセレクターを使用して、プールを追加するノードを指定します。この例では、
workerロールを持つすべてのノードをプールに追加します。
次のコマンドを実行して、
SriovNetworkPoolConfigリソースを作成します。oc create -f sriov-nw-pool.yaml
$ oc create -f sriov-nw-pool.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
sriov-testnamespace を作成します。oc create namespace sriov-test
$ oc create namespace sriov-testCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の YAML ファイルの例のように、
SriovNetworkNodePolicyリソースを定義する YAML ファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
SriovNetworkNodePolicyリソースを作成します。oc create -f sriov-node-policy.yaml
$ oc create -f sriov-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow SriovNetworkリソースを定義する YAML ファイルを作成します。sriov-network.yamlファイルの例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
SriovNetworkリソースを作成します。oc create -f sriov-network.yaml
$ oc create -f sriov-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、作成したノードプールを表示します。
oc get sriovNetworkpoolConfig -n openshift-sriov-network-operator
$ oc get sriovNetworkpoolConfig -n openshift-sriov-network-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 予想される出力には、
workerロールを持つすべてのノードを含むノードプールの名前 (pool-1など) と、ノードプールの秒単位の経過時間 (67sなど) が表示されます。クラスター内のワークロードのドレインをトリガーするには、
SriovNetworkNodePolicyリソース内の Virtual Function の数を更新します。oc patch SriovNetworkNodePolicy sriov-nic-1 -n openshift-sriov-network-operator --type merge -p '{"spec": {"numVfs": 4}}'$ oc patch SriovNetworkNodePolicy sriov-nic-1 -n openshift-sriov-network-operator --type merge -p '{"spec": {"numVfs": 4}}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ターゲットクラスターのドレイン状態を確認します。
oc get sriovNetworkNodeState -n openshift-sriov-network-operator
$ oc get sriovNetworkNodeState -n openshift-sriov-network-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAMESPACE NAME SYNC STATUS DESIRED SYNC STATE CURRENT SYNC STATE AGE openshift-sriov-network-operator worker-0 InProgress Drain_Required DrainComplete 3d10h openshift-sriov-network-operator worker-1 InProgress Drain_Required DrainComplete 3d10h
NAMESPACE NAME SYNC STATUS DESIRED SYNC STATE CURRENT SYNC STATE AGE openshift-sriov-network-operator worker-0 InProgress Drain_Required DrainComplete 3d10h openshift-sriov-network-operator worker-1 InProgress Drain_Required DrainComplete 3d10hCopy to Clipboard Copied! Toggle word wrap Toggle overflow ドレインプロセスが完了すると、
SYNC STATUSがSucceededに変わり、DESIRED SYNC STATEとCURRENT SYNC STATEの値がIDLEに戻ります。
3.1.2.8. NUMA 対応スケジューリングのための SR-IOV ネットワークトポロジーの除外 リンクのコピーリンクがクリップボードにコピーされました!
SR-IOV ネットワークリソースの Non-Uniform Memory Access (NUMA) ノードを Topology Manager にアドバタイズする場合を除外するには、SriovNetworkNodePolicy カスタムリソースで excludeTopology 仕様を設定できます。NUMA 対応 Pod のスケジューリングでより柔軟な SR-IOV ネットワークデプロイメントを行うには、この設定を使用します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 -
CPU マネージャーのポリシーを
staticに設定している。CPU マネージャーの詳細は、関連情報 セクションを参照してください。 -
Topology Manager ポリシーを
single-numa-nodeに設定している。 - SR-IOV Network Operator がインストールされている。
手順
SriovNetworkNodePolicyCR を作成します。次の YAML を
sriov-network-node-policy.yamlファイルに保存し、環境に合わせて YAML 内の値を置き換えます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記多数の
SriovNetworkNodePolicyリソースが同じ SR-IOV ネットワークリソースをターゲットとしている場合、SriovNetworkNodePolicyリソースはexcludeTopology仕様と値が同じである必要があります。そうでない場合、矛盾するポリシーは拒否されます。次のコマンドを実行して、
SriovNetworkNodePolicyリソースを作成します。成功した出力には、SriovNetworkNodePolicyリソースの名前とcreatedステータスがリスト表示されます。oc create -f sriov-network-node-policy.yaml
$ oc create -f sriov-network-node-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
SriovNetworkCR を作成します。次の YAML を
sriov-network.yamlファイルに保存します。その場合、YAML 内の値は環境に合わせて置き換えます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
SriovNetworkリソースを作成します。成功した出力には、SriovNetworkリソースの名前とcreatedステータスがリスト表示されます。oc create -f sriov-network.yaml
$ oc create -f sriov-network.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Pod を作成し、前の手順で作成した SR-IOV ネットワークリソースを割り当てます。
次の YAML を
sriov-network-pod.yamlファイルに保存します。その場合、YAML 内の値は環境に合わせて置き換えます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- これは、
SriovNetworkNodePolicyリソースを使用するSriovNetworkリソースの名前です。
次のコマンドを実行して、
Podリソースを作成します。予想される出力には、Podリソースの名前とcreatedステータスが表示されます。oc create -f sriov-network-pod.yaml
$ oc create -f sriov-network-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
次のコマンドを実行して、Pod のステータスを確認します。その場合、
<pod_name>は Pod の名前に置き換えます。oc get pod <pod_name>
$ oc get pod <pod_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME READY STATUS RESTARTS AGE test-deployment-sriov-76cbbf4756-k9v72 1/1 Running 0 45h
NAME READY STATUS RESTARTS AGE test-deployment-sriov-76cbbf4756-k9v72 1/1 Running 0 45hCopy to Clipboard Copied! Toggle word wrap Toggle overflow ターゲット Pod とのデバッグセッションを開き、SR-IOV ネットワークリソースがメモリーおよび CPU リソースとは異なるノードにデプロイされていることを確認します。
次のコマンドを実行して、Pod とのデバッグセッションを開きます。その場合、<pod_name> はターゲット Pod の名前に置き換えます。
oc debug pod/<pod_name>
$ oc debug pod/<pod_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow /hostをデバッグシェル内の root ディレクトリーとして設定します。デバッグ Pod は、Pod 内の/hostにホストからのルートファイルシステムをマウントします。ルートディレクトリーを/hostに変更すると、ホストファイルシステムからのバイナリーを実行できます。chroot /host
$ chroot /hostCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、CPU 割り当てに関する情報を表示します。
lscpu | grep NUMA
$ lscpu | grep NUMACopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NUMA node(s): 2 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,... NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,...
NUMA node(s): 2 NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,... NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,...Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat /proc/self/status | grep Cpus
$ cat /proc/self/status | grep CpusCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Cpus_allowed: ffff Cpus_allowed_list: 1,3,5,7
Cpus_allowed: ffff Cpus_allowed_list: 1,3,5,7Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力には、
NUMA node1などのNUMAノードに割り当てられる CPU (1、3、5、および 7) が表示されるはずです。SR-IOV ネットワークリソースは、NUMA node0などの別のNUMAノードの NIC を使用できます。ffffの 16 進値は、プロセスを実行する CPU コアを表すことに注意してください。cat /sys/class/net/net1/device/numa_node
$ cat /sys/class/net/net1/device/numa_nodeCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力には、
0などのNUMAノードの番号が表示されるはずです。注記excludeTopology仕様をTrueに設定すると、必要なリソースが同じ NUMA ノード内に存在する可能性があります。