Skip to content

UCP Client‐Server Example on Kubernetes Cluster

Raul Akhmetshin edited this page Apr 22, 2024 · 2 revisions

The page describes a deployment of UCP client-server example on a Kubernetes cluster.
You need to setup Kubernetes first. The setup guide can be found here.

UCP Client-Server Example Image

We will need an image to make the deployment. This is an example of the dockerfile to create the image with UCX library and UCP client-server example.
centos7-ucp-client-server.dockerfile

FROM centos:7
RUN yum install -y \
    autoconf \
    automake \
    gcc-c++ \
    git \
    libtool \
    make
RUN git clone --depth 1 --branch v1.16.0 https://github.com/openucx/ucx.git
WORKDIR /ucx/
RUN ./autogen.sh
WORKDIR /ucx/build
RUN ../contrib/configure-release --prefix=$PWD/../install
RUN make -j install
ENV PATH="${PATH}:/ucx/install/bin"
ENV LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:/ucx/install/lib"
ENV C_INCLUDE_PATH="${C_INCLUDE_PATH}:/ucx/install/include"
ENV LIBRARY_PATH="${LIBRARY_PATH}:/ucx/install/lib"
WORKDIR /ucx
RUN gcc examples/ucp_client_server.c -lucp -lucs -o /ucx/install/bin/ucp_client_server

We will use the image based on this dockerfile, with tag images/centos7-ucp-client-server. This is the command line to build the image.

$ docker build -t images/centos7-ucp-client-server - < centos7-ucp-client-server.dockerfile

Please do not forget to push the image to the registry you are using if you want to use the image. E.g. if you use minikube, you can load image locally using the following command.

$ minikube image load images/centos7-ucp-client-server

UCP Server Deployment

The server part is created as a deployment.
ucp-server-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ucp-server-deployment
  labels:
    app: ucp-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ucp-server
  template:
    metadata:
      labels:
        app: ucp-server
    spec:
      containers:
      - name: centos7-ucp-client-server
        image: images/centos7-ucp-client-server
        imagePullPolicy: Never
        command: ["ucp_client_server"]
        args: ["-p", "13579"]
      restartPolicy: Always

We use the image created in the previous section: image: images/centos7-ucp-client-server. The imagePullPolicy: Never should be used only if the image is presented locally. See this page for more details. The deployment can be created using the following command.

$ kubectl apply -f ucp-server-deployment.yml
deployment.apps/ucp-server-deployment created

Run the following command to check the deployment is ready.

$ kubectl get deployment ucp-server-deployment
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
ucp-server-deployment   1/1     1            1           15s

The output can be checked using Kubernetes command-line tool. We need to get Pod name created by the deployment.

$ kubectl get pods -l app=ucp-server
NAME                                    READY   STATUS    RESTARTS   AGE
ucp-server-deployment-6d668586c-cbh2n   1/1     Running   0          6m17s

We use selector app=ucp-server to dump the information only about the pod created by the deployment. We can use the name to dump the logs.

$ kubectl logs ucp-server-deployment-6d668586c-cbh2n
server is listening on IP 0.0.0.0 port 13579

Note that the server is listening on the port set in the deployment ucp-server-deployment.yml.

UCP Server Service

The deployment can create and destroy Pods dynamically to run your application. We need to create a service to have a permanent address to the server side, so that clients can interact with it.

apiVersion: v1
kind: Service
metadata:
  name: ucp-server-svc
spec:
  selector:
    app: ucp-server
  ports:
    - port: 13579
      targetPort: 13579

We use the selector app: ucp-server to set the service to the our previously created deployment. The port is the same as we set in the ucp-server-deployment.yml. The service can be created with the same command as we use for the deployment creation.

$ kubectl apply -f ucp-server-svc.yml

The address can be found using the following command.

$ kubectl get svc ucp-server-svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)     AGE
ucp-server-svc   ClusterIP   10.103.162.136   <none>        13579/TCP   3m47s

UCP Client Pod

We can start the client part as a pod. We use the address and the port of the service ucp-server-svc.yml. The container configuration is the same as for the deployment. ucp-client-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: ucp-client-pod
spec:
  containers:
  - name: centos7-ucp-client-server
    image: images/centos7-ucp-client-server
    imagePullPolicy: Never
    command: ["ucp_client_server"]
    args: ["-a", "10.103.162.136", "-p", "13579"]

Use the following command to create the pod.

$ kubectl apply -f ucp-client-pod.yml

Check the output of the application.

$ kubectl logs ucp-client-pod
Client: iteration #1


------------------------------

ABCDEFGHIJKLMNO.


------------------------------

received FIN message

Debug UCX Library

We can set environment variable to debug UCX library.

$ kubectl set env deployment/ucp-server-deployment UCX_LOG_LEVEL=debug

The command will terminate existing pod, and create the new one. We use env to set the environment variable for the client side. ucp-client-debug-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: ucp-client-debug-pod
spec:
  containers:
  - name: centos7-ucp-client-server
    image: images/centos7-ucp-client-server
    imagePullPolicy: Never
    command: ["ucp_client_server"]
    args: ["-a", "10.103.162.136", "-p", "13579"]
    env:
    - name: UCX_LOG_LEVEL
      value: debug

The rest is the same as ucp-client-pod.yml. The command line is also almost the same.

kubectl apply -f ucp-client-debug-pod.yml

Use the commands from the previous sections to check that the output of the application contains UCX library debug information.

Clone this wiki locally