Testing UDP Services

In this example, we will use the kuryr-udp-demo image. This image implements a simple UDP server that listens on port 9090, and replies towards client when a packet is received.

We first create a deployment named demo:

$ kubectl create deployment  --image=yboaron/kuryr-udp-demo demo
deployment "demo" created

As the next step, we will scale the deployment to 2 pods:

$ kubectl scale deploy/demo --replicas=2
deployment "demo" scaled

At this point we should have two pods running the kuryr-udp-demo image:

$ kubectl get pods
NAME                   READY     STATUS    RESTARTS   AGE
demo-fbb89f54c-92ttl   1/1       Running   0          31s
demo-fbb89f54c-q9fq7   1/1       Running   0          1m

Next, we expose the deployment as a service, setting UDP port to 90:

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.129   <none>        443/TCP   17m

$ kubectl expose deploy/demo  --protocol UDP  --port 90 --target-port 9090
service "demo" exposed

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
demo         ClusterIP   10.0.0.150   <none>        90/UDP    16s
kubernetes   ClusterIP   10.0.0.129   <none>        443/TCP   17m

Now, let’s check the OpenStack load balancer created by Kuryr for demo service:

$ openstack loadbalancer list
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+
| id                                   | name               | project_id                       | vip_address | provisioning_status | provider |
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+
| eb5123e8-6bb5-4680-ac64-dcf25c57ced3 | default/kubernetes | fdc9ac3b36474fbf8c7ab77f4f783ec5 | 10.0.0.129  | ACTIVE              | amphora  |
| 67f19a39-dfb9-4a7a-bafe-7d6789982d91 | default/demo       | fdc9ac3b36474fbf8c7ab77f4f783ec5 | 10.0.0.150  | ACTIVE              | amphora  |
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+

$ openstack loadbalancer show default/demo
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| admin_state_up      | True                                 |
| created_at          | 2018-10-09T06:06:14                  |
| description         |                                      |
| flavor              |                                      |
| id                  | 67f19a39-dfb9-4a7a-bafe-7d6789982d91 |
| listeners           | 7b374ecf-80c4-44be-a725-9b0c3fa2d0fa |
| name                | default/demo                         |
| operating_status    | ONLINE                               |
| pools               | d549df5b-e008-49a6-8695-b6578441553e |
| project_id          | fdc9ac3b36474fbf8c7ab77f4f783ec5     |
| provider            | amphora                              |
| provisioning_status | ACTIVE                               |
| updated_at          | 2018-10-09T06:07:53                  |
| vip_address         | 10.0.0.150                           |
| vip_network_id      | eee6af72-9fbb-48b5-8e52-9f8bdf61cbab |
| vip_port_id         | ccd8be94-c65e-4bb2-afe7-44aa3d0617ea |
| vip_qos_policy_id   | None                                 |
| vip_subnet_id       | 3376291d-6c23-48cb-b6c6-37cefd57f914 |
+---------------------+--------------------------------------+

Checking the load balancer’s details, we can see that the load balancer is listening on UDP port 90:

$ openstack loadbalancer listener show 7b374ecf-80c4-44be-a725-9b0c3fa2d0fa
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| connection_limit          | -1                                   |
| created_at                | 2018-10-09T06:07:37                  |
| default_pool_id           | d549df5b-e008-49a6-8695-b6578441553e |
| default_tls_container_ref | None                                 |
| description               |                                      |
| id                        | 7b374ecf-80c4-44be-a725-9b0c3fa2d0fa |
| insert_headers            | None                                 |
| l7policies                |                                      |
| loadbalancers             | 67f19a39-dfb9-4a7a-bafe-7d6789982d91 |
| name                      | default/demo:UDP:90                  |
| operating_status          | ONLINE                               |
| project_id                | fdc9ac3b36474fbf8c7ab77f4f783ec5     |
| protocol                  | UDP                                  |
| protocol_port             | 90                                   |
| provisioning_status       | ACTIVE                               |
| sni_container_refs        | []                                   |
| timeout_client_data       | 50000                                |
| timeout_member_connect    | 5000                                 |
| timeout_member_data       | 50000                                |
| timeout_tcp_inspect       | 0                                    |
| updated_at                | 2018-10-09T06:07:53                  |
+---------------------------+--------------------------------------+

And the load balancer has two members listening on UDP port 9090:

$ openstack loadbalancer member list d549df5b-e008-49a6-8695-b6578441553e
+--------------------------------------+-----------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+
| id                                   | name                              | project_id                       | provisioning_status | address   | protocol_port | operating_status | weight |
+--------------------------------------+-----------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+
| b2c63e7b-47ed-4a6f-b8bb-acaa6742a0ad | default/demo-fbb89f54c-q9fq7:9090 | fdc9ac3b36474fbf8c7ab77f4f783ec5 | ACTIVE              | 10.0.0.74 |          9090 | ONLINE           |      1 |
| 7fa773b1-cf76-4a0b-8004-153423e59ef6 | default/demo-fbb89f54c-92ttl:9090 | fdc9ac3b36474fbf8c7ab77f4f783ec5 | ACTIVE              | 10.0.0.88 |          9090 | ONLINE           |      1 |
+--------------------------------------+-----------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+

At this point, we have both the kubernetes demo service and corresponding openstack load balancer running, and we are ready to run the client application.

For the client application we will use the udp-client python script. The UDP client script sends UDP message towards specific IP and port, and waits for a response from the server. The way that the client application can communicate with the server is by leveraging the Kubernetes service functionality.

First we clone the client script:

$ git clone https://github.com/yboaron/udp-client-script.git
Cloning into 'udp-client-script'...
remote: Enumerating objects: 15, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 15 (delta 4), reused 3 (delta 1), pack-reused 0
Unpacking objects: 100% (15/15), done.
$

And we need the UDP server service IP and port:

$ kubectl get svc demo
NAME      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
demo      ClusterIP   10.0.0.150   <none>        90/UDP    20m
$

Last step will be to ping the UDP server service:

$ python udp-client-script/client.py 10.0.0.150 90
demo-fbb89f54c-92ttl: HELLO, I AM ALIVE!!!

$ python udp-client-script/client.py 10.0.0.150 90
demo-fbb89f54c-q9fq7: HELLO, I AM ALIVE!!!

Since the kuryr-udp-demo application concatenates the pod’s name to the replyed message, it is plain to see that both service’s pods are replying to the requests from the client.