---
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    <none>           <none>
default       producer-a                        1/1     Running   0          25m     192.168.105.153   ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   aws-node-fgjrq                    2/2     Running   0          7h30m   192.168.100.230   ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   aws-node-sjsb7                    2/2     Running   0          7h30m   192.168.93.187    ip-192-168-93-187.ec2.internal    <none>           <none>
kube-system   coredns-6b9575c64c-2kgvd          1/1     Running   0          7h34m   192.168.117.26    ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   coredns-6b9575c64c-t4f9v          1/1     Running   0          7h34m   192.168.113.184   ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   kube-proxy-8x2m2                  1/1     Running   0          7h30m   192.168.100.230   ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   kube-proxy-svtpx                  1/1     Running   0          7h30m   192.168.93.187    ip-192-168-93-187.ec2.internal    <none>           <none>
kube-system   metrics-server-86dfffd966-74t8s   1/1     Running   0          7h29m   192.168.86.205    ip-192-168-93-187.ec2.internal    <none>           <none>
kube-system   metrics-server-86dfffd966-82xjw   1/1     Running   0          7h29m   192.168.125.9     ip-192-168-100-230.ec2.internal   <none>           <none>
kube-system   swx-xnic-5qfsg                    1/1     Running   0          5h5m    192.168.93.187    ip-192-168-93-187.ec2.internal    <none>           <none>
kube-system   swx-xnic-s66zg                    1/1     Running   0          5h5m    192.168.100.230   ip-192-168-100-230.ec2.internal   <none>           <none>
```

#### 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   <none>           <none>
producer-a          1/1     Running       0          15m   10.0.1.90     aks-nodepool1-23351669-vmss000005   <none>           <none>
swxtch-xnic-46qgg   1/1     Running       0          39m   10.2.128.96   aks-nodepool1-23351669-vmss000005   <none>           <none>
swxtch-xnic-szdk7   1/1     Running       0          40m   10.2.128.95   aks-nodepool1-23351669-vmss000004   <none>           <none>
```
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   <none>           <none>
swxtch-xnic-46qgg   1/1     Running       0          42m   10.2.128.96   aks-nodepool1-23351669-vmss000005   <none>           <none>
swxtch-xnic-szdk7   1/1     Running       0          42m   10.2.128.95   aks-nodepool1-23351669-vmss000004   <none>           <none>
```

Now that the system is validated using swXtch.io tools, the user can test with his K8s application.
