kuryr-kubernetes/doc/source/installation/testing_sctp_services.rst

210 lines
11 KiB
ReStructuredText

=====================
Testing SCTP Services
=====================
In this example, we will use the `kuryr-sctp-demo`_ image. This image
implements a SCTP server that listens on port 9090, and responds to client
when a packet is received.
We first create a deployment named sctp-demo using the deployment manifest
(deploy.yml) below:
.. code-block:: yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: sctp-demo
labels:
app: server
spec:
replicas: 2
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
spec:
containers:
- name: sctp-demo
image: tabbie/kuryr-sctp-demo:v2.1
ports:
- containerPort: 9090
.. code-block:: console
$ kubectl apply -f deploy.yml
deployment.apps/sctp-demo created
At this point we should have two pods running the `kuryr-sctp-demo`_ image:
.. code-block:: console
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sctp-demo-65fcf85ddb-8vnrq 1/1 Running 0 40s
sctp-demo-65fcf85ddb-zg7nq 1/1 Running 0 109s
Next, we expose the deployment as a service, setting SCTP port to 90:
.. note::
In order to successfully expose the deployment as a service, ensure that
the Octavia provider in use by Kuryr has SCTP support.
.. code-block:: console
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.129 <none> 443/TCP 36h
$ kubectl expose deploy/sctp-demo --protocol=SCTP --port=90 --target-port=9090
service/sctp-demo exposed
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.129 <none> 443/TCP 36h
sctp-demo ClusterIP 10.0.0.158 <none> 90/SCTP 42s
Now, let's check the OpenStack load balancer created by Kuryr for **sctp-demo**
service.
.. code-block:: console
$ openstack loadbalancer list
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+
| id | name | project_id | vip_address | provisioning_status | provider |
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+
| 4d219ac7-2592-4d33-8afa-12994c5d82ec | default/kubernetes | 2e89a9e0a50d42d1be8054a80530b836 | 10.0.0.129 | ACTIVE | amphora |
| 96b38be3-1183-41c5-a0db-d246ef1d07cb | default/sctp-demo | 2e89a9e0a50d42d1be8054a80530b836 | 10.0.0.158 | ACTIVE | amphora |
+--------------------------------------+--------------------+----------------------------------+-------------+---------------------+----------+
$ openstack loadbalancer show default/sctp-demo
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| admin_state_up | True |
| availability_zone | None |
| created_at | 2021-01-11T10:01:15 |
| description | |
| flavor_id | None |
| id | 96b38be3-1183-41c5-a0db-d246ef1d07cb |
| listeners | eda5caa0-083a-4c45-a2e5-38c243b2c970 |
| name | default/sctp-demo |
| operating_status | ONLINE |
| pools | 0935f099-d901-4f39-8090-392a527cbc35 |
| project_id | 2e89a9e0a50d42d1be8054a80530b836 |
| provider | amphora |
| provisioning_status | ACTIVE |
| updated_at | 2021-01-11T10:05:30 |
| vip_address | 10.0.0.158 |
| vip_network_id | 13190422-869c-4259-ba3b-6a41be79a671 |
| vip_port_id | 64da8e72-8469-4ac6-a0e6-ec60ca02b96a |
| vip_qos_policy_id | None |
| vip_subnet_id | 0041469e-371c-417f-83df-94ca8f202eab |
+---------------------+--------------------------------------+
Checking the load balancer's details, we can see that the load balancer is
listening on SCTP port 90:
.. code-block:: console
$ openstack loadbalancer listener show eda5caa0-083a-4c45-a2e5-38c243b2c970
+-----------------------------+--------------------------------------+
| Field | Value |
+-----------------------------+--------------------------------------+
| admin_state_up | True |
| connection_limit | -1 |
| created_at | 2021-01-11T10:04:31 |
| default_pool_id | 0935f099-d901-4f39-8090-392a527cbc35 |
| default_tls_container_ref | None |
| description | |
| id | eda5caa0-083a-4c45-a2e5-38c243b2c970 |
| insert_headers | None |
| l7policies | |
| loadbalancers | 96b38be3-1183-41c5-a0db-d246ef1d07cb |
| name | default/sctp-demo:SCTP:90 |
| operating_status | ONLINE |
| project_id | 2e89a9e0a50d42d1be8054a80530b836 |
| protocol | SCTP |
| 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 | 2021-01-11T10:05:30 |
| client_ca_tls_container_ref | None |
| client_authentication | NONE |
| client_crl_container_ref | None |
| allowed_cidrs | None |
| tls_ciphers | None |
| tls_versions | None |
| alpn_protocols | None |
+-----------------------------+--------------------------------------+
And the load balancer has a pool with two members listening on SCTP port 9090:
.. code-block:: console
$ openstack loadbalancer pool list
+--------------------------------------+---------------------------+----------------------------------+---------------------+----------+--------------+----------------+
| id | name | project_id | provisioning_status | protocol | lb_algorithm | admin_state_up |
+--------------------------------------+---------------------------+----------------------------------+---------------------+----------+--------------+----------------+
| c69a87a5-078e-4c2b-84d4-0a2691c58f07 | default/kubernetes:443 | 2e89a9e0a50d42d1be8054a80530b836 | ACTIVE | HTTPS | ROUND_ROBIN | True |
| 0935f099-d901-4f39-8090-392a527cbc35 | default/sctp-demo:SCTP:90 | 2e89a9e0a50d42d1be8054a80530b836 | ACTIVE | SCTP | ROUND_ROBIN | True |
+--------------------------------------+---------------------------+----------------------------------+---------------------+----------+--------------+----------------+
$ openstack loadbalancer member list default/sctp-demo:SCTP:90
+--------------------------------------+-----------------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+
| id | name | project_id | provisioning_status | address | protocol_port | operating_status | weight |
+--------------------------------------+-----------------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+
| abeec334-56b1-4535-a238-71424d78590e | default/sctp-demo-65fcf85ddb-zg7nq:9090 | 2e89a9e0a50d42d1be8054a80530b836 | ACTIVE | 10.0.0.75 | 9090 | NO_MONITOR | 1 |
| 826345b0-1264-421d-b9e0-8756f7bc0d21 | default/sctp-demo-65fcf85ddb-8vnrq:9090 | 2e89a9e0a50d42d1be8054a80530b836 | ACTIVE | 10.0.0.88 | 9090 | NO_MONITOR | 1 |
+--------------------------------------+-----------------------------------------+----------------------------------+---------------------+-----------+---------------+------------------+--------+
At this point, we have both the kubernetes service and corresponding OpenStack
load balancer running, and we are ready to run the client application.
For the client application we will use the `sctp_client`_ python script. The
SCTP client script sends SCTP message towards specific IP and port, and waits
for a response from the server. The client application communicates with the
server by leveraging OpenStack load balancer functionality.
For the client application to work, python SCTP module needs to be installed
in our environment. We need a SCTP-aware kernel (most are). First we install
the following packages: libsctp-dev, libsctp1, lksctp-tools and then install
the module.
.. code-block:: console
$ sudo apt-get install libsctp-dev libsctp1 lksctp-tools
$ pip3 install pysctp
And we need the SCTP server service IP and port:
.. code-block:: console
$ kubectl get svc sctp-demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sctp-demo ClusterIP 10.0.0.158 <none> 90/SCTP 67m
Last step will be to connect to the SCTP server service:
.. code-block:: console
$ python3 sctp_client.py 10.0.0.158 90
Sending Message
sctp-demo-65fcf85ddb-zg7nq: HELLO, I AM ALIVE!!!
$ python3 sctp_client.py 10.0.0.158 90
Sending Message
sctp-demo-65fcf85ddb-8vnrq: HELLO, I AM ALIVE!!!
.. _kuryr-sctp-demo: https://hub.docker.com/repository/docker/tabbie/kuryr-sctp-demo
.. _sctp_client: https://github.com/openstack/kuryr-kubernetes/blob/master/contrib/sctp_client.py