210 lines
11 KiB
ReStructuredText
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
|