连接微服务

内务处理

请参阅《入门指南》文档,了解如何安装和设置

  • microk8s

  • UCS Tools

    • 访问 NGC

    • 设置仓库

简介

在本教程中,我们将创建一个由两个微服务组成的 UCS 应用程序,这两个微服务能够相互通信。具体来说,我们将使用 python -m http.server 模块创建一个简单的 HTTP 服务器,并使用 curl 创建一个可以与 HTTP 服务器通信的客户端。

这将帮助您熟悉以下基础知识:

  • 使用 Ingress/Egress 端点定义微服务,以及

  • 使用 Ingress/Egress 端点定义应用程序。

使用 Ingress/Egress 端点定义微服务

让我们创建一个充当 HTTP 服务器的微服务。

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

http-server/manifest.yaml 文件的内容替换为以下内容

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

上面的规范应该与我们在之前的“Hello World”教程中定义的微服务看起来很熟悉(如果您还没有查看过,请查看!)。

您还会注意到我们添加了三个部分:

  • 一个关键字 ingress-endpoints,其中包含详细说明的几个参数:名称、描述、协议、方案、强制性和数据流

  • 一个关键字 ports,其中包含 UCS 容器组件的参数

  • 另一个类型为 ucf.k8s.service 的 UCS 组件,它将逻辑上将入口端点连接到服务

接下来,让我们创建另一个充当客户端的服务。首先,让我们创建默认的脚手架

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

将默认 manifest.yaml 文件的内容替换为以下内容

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
            "]

在这个客户端服务中,我们添加了两个部分:

  • 一个关键字 egress-endpoints,其中包含详细说明的几个参数:名称、描述、协议、方案、强制性和数据流 - 这些参数应与 ingress-endpoints 中定义的参数匹配

  • 命令 curl $egress.http.address:$egress.http.port - 在这里,我们没有硬编码 HTTP 服务器的 URL 和端口,而是可以使用微服务的各种入口/出口端点在运行时进行替换 - TODO 需要帮助理解这一点

创建应用程序:

和之前一样,让我们使用以下命令创建一个默认应用程序

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

将默认应用程序 server-client-app/app.yaml 的内容替换为以下内容

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

请注意,我们添加了 connections 部分,将 client/http 映射到 http-server/http

connections 下 - 我们可以指定微服务之间的出口/入口连接,以使它们能够相互通信。我们将在下一章中演示这一点。

对于添加到 components 部分的每个服务,用户应设置适用的参数和连接。参数必须符合该微服务的参数模式。

连接的格式为

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

构建微服务和应用程序

要分别使用 ucf_ms_builder_cliucf_app_builder_cli 构建微服务和应用程序,请执行以下操作

$ cd $HOME/ucf_tutorial/services

构建 HTTP 服务器

$ 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

构建 Curl 客户端

$ 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

构建应用程序

$ 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

太棒了!应用程序已构建。

使用 Studio 创建和构建应用程序

本节建立在 Hello World - 使用 Studio 创建和构建应用程序 之上。

启动 UCS Studio 并创建一个新图

按照 启动 UCS Studio创建新图 中的步骤操作

搜索并添加微服务

在左侧的微服务列表中搜索 http-servercurl-client 微服务,并通过拖放到画布上添加它们。现在,该图应如下所示

UCS Studio - Server Client App - Adding microservices
连接微服务

通过从 curl-client 微服务的 http 出口端点拖动到 http-server 微服务的 http 入口端点来连接端点

UCS Studio - Server Client App - Connecting microservices
保存并构建应用程序

按照 保存并构建应用程序 中的步骤生成应用程序 Helm Chart

部署和运行微服务和应用程序

接下来,让我们通过查看当前是否运行任何服务来准备运行应用程序

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

然后,要创建和运行应用程序,请运行

$ 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

检查和调试微服务和应用程序

看起来应用程序已成功部署!让我们仔细检查一下

$ 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

检查 client 的日志显示我们能够成功地向 http-server 发送 curl

$ 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>

在上面的命令中,我们正在使用 pod 的标签之一(app=curl-client-curl-client-deployment)选择 pod,该标签可以从 microk8s kubectl describe pod <pod-name> 命令中获得。

停止和清理微服务和应用程序

最后,要停止和清理应用程序,我们可以运行

$ microk8s helm3 uninstall server-client