连接微服务
内务处理
请参阅《入门指南》文档,了解如何安装和设置
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_cli
和 ucf_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-server
和curl-client
微服务,并通过拖放到画布上添加它们。现在,该图应如下所示- 连接微服务
通过从
curl-client
微服务的http
出口端点拖动到http-server
微服务的http
入口端点来连接端点- 保存并构建应用程序
按照 保存并构建应用程序 中的步骤生成应用程序 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