virtio インターフェイスを搭載した L2 Pod(トランクモード)
このトピックでは、 virtio トランクモードインターフェイスを持つユーザーポッドをCloud-Native Routerのインスタンスに追加する方法を学習します。
概要
レイヤー 2 トランクモードの virtio インターフェイスを使用してユーザー Pod を設定し、Cloud-Native Router インスタンスにアタッチできます。Juniper Cloud-Native Routerには、導入時にL2インターフェイスが設定されている必要があります。大まかなタスクは次のとおりです。
-
ネットワーク アタッチメント定義(NAD)の定義と適用:NAD ファイルは、Multus が JCNR-CNI を呼び出し、ポッド インターフェイスをアタッチするネットワークを作成するために必要な設定を定義します。
-
ポッドYAMLファイルを定義し、クラウドネイティブルータークラスターに適用する—ポッドYAMLには、ポッドの仕様と、JCNR-CNIによって作成されたネットワークへのアノテーションが含まれます。
手記:NAD とポッドの YAML ファイルの詳細については、「 Cloud-Native Router のユースケースと構成の概要 」トピックを参照してください。
手記:Microsoft Azure Cloud Platform に特権モードで virtio アプリケーションポッドをデプロイする場合は、23.11 以降の DPDK バージョンでコンパイルする必要があります。DPDKアプリケーションの起動中は、次のように、Cloud-Native Routerで使用されるファブリックインターフェイスをブロックする必要があります。
./dpdk_pod_23.11 -b vmbus:000d3a9d-4df3-000d-3a9d-4df3000d3a9d
設定例
- 次に、静的 IPAM でレイヤー 2 トランクモードの virtio インターフェイスを作成する NAD の例を示します。
NAD は、ポッドのトランク インターフェイスが接続されるapiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: vswitch spec: config: '{ "cniVersion":"0.4.0", "name": "vswitch", "type": "jcnr", "args": { "instanceName": "vswitch", "instanceType": "virtual-switch", "vlanIdList":"201, 202, 203" }, "ipam": { "type": "static", "capabilities":{"ips":true}, "addresses":[ { "address":"10.2.1.1/24", "gateway":"10.2.1.253" }, { "address":"2001::10.2.1.1/120", "gateway":"2001::10.2.1.253" } ] }, "kubeConfig":"/etc/kubernetes/kubelet.conf" }'virtual-switchインスタンスの VLAN ID を定義します。 - NAD マニフェストを適用してネットワークを作成します。
kubectl apply -f nad_trunk_mode.yaml networkattachmentdefinition.k8s.cni.cncf.io/vswitch created
- NADが作成されていることを確認します。
[root@jcnr-01]# kubectl get net-attach-def NAME AGE vswitch 57s
- 以下は、
vswitchネットワークに接続されたポッドを作成するための yaml の例です。 ポッドは、apiVersion: v1 kind: Pod metadata: name: pod1 annotations: k8s.v1.cni.cncf.io/networks: vswitch spec: containers: - name: pod1 image: ubuntu:latest imagePullPolicy: IfNotPresent securityContext: privileged: false env: - name: KUBERNETES_POD_UID valueFrom: fieldRef: fieldPath: metadata.uid volumeMounts: - name: dpdk mountPath: /dpdk subPathExpr: $(KUBERNETES_POD_UID) volumes: - name: dpdk hostPath: path: /var/run/jcnr/containersk8s.v1.cni.cncf.io/networksアノテーションを使用してルーターインスタンスにアタッチされます。 - ポッド マニフェストを適用します。
[root@jcnr-01]# kubectl apply -f pod_trunk_mode.yaml pod/pod1 created
- ポッドが実行されていることを確認します。
[root@jcnr-01 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE pod1 1/1 Running 0 38s
- ポッドを記述して、セカンダリ インターフェイスが作成され、
vswitchネットワークに接続されていることを確認します。(簡潔にするために出力はトリミングされています)。[root@jcnr-01 ~]# kubectl describe pod pod1 Name: pod1 Namespace: default Priority: 0 Node: jcnr-01/10.100.20.25 Start Time: Mon, 26 Jun 2023 09:53:31 -0400 Labels: <none> Annotations: cni.projectcalico.org/containerID: ac6f0a26ebfe68adf3b020d0def96f09e6b2b5c6303f55c0dde277b1ce7f9d9f cni.projectcalico.org/podIP: 10.233.91.81/32 cni.projectcalico.org/podIPs: 10.233.91.81/32 jcnr.juniper.net/dpdk-interfaces: [ { "name": "net1", "vhost-adaptor-path": "/dpdk/vhost-net1.sock", "vhost-adaptor-mode": "client", "ipv4-address": "10.2.1.1/24", "ipv6-address": "2001::a02:101/120", "mac-address": "02:00:00:5B:C7:9F" } ] k8s.v1.cni.cncf.io/network-status: [{ "name": "k8s-pod-network", "ips": [ "10.233.91.81" ], "default": true, "dns": {} },{ "name": "default/vswitch", "interface": "net1", "ips": [ "10.2.1.1", "2001::a02:101" ], "mac": "02:00:00:5B:C7:9F", "dns": {} }] ... - vRouterで対応するインターフェイスが作成されていることを確認します。 vRouter CLI にアクセスし 、
vif --listコマンドを発行します。 インターフェイス タイプはvif0/2 PMD: vhostnet1-57f38cc0-6555-4bc2-ac MTU: 9160 Type:Virtual HWaddr:02:00:00:dc:c9:27 DDP: OFF SwLB: ON Vrf:0 Flags:L2 QOS:-1 Ref:11 RX queue errors to lcore 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Vlan Mode: Trunk Vlan: 201-203 RX packets:0 bytes:0 errors:0 TX packets:4 bytes:256 errors:0 Drops:0 TX port packets:0 errors:4Virtualで、VLAN モードはtrunkに設定され、VLAN ID は201-203に設定されていることに注意してください。L2 インターフェイスの VRF は常に 0 です。