From 364ec04ded8f0ceeaf65ec36d33da9ed3dfe0f92 Mon Sep 17 00:00:00 2001 From: TeslaZhao Date: Tue, 15 Mar 2022 09:58:21 +0800 Subject: [PATCH] Update doc --- doc/Offical_Docs/2-4_Kubernetes_CN.md | 112 ++++++++++++++++++ doc/Offical_Docs/3-0_QuickStart_Int_CN.md | 0 .../3-2_QuickStart_Pipeline_OCR_CN.md | 0 doc/Offical_Docs/4-0_ModelZoo_CN.md | 0 doc/images/kubernetes_design.png | Bin 0 -> 34393 bytes 5 files changed, 112 insertions(+) create mode 100644 doc/Offical_Docs/2-4_Kubernetes_CN.md create mode 100644 doc/Offical_Docs/3-0_QuickStart_Int_CN.md create mode 100644 doc/Offical_Docs/3-2_QuickStart_Pipeline_OCR_CN.md create mode 100644 doc/Offical_Docs/4-0_ModelZoo_CN.md create mode 100644 doc/images/kubernetes_design.png diff --git a/doc/Offical_Docs/2-4_Kubernetes_CN.md b/doc/Offical_Docs/2-4_Kubernetes_CN.md new file mode 100644 index 00000000..5bf9a3a2 --- /dev/null +++ b/doc/Offical_Docs/2-4_Kubernetes_CN.md @@ -0,0 +1,112 @@ +# Kubernetes 集群部署 + +Kubernetes 是一个基于容器技术的分布式架构的解决方案,是云原生容器集群管理系统,提供服务发现与负载均衡、存储编排、自动部署和回滚、资源管理、自动恢复以及密钥和配置管理。Paddle Serving 支持 Kubenetes 集群部署方案,为企业级用户提供集群部署示例。 + +## 部署方案 + +为了解决 Pod 迁移、Node Pod 端口、域名动态分配等问题,选择使用 Ingress 解决方案,对外提供可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等功能。在众多 Ingress 插件中选用 Kong 作为微服务的 API 网关,因其具备以下优势: +- 拥有丰富的微服务功能,如 API认证、鉴权、DDos保护和灰度部署等 +- 提供一些 API、服务的定义,可抽象成 Kubernetes 的 CRD,通过 Kubernetes Ingress 配置实现同步状态到 Kong 集群 +- 集群配置信息存储在 postgres 数据库,配置信息实现全局节点共享和实时同步 +- 有成熟的第三方管理 UI,实现可视化管理 Kong 配置 + +Paddle Serving 的 Kubernetes 集群部署方案设计如下图所示,用户流量通过 Kong Ingress 转发到 Kubernetes 集群。Kubernetes 集群负责管理 Service 和 Pod 实例。 + +

+ +

+ +## 部署步骤 + +**一. 准备环境** + +推荐[购买并使用百度智能云 CCE 集群](https://cloud.baidu.com/doc/CCE/index.html),提供完整的部署环境。如自行安装 Kubenetes 集群,请参考[教程](https://kubernetes.io/zh/docs/setup/)。 + +此外,还需要准备一个用于 Kubenetes 集群部署的镜像仓库,通常与云服务提供商绑定,如果使用百度智能云的CCE集群,可以参照[百度智能云 CCR 镜像仓库使用方式](https://cloud.baidu.com/doc/CCR/index.html)。当然 Docker Hub 也可以作为镜像仓库,但下载速度慢,集群扩容时间较长。 + +在 Kubenetes 集群中运行下面命令,安装网关工具 Kong + +``` +kubectl apply -f https://bit.ly/kong-ingress-dbless +``` + + +**二. 制作镜像** + +首先,可直接使用 Paddle Serving 提供的镜像作为 Base 制作业务镜像,或者重新制作镜像。Paddle Serving 提供以下3种镜像,区别如下: +- 开发镜像:安装多种开发工具,可用于调试和编译代码,镜像体积较大。 +- 运行镜像:安装运行 Serving 的必备工具,经过裁剪后镜像体积较小,适合在存储受限场景使用 +- Java 镜像:为 Java SDK 提供基础环境,包括 JRE、JDK 和 Maven +- XPU 镜像:为 Arm 或 异构硬件(百度昆仑、海光DCU)环境部署 + +完整镜像列表,请参考 [DOCKER 开发镜像列表](./Docker_Images_CN.md) + +其次,需要在镜像文件中添加 Serving 业务代码和模型。假定按上述步骤已拥有Serving运行镜像 paddle_serving:cuda10.2-py36,以 PaddleOCR 文字识别任务为例展示镜像制作方法。 + +```bash +# run docker +docker run --rm -dit --name pipeline_serving_demo paddle_serving:cuda10.2-py36 bash +cd Serving/examples/Pipeline/PaddleOCR/ocr + +# get models +python -m paddle_serving_app.package --get_model ocr_rec +tar -xzvf ocr_rec.tar.gz +python -m paddle_serving_app.package --get_model ocr_det +tar -xzvf ocr_det.tar.gz +cd .. + +# copy OCR directory to your docker +docker cp ocr pipeline_serving_demo:/home/ + +# commit and push it +docker commit pipeline_serving_demo registry.baidubce.com/paddlepaddle/serving:k8s-pipeline-demo +docker push registry.baidubce.com/paddlepaddle/serving:k8s-pipeline-demo +``` + +最终,你完成了业务镜像制作环节。 + +**三. 集群部署** + +Paddle Serving 封装了脚本 generate_k8s_yamls.sh 用以生成 Kubernetes 部署配置。以 OCR 为例,运行以下命令生成 Kubernetes 集群配置。 +``` +sh tools/generate_k8s_yamls.sh --app_name ocr --image_name registry.baidubce.com/paddlepaddle/serving:k8s-pipeline-demo --workdir /home/ocr --command "python3.6 web_service.py" --port 9999 +``` +需要注意的是 app_name 需要同 URL 的函数名相同。例如 ocr 示例的访问 URL 是 https://127.0.0.1:9292/ocr/prediction。 + +运行命令后,生成2个 yaml 文件,分别是 k8s_serving.yaml 和 k8s_ingress.yaml。执行以下命令启动 Kubernetes 集群 和 Ingress 网关。 + +``` +kubectl apply -f k8s_serving.yaml +kubectl apply -f k8s_ingress.yaml +``` + +最终通过输入以下命令检验集群部署状态: +``` +kubectl get deploy + +``` + +部署状态如下: +``` +NAME READY UP-TO-DATE AVAILABLE AGE +ocr 1/1 1 1 2d20h +``` + +查询集群服务状态: +``` +kubectl get service --all-namespaces +``` + +集群部署状态如下: +``` +NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +default bert ClusterIP 172.16.86.12 9292/TCP 20m +default kubernetes ClusterIP 172.16.0.1 443/TCP 28d +default ocr ClusterIP 172.16.152.43 9999/TCP 50m +kong kong-proxy LoadBalancer 172.16.88.132 80:8893/TCP,443:8805/TCP 25d +kong kong-validation-webhook ClusterIP 172.16.38.100 443/TCP 25d +kube-system heapster ClusterIP 172.16.240.64 80/TCP 28d +kube-system kube-dns ClusterIP 172.16.0.10 53/UDP,53/TCP,9153/TCP 28d +kube-system metrics-server ClusterIP 172.16.34.157 443/TCP 28d +``` + diff --git a/doc/Offical_Docs/3-0_QuickStart_Int_CN.md b/doc/Offical_Docs/3-0_QuickStart_Int_CN.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/Offical_Docs/3-2_QuickStart_Pipeline_OCR_CN.md b/doc/Offical_Docs/3-2_QuickStart_Pipeline_OCR_CN.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/Offical_Docs/4-0_ModelZoo_CN.md b/doc/Offical_Docs/4-0_ModelZoo_CN.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/images/kubernetes_design.png b/doc/images/kubernetes_design.png new file mode 100644 index 0000000000000000000000000000000000000000..05ace675ba636f7d271cb9db8cdba741db494026 GIT binary patch literal 34393 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 literal 0 HcmV?d00001 -- GitLab