Title: Connecting Microservices — UCS Tools Documentation

URL Source: https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html

Published Time: Thu, 30 Oct 2025 07:23:04 GMT

Markdown Content:
Connecting Microservices[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#connecting-microservices "Link to this heading")
---------------------------------------------------------------------------------------------------------------------------------------------------------------

Housekeeping[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#housekeeping "Link to this heading")
---------------------------------------------------------------------------------------------------------------------------------------

See the Getting Started documentation for installing and setting up:

*   microk8s

*   UCS Tools

    *   accessing NGC

    *   setting up repositories

Introduction[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#introduction "Link to this heading")
---------------------------------------------------------------------------------------------------------------------------------------

In this tutorial, you will create a UCS Application composed of two microservices that can talk to each other. Specifically, you will create a simple HTTP server using the `python -m http.server` module and a client that can communicate with the HTTP server using `curl`.

This tutorial helps you learn the basics of:

*   defining microservices using Ingress/Egress Endpoints, and

*   defining applications using Ingress/Egress Endpoints.

Defining Microservices using Ingress/Egress Endpoints[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#defining-microservices-using-ingress-egress-endpoints "Link to this heading")
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

First, create a microservice that will act as an HTTP server:

$ cd $HOME/ucf_tutorial/services
$ ucf_ms_builder_cli service create -n http-server -i container-image

Replace the contents of the `http-server/manifest.yaml` file with the following:

type: msapplication
specVersion: 2.5.0
name: ucf.svc.http-server
chartName: http-server
description: http server
version: 0.0.1
tags: []
keywords: []
publish: false
ingress-endpoints:
 - name: http
 description: REST API endpoint
 protocol: TCP
 scheme: http
 mandatory: False
 data-flow: in-out

---
spec:
 - name: http-server-deployment
 type: ucf.k8s.app.deployment
 parameters:
 apptype: stateless

 - name: http-server-container
 type: ucf.k8s.container
 parameters:
 image:
 repository: nvcr.io/nvidia/pytorch
 tag: 22.04-py3
 command: [sh, -c]
 args: [
 "python -m http.server 8080
 "]
 ports:
 - containerPort: 8080
 name: http
 - name: svc
 type: ucf.k8s.service
 parameters:
 ports:
 - port: 8080
 protocol: TCP
 name: http

The above specification should look familiar to the microservice you defined in the previous “Hello World” tutorial (check that out if you haven’t already!).

You will also notice three additions:

*   A keyword `ingress-endpoints` with several parameters detailing: name, description, protocol, scheme, mandatory, and data-flow

*   A keyword `ports` with parameters to the UCS Container Component

*   Another UCS Component of type `ucf.k8s.service` that will logically connect the ingress endpoint to a service

Next, create another service that will act as a client. First, create the default scaffolding:

$ ucf_ms_builder_cli service create -n curl-client -i container-image

Replace the content of the default `manifest.yaml` file with the following:

type: msapplication
specVersion: 2.5.0
name: ucf.svc.curl-client
chartName: curl-client
description: Curl Client
version: 0.0.1
tags: []
keywords: []
publish: false

egress-endpoints:
 - name: http
 description: REST API endpoint
 protocol: TCP
 scheme: http
 mandatory: False
 data-flow: in-out

---
spec:
 - name: curl-client-deployment
 type: ucf.k8s.app.deployment
 parameters:
 apptype: stateless

 - name: curl-client-container
 type: ucf.k8s.container
 parameters:
 image:
 repository: nvcr.io/nvidia/pytorch
 tag: 22.04-py3
 command: [sh, -c]
 args: [
 "sleep 10 && curl $egress.http.address:$egress.http.port && sleep 10000
 "]

In this client service, you have two additions:

*   A keyword `egress-endpoints` with several parameters detailing: name, description, protocol, scheme, mandatory, and data-flow - these should match those defined in the `ingress-endpoints`

*   The command `curl $egress.http.address:$egress.http.port` - where instead of hardcoding the URL and port of your HTTP server, you can use various ingress/egress endpoints of the microservices at runtime and replace them with the actual values

Creating the Application:[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#creating-the-application "Link to this heading")
----------------------------------------------------------------------------------------------------------------------------------------------------------------

Just like before, create a default app using:

$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app create server-client-app

Replace the content of the default application `server-client-app/app.yaml` with the following:

specVersion: 2.5.0
version: 0.0.1
doc: README.md
name: server-client-app
description: Server Client Application

dependencies:
- ucf.svc.curl-client:0.0.1
- ucf.svc.http-server:0.0.1

components:
- name: client
 type: ucf.svc.curl-client

- name: http-server
 type: ucf.svc.http-server

connections:
 client/http: http-server/http

Note that you have added a `connections` section mapping `client/http` to `http-server/http`.

Under `connections` - you can specify Egress/Ingress connections between microservices to enable them to talk to each other.

For each service added to the components section, you should set the applicable parameters and connections. The parameters must comply with the parameter schema for that microservice.

The connections are in the format:

<egress-endpoint-component-name>/<egress-endpoint-name>: <ingress-endpoint-component-name>/<ingress-endpoint-name>

Building Microservices and Applications[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#building-microservices-and-applications "Link to this heading")
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

To build the microservices and application using `ucf_ms_builder_cli` and `ucf_app_builder_cli` respectively:

$ cd $HOME/ucf_tutorial/services

Building HTTP server:

$ ucf_ms_builder_cli service build -d http-server
2022-12-05 15:33:17,584 - Registry - INFO - Building: http-server
2022-12-05 15:33:19,137 - MsBuilder - INFO - Helm chart generated in http-server/output/helm
2022-12-05 15:33:19,149 - MsBuilder - INFO - MS spec generated in http-server/output/msspec
2022-12-05 15:33:19,520 - MsBuilder - WARNING - Mandatory compliance checks failed. Check http-server/output/compliance_test_logs.txt for more information
2022-12-05 15:33:19,633 - MsBuilder - INFO - MS spec generated in http-server/output/msspec
2022-12-05 15:33:19,637 - MsBuilder - INFO - Tests generated in http-server/output/tests
2022-12-05 15:33:19,682 - Registry - INFO - Generating service helm chart package...
2022-12-05 15:33:20,434 - MsBuilder - INFO - Added microservice 'ucf.svc.http-server:0.0.1' to local repository

Building Curl Client:

$ ucf_ms_builder_cli service build -d curl-client/
2022-12-05 15:33:25,651 - Registry - INFO - Building: curl-client/
2022-12-05 15:33:27,218 - MsBuilder - INFO - Helm chart generated in curl-client/output/helm
2022-12-05 15:33:27,231 - MsBuilder - INFO - MS spec generated in curl-client/output/msspec
2022-12-05 15:33:27,710 - MsBuilder - WARNING - Mandatory compliance checks failed. Check curl-client/output/compliance_test_logs.txt for more information
2022-12-05 15:33:27,820 - MsBuilder - INFO - MS spec generated in curl-client/output/msspec
2022-12-05 15:33:27,824 - MsBuilder - INFO - Tests generated in curl-client/output/tests
2022-12-05 15:33:27,873 - Registry - INFO - Generating service helm chart package...
2022-12-05 15:33:28,037 - MsBuilder - INFO - Added microservice 'ucf.svc.curl-client:0.0.1' to local repository

Building Application:

$ cd $HOME/ucf_tutorial/apps
$ ucf_app_builder_cli app build server-client-app/
2022-12-05 15:36:34,746 - AppBuilder - INFO - Syncing any missing service versions to cache...
2022-12-05 15:36:34,747 - AppBuilder - INFO - Validating application ...
2022-12-05 15:36:34,751 - AppBuilder - INFO - Building application server-client-app-0.0.1 ...
2022-12-05 15:36:35,257 - AppBuilder - INFO - Application compliance report generated at server-client-app/server-client-app-0.0.1/compliance_report.json
2022-12-05 15:36:35,258 - AppBuilder - INFO - Application Helm Chart generated in server-client-app/server-client-app-0.0.1
2022-12-05 15:36:35,258 - AppBuilder - INFO - App built

Great! The application is built.

Creating and Building Application using Studio[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#creating-and-building-application-using-studio "Link to this heading")
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

This section builds on top of [Hello World - Creating and Building Application using Studio](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/01_Hello_World.html#create-build-app-01).

1.   Launch UCS Studio and create a new graph. Follow steps in [Launch UCS Studio](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#launch-studio) and [Create New Graph](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#create-new-graph).

2.   Search and Add Microservices. Search for `http-server` and `curl-client` microservices in the microservice list to the left and add them by drag-dropping them to the canvas. The graph should now look as below:

> ![Image 1: UCS Studio - Server Client App - Adding microservices](https://docs.nvidia.com/ucf/2.10.0/_images/ucf_studio_server_client_app_add_ms.jpg)

1.   Connecting microservices - Connect the endpoints by dragging from the `http`**egress** endpoint of the `curl-client` microservice to the `http`**ingress** endpoint of the `http-server` microservice.

> ![Image 2: UCS Studio - Server Client App - Connecting microservices](https://docs.nvidia.com/ucf/2.10.0/_images/ucf_studio_server_client_app_connect_ms.gif)

1.   Save and Build the App. Follow steps in [Save and Build the Application](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#save-build-app) to generate the application helm chart:

Deploying and Running Microservices and Application[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#deploying-and-running-microservices-and-application "Link to this heading")
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Next, prepare to run the application by checking if there are any services currently running:

$ microk8s kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 13d

To then create and run the application, run:

$ microk8s helm3 install server-client server-client-app/server-client-app-0.0.1/
NAME: server-client
LAST DEPLOYED: Tue Nov 29 13:22:49 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

Inspecting and Debugging Microservices and Applications[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#inspecting-and-debugging-microservices-and-applications "Link to this heading")
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

It appears that the application successfully deployed! Double check:

$ microk8s kubectl get all
NAME READY STATUS RESTARTS AGE
pod/http-server-http-server-deployment-589f99cf99-5wb4g 1/1 Running 0 5m21s
pod/curl-client-curl-client-deployment-64b485b4f7-klsvg 1/1 Running 0 5m21s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/http-server-http-server-deployment-svc ClusterIP 10.152.183.232 <none> 8080/TCP 3m19s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/http-server-http-server-deployment 0/1 1 0 3m19s
deployment.apps/curl-client-curl-client-deployment 0/1 1 0 3m19s

NAME DESIRED CURRENT READY AGE
replicaset.apps/http-server-http-server-deployment-589f99cf99 1 1 0 3m19s
replicaset.apps/curl-client-curl-client-deployment-64b485b4f7 1 1 0 3m19s

Examining the logs of the `client` shows you were able to successfully send a curl to the `http-server`:

$ microk8s kubectl logs --tail -1 -l "app=curl-client-curl-client-deployment"
 % Total % Received % Xferd Average Speed Time Time Time Current
 Dload Upload Total Spent Left Speed
100 594 100 594 0 0 145k 0 --:--:-- --:--:-- --:--:-- 145k
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
</head>
<body>
<h1>Directory listing for /</h1>
<hr>
<ul>
<li><a href="docker-examples/">docker-examples/</a></li>
<li><a href="examples/">examples/</a></li>
<li><a href="NVIDIA_Deep_Learning_Container_License.pdf">NVIDIA_Deep_Learning_Container_License.pdf</a></li>
<li><a href="README.md">README.md</a></li>
<li><a href="tutorials/">tutorials/</a></li>
</ul>
<hr>
</body>
</html>

In the above command, you are selecting the pod using one of its labels (`app=curl-client-curl-client-deployment`) which you can obtain from the `microk8s kubectl describe pod <pod-name>` command.

Stopping and Cleaning up Microservices and Applications[#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#stopping-and-cleaning-up-microservices-and-applications "Link to this heading")
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Finally, to stop and clean up the application run:

$ microk8s helm3 uninstall server-client

Links/Buttons:
- [#](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/02_Connecting_Microservices.html#stopping-and-cleaning-up-microservices-and-applications)
- [Hello World - Creating and Building Application using Studio](https://docs.nvidia.com/ucf/2.10.0/text/tutorials/01_Hello_World.html#create-build-app-01)
- [Launch UCS Studio](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#launch-studio)
- [Create New Graph](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#create-new-graph)
- [Save and Build the Application](https://docs.nvidia.com/ucf/2.10.0/text/UCS_Reference_Apps.html#save-build-app)
