--- title: "Test multicast traffic in K8s" slug: "test-xnic-with-k8s" updated: 2025-12-19T20:10:43Z published: 2025-12-19T20:10:43Z canonical: "docs.swxtch.io/test-xnic-with-k8s" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.swxtch.io/llms.txt > Use this file to discover all available pages before exploring further. # Test multicast traffic in K8s **WHAT TO EXPECT** Before running the desired application in the cloud, it is a good idea to test with swXtch.io's provided tools/examples. **In this article**, users will learn how to test xNIC with K8s. Please complete the installation process outlined in [Install xNIC Daemonset on K8s Cluster](/v2/docs/install-xnic-on-k8s-cluster) before testing. ### Prerequisites For this test to work, a user should have at least two nodes, and each node must be in a different pod. ### STEP ONE: Create A Consumer 1. Create a **TestConsumer.yaml** file using the example below. Replace the *AAA.BBB.CCC.DDD* in the section **SWXTCH_CONTROL_ADDRESS** and the **image:** value, with the cloudSwXtch control IP address. ```yaml apiVersion: v1 kind: Pod metadata:  name: consumer-a  labels:    app: consumer-a spec:  affinity:    podAntiAffinity:      requiredDuringSchedulingIgnoredDuringExecution:      - labelSelector:          matchExpressions:          - key: app            operator: In            values:            - producer-a            - consumer-b        topologyKey: kubernetes.io/hostname  containers:  - name: consumer-a    securityContext:      privileged: true    image: AAA.BBB.CCC.DDD:443/xnicv2:sha-3b0a471    imagePullPolicy: Always    env:    - name: SWXTCH_CONTROL_ADDRESS      value: "AAA.BBB.CCC.DDD"    - name: IS_DAEMON      value: "false"    - name: PERF_TYPE      value: "consumer"    - name: PERF_NIC      value: "eth0"    - name: PERF_MCGIP      value: "239.0.0.10"    - name: PERF_MCGPORT      value: "8410"    - name: PERF_PPS      value: ""    - name: AIRGAP      value: "true" ``` > [!NOTE] > **PLEASE NOTE** > > If the user needs to use `hostNetwork: true` (under **spec:**) so the Pod sees the actual physical network interfaces of the AWS node, then the line with PERF_NIC must have the correct interface name. For example, on AWS that is `ens5` on most common families. > > If the YAML file does not have `hostNetwork: true`, the standar interface name is `eth0`. #### STEP TWO: Create a Producer 1. Create a **TestProducer.yaml** file using the example below. Replace the *AAA.BBB.CCC.DDD* in the section **SWXTCH_CONTROL_ADDRESS** and the **image:** value, with the cloudSwXtch control IP address. Shell ```yaml apiVersion: v1 kind: Pod metadata:  name: producer-a  labels:    app: producer-a spec:  affinity:    podAntiAffinity:      requiredDuringSchedulingIgnoredDuringExecution:      - labelSelector:          matchExpressions:          - key: app            operator: In            values:            - consumer-a            - producer-b        topologyKey: kubernetes.io/hostname  containers:  - name: producer-a    securityContext:      privileged: true    image: AAA.BBB.CCC.DDD:443/xnicv2:sha-3b0a471    imagePullPolicy: Always    env:    - name: SWXTCH_CONTROL_ADDRESS      value: "AAA.BBB.CCC.DDD"    - name: IS_DAEMON      value: "false"    - name: PERF_TYPE      value: "producer"    - name: PERF_NIC      value: "eth0"    - name: PERF_MCGIP      value: "239.0.0.10"    - name: PERF_MCGPORT      value: "8410"    - name: PERF_PPS      value: "100"    - name: AIRGAP      value: "true" ``` #### STEP THREE: Run Test - Deploy the producer pod by running this command in a shell connected to the Kubernetes cluster. Shell ```shell kubectl create -f TestProducer.yaml ``` - Deploy the consumer pod by running this command in a shell connected to the Kubernetes cluster. ```shell kubectl create -f TestConsumer.yaml ``` Validate they are running using this command: ```shell kubectl get pods -o wide -A ``` Below is an example in Azure showing the **consumer-a** and **producer-a** running: ```shell $ kubectl get pods -o wide -A NAMESPACE     NAME                              READY   STATUS    RESTARTS   AGE     IP                NODE                              NOMINATED NODE   READINESS GATES default       consumer-a                        1/1     Running   0          26m     192.168.80.114    ip-192-168-93-187.ec2.internal               default       producer-a                        1/1     Running   0          25m     192.168.105.153   ip-192-168-100-230.ec2.internal             kube-system   aws-node-fgjrq                    2/2     Running   0          7h30m   192.168.100.230   ip-192-168-100-230.ec2.internal             kube-system   aws-node-sjsb7                    2/2     Running   0          7h30m   192.168.93.187    ip-192-168-93-187.ec2.internal               kube-system   coredns-6b9575c64c-2kgvd          1/1     Running   0          7h34m   192.168.117.26    ip-192-168-100-230.ec2.internal             kube-system   coredns-6b9575c64c-t4f9v          1/1     Running   0          7h34m   192.168.113.184   ip-192-168-100-230.ec2.internal             kube-system   kube-proxy-8x2m2                  1/1     Running   0          7h30m   192.168.100.230   ip-192-168-100-230.ec2.internal             kube-system   kube-proxy-svtpx                  1/1     Running   0          7h30m   192.168.93.187    ip-192-168-93-187.ec2.internal               kube-system   metrics-server-86dfffd966-74t8s   1/1     Running   0          7h29m   192.168.86.205    ip-192-168-93-187.ec2.internal               kube-system   metrics-server-86dfffd966-82xjw   1/1     Running   0          7h29m   192.168.125.9     ip-192-168-100-230.ec2.internal             kube-system   swx-xnic-5qfsg                    1/1     Running   0          5h5m    192.168.93.187    ip-192-168-93-187.ec2.internal               kube-system   swx-xnic-s66zg                    1/1     Running   0          5h5m    192.168.100.230   ip-192-168-100-230.ec2.internal             ``` #### Step Four: Validate The Test Is Running Users can validate it is working by viewing logs with these commands: #### Producer ```shell kubectl logs pods/producer-a -f ``` The console will show something similar to: ```shell $ kubectl logs pods/producer-a -f  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed 100 88391    0 88391    0     0  24.9M      0 --:--:-- --:--:-- --:--:-- 28.0M ===== Downloading swx-tools package =====  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed 100 5953k  100 5953k    0     0   518M      0 --:--:-- --:--:-- --:--:--  528M ===== Starting swx-perf application ===== Selected Mode: Producer Config:        Sending traffic.        Ip Address: 239.0.0.10 - Port: 8410        Interface IP Address: 192.168.89.216        Running without a total packet counter limit        Running the application without a timing limit |------------------------------------------------------------------------------------| |                  TX TOTALS                 |             TX THIS PERIOD            | |--------------------------------------------|---------------------------------------| |      PKTS     |    BYTES   |     MISSING   |     PPS   |    BPS    |    MISSING    | |---------------|------------|---------------|-----------|-----------|---------------| |             1 |        100 |             0 |         0 |         0 |             0 | |           102 |     10.19K |             0 |       100 |     80.3K |             0 | |           202 |     20.19K |             0 |        99 |     79.3K |             0 | |           303 |     30.29K |             0 |       100 |     80.0K |             0 | |           404 |     40.39K |             0 |       100 |     80.1K |             0 | |           504 |     50.39K |             0 |       100 |     79.8K |             0 | |           605 |     60.50K |             0 |       100 |     80.0K |             0 | |           705 |     70.50K |             0 |       100 |     79.8K |             0 | |           806 |     80.59K |             0 |       100 |     80.2K |             0 | |           906 |     90.59K |             0 |        99 |     79.2K |             0 | |         1,006 |       100K |             0 |       100 |     79.9K |             0 | |         1,106 |       110K |             0 |       100 |     79.8K |             0 | |         1,207 |       120K |             0 |       100 |     80.0K |             0 | |         1,308 |       130K |             0 |       100 |     80.1K |             0 | |         1,408 |       140K |             0 |        99 |     79.4K |             0 | |         1,509 |       150K |             0 |       100 |     80.0K |             0 | |------------------------------------------------------------------------------------| ``` That shows the producer sending the multicast stream correctly. #### Consumer Then, for the consumer: ```shell kubectl logs pods/consumer-a -f ``` It will show something similar to: ```shell $ kubectl logs pods/consumer-a -f  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed 100 88391    0 88391    0     0  24.6M      0 --:--:-- --:--:-- --:--:-- 28.0M ===== Downloading swx-tools package =====  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed 100 5953k  100 5953k    0     0   445M      0 --:--:-- --:--:-- --:--:--  447M ===== Starting swx-perf application ===== Selected Mode: Consumer Config:        Waiting traffic        Ip Address: 239.0.0.10 - Port: 8410        Interface IP Address: 192.168.122.121        Running without a total packet counter limit        Running the application without a timing limit |-------------------------------------------------------------------------------------------------------| |                   RX TOTALS                   |                     RX THIS PERIOD                    | |-----------------------------------------------|-------------------------------------------------------| |      PKTS     |       OOO     |    MISSING    |       OOO     |    MISSING    |    PPS    |    BPS    | |---------------|---------------|---------------|---------------|---------------|-----------|-----------| |             0 |             0 |             0 |             0 |             0 |         0 |         0 | |             0 |             0 |             0 |             0 |             0 |         0 |         0 | |            74 |             0 |             0 |             0 |             0 |        74 |     58.8K | |           175 |             0 |             0 |             0 |             0 |       100 |     80.2K | |           275 |             0 |             0 |             0 |             0 |        99 |     79.5K | |           376 |             0 |             0 |             0 |             0 |       100 |     80.2K | |           477 |             0 |             0 |             0 |             0 |       100 |     80.2K | |           577 |             0 |             0 |             0 |             0 |        99 |     79.5K | |           678 |             0 |             0 |             0 |             0 |       100 |     80.2K | |           778 |             0 |             0 |             0 |             0 |        99 |     79.4K | |           879 |             0 |             0 |             0 |             0 |       100 |     80.2K | |           979 |             0 |             0 |             0 |             0 |        99 |     79.4K | |         1,080 |             0 |             0 |             0 |             0 |       100 |     80.2K | |         1,180 |             0 |             0 |             0 |             0 |        99 |     79.4K | |         1,281 |             0 |             0 |             0 |             0 |       100 |     80.2K | |         1,381 |             0 |             0 |             0 |             0 |       100 |     79.8K | |-------------------------------------------------------------------------------------------------------| ``` That shows the consumer receiving the multicast stream. #### Using the UI Alternatively, users can see the UI of the cloudSwXtch like swx-top or . For example, looking at the terminal UI executing: ```shell swx-top ``` swx-top should show the traffic of the producer (TX) and the consumer (RX). ```plaintext ┌─────────────────────────────────────────────────────────────────────────────── Information - dev [ + ] ──────────────────────────────────────────────────────────────────────────────┐ │ip-172-31-25-167  | Status  OK     NEW NOTIFICATIONS                                                                                                                                  │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ╔═══════════════════════════════════════════════════════════════════════════════════ Components (4) ═══════════════════════════════════════════════════════════════════════════════════╗ ║Filter                                   Class   X                                                                                                                                    ║ ║--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------║ ║[+] Name                                 Class     Type  Rx (bps)    Rx (pps)    Tx (bps)    Tx (pps)    Primary IP       OS               Version          Primary Swxtches          ║ ║      ip-172-31-25-167                   swXtch    X1    153.3K      100         153.3K      100         172.31.25.167    Ubuntu 24.04     v4.1.0           --                        ║ ║      ip-192-168-93-187.ec2.internal     xNIC      2     153.3K      100         0           0           192.168.93.187   Ubuntu 24.04     v4.1.0           ip-172-31-25-167          ║ ║      ip-192-168-100-230.ec2.internal    xNIC      2     0           0           153.4K      100         192.168.100.230  Ubuntu 24.04     v4.1.0           ip-172-31-25-167          ║ ║      192.168.105.153                    VM        --    0           0           152.1K      99          192.168.105.153  --               --               --                        ║ ║                                                                                                                                                                                      ║ ║                                                                                                                                                                                      ║ ║                                                                                                                                                                                      ║ ╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ ┌──────────────────────────────────────────────────────────────────────────── Interfaces  ip-172-31-25-167 ────────────────────────────────────────────────────────────────────────────┐ │[+] Name                                 Index  Ip               SubnetPrefix         Public Ip        MTU     Driver        PciAddress                                               │ │      dpdk-0                             0      172.31.31.37     172.31.16.0/20       --               --      igb_uio       0000:00:06.0                                             │ │      ens5                               2      172.31.25.167    172.31.16.0/20       --               9001    ena           0000:00:05.0                                             │ │                                                                                                                                                                                      │ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ Views │           Adaptors                       Notifications                       Components                       Streams                                     │ Colors      Help ``` #### Step Five: Cleaning the Pods 1. Stop the test consumer by running this command in the CloudShell window: 1. R Run: ```shell kubectl delete -f TestConsumer.yaml ``` 2. swx-top should no longer show the consumer. Additionally, running **kubectl get pods -o wide** should now show just the test consumer, as shown below (the consumer is being terminated): ```shell $ kubectl get pods -o wide -A NAME                READY   STATUS        RESTARTS   AGE   IP            NODE                                NOMINATED NODE   READINESS GATES consumer-a          1/1     Terminating   0          15m   10.0.1.91     aks-nodepool1-23351669-vmss000006             producer-a          1/1     Running       0          15m   10.0.1.90     aks-nodepool1-23351669-vmss000005             swxtch-xnic-46qgg   1/1     Running       0          39m   10.2.128.96   aks-nodepool1-23351669-vmss000005             swxtch-xnic-szdk7   1/1     Running       0          40m   10.2.128.95   aks-nodepool1-23351669-vmss000004             ``` 2. Stop the test producer by running this command in the CloudShell window. 1. R Run: ```shell kubectl delete -f TestProducer.yaml ``` 2. swx-top should no longer show the producer. This may take a minute to display. Additionally, running **kubectl get pods -o wide** should now show just the test producer as shown below: ```shell donna@Azure:~$ kubectl get pods -o wide -A NAME                READY   STATUS        RESTARTS   AGE   IP            NODE                                NOMINATED NODE   READINESS GATES producer-a          1/1     Terminating   0          15m   10.0.1.90     aks-nodepool1-23351669-vmss000005             swxtch-xnic-46qgg   1/1     Running       0          42m   10.2.128.96   aks-nodepool1-23351669-vmss000005             swxtch-xnic-szdk7   1/1     Running       0          42m   10.2.128.95   aks-nodepool1-23351669-vmss000004             ``` Now that the system is validated using swXtch.io tools, the user can test with his K8s application.