ノート:
- このチュートリアルではOracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了する場合は、これらの値をクラウド環境に固有の値に置き換えてください。
マルチパスCNIを使用したOKE上のポッドに対するSR-IOVインタフェースの構成
イントロダクション
SR-IOVは、単一のPCIeデバイスを複数の個別の物理PCIeデバイスとして表示できる仕様です。SR-IOVは、物理機能(PF)と仮想機能(VF)の概念を導入することによって機能します。PFはホストによって使用され、通常は単一のNICポートを表します。VFは、そのPFの軽量バージョンです。適切なサポートにより、SR-IOVは物理ハードウェア(SmartNICなど)が複数の個別の(ネットワークインタフェース)デバイスとしてそれ自体を示す方法を提供します。コンテナを使用すると、コンテナがインタフェースに直接アクセスできるように、これらのインタフェース(VF)の1つをホストからコンテナまたはポッドのネットワーク・ネームスペースに移動できます。この利点は、virt-ioによるオーバーヘッドがなく、ネイティブデバイスのパフォーマンスが得られることです。
ノート: このチュートリアルで説明するプラグインおよびプロセスは、ベア・メタル・インスタンスにのみ適用されます。仮想マシン・ベースのインスタンスの場合、異なるプラグインおよび構成のセットが必要です。
目標
このチュートリアルでは、OKEクラスタで実行されているポッドに対して、セカンダリSR-IOV仮想機能ベースのネットワーク・インタフェースを設定する方法について説明します。SRIOV-CNIプラグインを利用して、SR-IOV仮想機能をノードに割り当てることができるリソースとして管理し、MultusメタCNIを使用してポッドに追加のネットワーク・インタフェースを追加します。
機能
このアプローチにはいくつかのレイヤーとコンポーネントがあります。その正確には、Kubernetesデバイス・プラグインが一連の仮想機能を管理し、それをノード上の割当て可能なリソースとして公開します。ポッドがそのようなリソースをリクエストすると、リソースが使用可能なノードにポッドを割り当て、SR-IOV CNIがポッドのネットワーク・ネームスペースに仮想機能をplumbできます。MultusなどのCNIメタプラグインは、ポッドへの複数のネットワーク・アタッチメントを処理し、ポッドがSR-IOVとオーバーレイ・ネットワークの両方を介して通信できるようにします。
最初に、SR-IOV対応 smartNICsに多数のVFを設定し、それを個々のNICとして表示します。次に、Oracle Cloud Infrastructure (OCI)で認識されるMACアドレスを使用してこれらのVFを構成します。これらのVFは、Multusの外部で(このチュートリアルで説明されているように)手動またはノード作成時に呼び出すことができるスクリプトを使用して作成されます。この時点で、VFのプールがあり、それぞれホストによって個別のNICとして識別され、OCI MACアドレスがあります。Kubernetesネットワーク・plumbingワーキング・グループは、VFを割り当て可能なノード・リソースとして検出および公開する特別な目的のネットワーク・デバイス・プラグインを維持します。SR-IOV CNI (Kubernetesネットワーク・plumb作業グループからも同様)は、デバイス・プラグインとともに動作し、ポッド・ライフサイクルに基づいてポッドへのこれらの仮想機能の割当てを管理します。
これで、SR-IOVデバイスプラグインによって割り当て可能なノードリソースとして認識および管理されるVFのプールを持つ1つ以上のノードがあります。これらはポッドによってリクエストできます。SR-IOV CNIは、VFをポッド作成時にポッドのネットワーク名前空間にplumb (移動)し、ポッド削除時にVFを解放します(ルート名前空間に戻します)。これにより、VFを別のポッドに割り当てることができます。Multusのようなメタ・プラグインは、CNIにVF情報を提供し、ポッド上の複数のネットワーク添付を管理できます。

タスク1: ホストの設定
まず、PCIeインタフェースにVFを設定できるベア・メタル・ホストから始めます。ベア・メタル・ホストでは、次のステップを実行します。
-
VFの作成: ベア・メタル・ノードへのSSH接続。物理デバイスを見つけて、それに仮想機能を追加します。
ノート: デバイス名を取得するスクリプトは、自動化の場合にのみ必要です。
この例では、デバイス上に2つのVFを作成します。
# Gets the physical device. Alterntively, just run `ip addr show` and look at the primary iface to set $PHYSDEV URL=http://169.254.169.254/opc/v1/vnics/ baseAddress=`curl -s ${URL} | jq -r '.[0] | .privateIp'` PHYSDEV=`ip -o -4 addr show | grep ${baseAddress} | awk -F: '{gsub(/^[ \t]|[ \t]$/,"",$2);split($2,out,/[ \t]+/);print out[1]}'` # Add two VFs echo "2" > /sys/class/net/${PHYSDEV}/device/sriov_numvfs # Verify the VFs ip link show ${PHYSDEV} -
OCI MACアドレスをVFに割り当てます。
これらのVFには、現在(または000)の自動生成されたMACアドレスがあります。これらのトラフィックからOCIネットワークで許可されるように、OCI MACアドレスを設定する必要があります。作成されたVFの数と同じ数のVNICアタッチメントをホストに作成します。各VNICアタッチメントのMACアドレスを書き留めます。ここでは、OCIで認識されるこれらのMACアドレスを、作成したVFSに割り当てます。
# For each MAC address from the VNIC attachments ip link set ${PHYSDEV} vf <n= 0..numVFs> mac <MAC Address from VNIC attachment> spoofchk off # verify all VFs have Mac addresses from OCI ip link show ${PHYSDEV}
これでホストの設定が完了します。これは、SR-IOVネットワーキング・リソースをポッドに提供する必要があるすべてのホストで実行する必要があるため、理想的には自動化する必要があります。
タスク2: SR-IOV CNIのインストール
このCNIは、デーモン・セットとして1.16以上のクラスタにインストールできます。SR-IOVデバイスのないノードは、デバイスプラグイン自体によって正常に処理されます。
git clone https://github.com/k8snetworkplumbingwg/sriov-cni.git && cd sriov-cni
kubectl apply -f images/k8s-v1.16/sriov-cni-daemonset.yaml && cd..
タスク3: SR-IOVネットワークデバイスプラグインのインストール
ノート: デバイスプラグインはVFをオンザフライで作成せず、別々に作成する必要があります。
デバイスプラグインは、ノード上のSR-IOV対応ネットワークデバイスを検出して通知します。これを実現するには、デバイス・プラグインでデバイス・プラグイン・エンドポイントを作成できる構成が必要です。構成は、使用されるデバイスとドライバを識別します。
-
SR-IOVリソース・プールのConfigMapを作成します。ConfigMapを設定するには、デバイスで使用されるベンダーID、デバイスIDおよびドライバを認識する必要があります。
-
ベンダーIDおよびデバイスIDを検索する手順は、次のとおりです。
lspci -nn|grep Virtual 31:02.0 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme-E Ethernet Virtual Function [14e4:16dc] 31:02.1 Ethernet controller [0200]: Broadcom Inc. and subsidiaries NetXtreme-E Ethernet Virtual Function [14e4:16dc] -
前述の例では、2つのVFがあり、最後のビット情報ではベンダーID (
14e4)とデバイスID (16dc)が示されています。これは、lspciが使用するhwdataとクロスチェックできます。cat /usr/share/hwdata/pci.ids|grep 16dc -
使用するドライバを検索するには:
# filtering based on the PCIe slots. find /sys | grep drivers.*31:02.0|awk -F/ '{print $6}' bnxt_en
-
-
ConfigMapを設定します。ConfigMapには
sriovdp-configという名前を付け、キーconfig.jsonが必要ですcat << EOF > sriovdp-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: sriovdp-config namespace: kube-system data: config.json: | { "resourceList": [{ "resourceName": "mlnx_sriov_rdma", "resourcePrefix": "mellanox.com", "selectors": { "vendors": ["15b3"], "devices": ["101e"], "drivers": ["mlx5_core"], "isRdma": false } }, { "resourceName": "netxtreme_sriov_rdma", "resourcePrefix": "broadcom.com", "selectors": { "vendors": ["14e4"], "devices": ["16dc"], "drivers": ["bnxt_en"], "isRdma": false } } ] } EOF kubectl create -f sriovdp-config.yaml -
デバイス・プラグインを設定します。構成マップを作成すると、デバイスプラグインをデーモンセットとしてインストールできます。
git clone https://github.com/k8snetworkplumbingwg/sriov-network-device-plugin.git && cd sriov-network-device-plugin kubectl create -f deployments/k8s-v1.16/sriovdp-daemonset.yaml && cd .. -
デーモンセットがデプロイされたら、コンテナ・ログでトラブルシューティングを確認できます。デプロイメントが成功すると、ノードは仮想機能を割当て可能なリソースとしてリストする必要があります。
kubectl get node <node_name> -o json | jq '.status.allocatable' { "broadcom.com/netxtreme_sriov_rdma": "2", "cpu": "128", "ephemeral-storage": "37070025462", "hugepages-1Gi": "0", "hugepages-2Mi": "0", "memory": "527632840Ki", "pods": "110" }
タスク4: メタ・プラグインCNIのインストール(複数)
Multusは、SR-IOV CNIプラグインのようなダウンストリームCNIにVF情報を提供できるメタ・プラグインで、複数のネットワーク・インタフェースを持つマルチホーム・ポッドまたはポッドを有効にしながら、ネットワーク・リソース・plumbを処理できます。
-
マルチパスのインストール:
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni kubectl apply -f images/multus-daemonset.yml && cd ..ノート:
-
stableというタグが付けられたデーモンセットで使用されるデフォルト・イメージでは、kubeletがv1.20.xである必要があります。古いクラスタにインストールする場合は、マニフェスト内のデモンセットを編集し、マルチユーザー・イメージ・タグv3.7.1を使用します。 -
このマニフェストは、
kind:NetworkAttachmentDefinitionの新しいCRDを作成し、デーモンセットを介してすべてのノード上でマルチウスバイナリを提供します。
-
-
ポッドに追加のインタフェースをアタッチするには、インタフェースをアタッチするための構成が必要です。これは、
NetworkAttachmentDefinitionタイプのカスタム・リソースにカプセル化されています。この構成は、基本的にカスタム・リソースとしてパッケージ化されたCNI構成です。サンプルNetworkAttachmentDefinitionを設定します
cat << EOF > sriov-net1.yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: name: sriov-net1 annotations: k8s.v1.cni.cncf.io/resourceName: broadcom.com/netxtreme_sriov_rdma spec: config: '{ "type": "sriov", "cniVersion": "0.3.1", "name": "sriov-network", "ipam": { "type": "host-local", "subnet": "10.20.30.0/25", "routes": [{ "dst": "0.0.0.0/0" }], "gateway": "10.20.10.1" } }' EOF kubectl apply -f sriov-net1.yaml
タスク5: 複数のインタフェースを使用したポッドのデプロイおよびテスト
-
ポッドは、注釈およびリソース・リクエストを使用して追加のインタフェースをリクエストできるようになりました。リソース・リクエストは、スケジューラがノード上のVF可用性に基づいてポッドを割り当てる際に役立ちます。注釈を使用すると、メタ・プラグイン(マルチ)は使用する
NetworkAttachmentDefinition(CNI構成)を認識できます。テスト・ポッドの例を次に示します:
## Create the first pod cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-net1 spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] resources: requests: broadcom.com/netxtreme_sriov_rdma: '1' limits: broadcom.com/netxtreme_sriov_rdma: '1' EOF ## Create a second pod cat << EOF | kubectl create -f - apiVersion: v1 kind: Pod metadata: name: testpod2 annotations: k8s.v1.cni.cncf.io/networks: sriov-net1 spec: containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ] resources: requests: broadcom.com/netxtreme_sriov_rdma: '1' limits: broadcom.com/netxtreme_sriov_rdma: '1' EOF -
2つのポッドが作成されると、両方が実行中であることがわかります。クイック・テスト:
## Verify that both pods have two interfaces. An `eth0` on the overlay and a `net1` which is the VF. kubectl exec -it testpod1 -- ip addr show kubectl exec -it testpod2 -- ip addr show ## Checkout the routes kubectl exec -it testpod1 -- route -n kubectl exec -it testpod2 -- route -n ## test communication kubectl exec -it testpod1 -- ping <IP for net1 on pod2>
関連リンク
承認
- 作成者 - Jeevan Joseph、プリンシパル・プロダクト・マネージャー
その他の学習リソース
docs.oracle.com/learnで他のラボをご覧いただくか、Oracle Learning YouTubeチャネルでより無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Configure SR-IOV interfaces for pods on OKE using Multus CNI
F75772-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.