Nationalparks Java App 在本节中,我们将部署一个用 Java 开发的后端服务,它将向可视化应用程序(parksmap在之前的实验中部署的 Web 组件)公开 2 个主要的 REST 端点。该应用程序将查询存储在 MongoDB 数据库中的国家公园信息(包括其坐标)。此应用程序还将提供一个外部访问点,以便最终用户可以直接使用所提供的 API。 Background: Source-to-Image (S2I) 在之前的实验中,我们学习了如何通过预先存在的镜像部署程序。现在,我们将扩展我们的知识,通过学习 OpenShift 如何使用现有存储库中的源代码构建容器镜像。这是使用 Source-to-Image 项目完成的。 Source-to-Image (S2I) 是一个由 Red Hat 赞助的开源项目,其目标如下: Source-to-image (S2I) is a tool for building reproducible container images. S2I produces ready-to-run images by injecting source code into a container image and assembling a new container image which incorporates the builder image and built source. The result is then ready to use with docker run. S2I supports incremental builds which re-use previously downloaded dependencies, previously built artifacts, etc. OpenShift 支持 S2I,并且可以使用 S2I 作为其构建机制之一(除了从 Dockerfile 构建容器映像和“自定义”构建)。 OpenShift 在称为 Build Pod的特殊Pod 中运行 S2I 进程,因此构建受配额、限制、资源调度和 OpenShift 其他方面的约束。 S2I 的完整讨论超出了本课程的范围, 但您可以在 OpenShift S2I 文档 或在GitHub上找到有关它的更多信息 。关于 S2I,您需要记住的唯一关键概念是它很神奇。 通过使用S2I,对开发者屏蔽了应用构建、部署的细节,如选用哪种操作系统、编写适应镜像操作系统的处理脚本、优化镜像大小等等,并且会产出 OCI 容器镜像,可以运行在任何兼容 OCI 镜像标准的集群中。类似的构建工具还有buildpacks等、实践中,有不少单位依然使用dockerfile。更多的工具可以访问https://landscape.cncf.io 练习: Creating a Java application 作为本练习的一部分,我们将部署的后端服务称为 nationalparks. 这是一个 Java Spring Boot 应用程序,它对 MongoDB 数据库执行 2D 地理空间查询,以定位和返回世界上所有国家公园的地图坐标。这只是一种奇特的说法,即我们将部署一个返回 JSON 地点列表的 Web 服务。 Add to Project 添加到项目 因为 nationalparks 组件是为我们现有前端(parksmap)将使用的数据提供服务的后端,所以我们将在我们一直在使用的现有项目中构建它。为了说明如何通过 CLI 或 Web 控制台与 OpenShift 交互,我们将使用 Web 控制台部署 nationalparks 组件。 Using Application Code on Git Server在 Git 服务器上使用应用程序代码 OpenShift 可以使用任何可访问的 Git 存储库。这可以是 GitHub、GitLab 或任何其他使用 Git 的服务器。您甚至可以在您的 Git 服务器中注册 webhook 以启动由应用程序代码的任何更新触发的 OpenShift 构建! NationalParks GitHub Repository 稍后在实验中,您将更改代码,然后重新构建您的应用程序。这是一个相当简单的 Spring 框架 Java 应用程序。 在 OpenShift 上构建代码 与我们之前对现有图像使用*+Add*的方式类似,我们可以对指定源代码存储库执行相同的操作。由于对于本实验,您有自己的 git 存储库,让我们将其与简单的 Java S2I 映像一起使用。 在 Developer 视图 中,单击左侧导航中的+Add,转到 Git Repository 部分,然后选择 From Git 选项。 *Import from Git* 工作流将引导您基于一些选项来完成部署应用程序的过程。 为 Git Repo URL 输入以下内容: https://github.com/openshift-roadshow/nationalparks.git OpenShift 会自动猜测 Git 服务器类型和源代码使用的编程语言(构建器语言检测)。验证是否已选择Java作为您的 Builder Image,并确保选择版本openjdk-11-ubi8以使用 OpenJDK 11。 向下滚动到常规部分。选择: Application Name : workshop Name : nationalparks 在资源 Resources 部分中,选择部署*Deployment*。 如果存在,请在此处将 Pipeline 部分留空,因为我们将在下一个模块中实现它 在高级选项,确保创建路线到应用程序被选中在这里。 我们将直接从这个视图创建另一个*Secure Route*。 单击显示高级路由 Show advanced Routing options 选项。 Leave all default options, go under Security section.保留所有默认选项,进入安全部分。 检查 Secure Route 选项。 在 TLS termination 下,选择Edge。 向下滚动并展开标签 Labels 部分以添加 3 个标签。 应用组名称: app=workshop 接下来是此部署的名称。 component=nationalparks 最后,这个组件在整个应用程序中扮演的角色role。 role=backend 点击创建 Create 提交。 要查看构建日志,请在拓扑视图中单击nationalparks条目,然后单击资源 Resources 选项卡的构建 Builds 部分中的查看日志。 这是一个基于 Java 的应用程序,它使用 Maven 作为构建和依赖系统。由于这个原因,初始构建将需要几分钟,因为 Maven 会下载应用程序所需的所有依赖项。您可以实时看到这一切的发生! 从命令行,您还可以看到Builds: oc get builds 你会看到如下输出: NAME TYPE FROM STATUS STARTED DURATION nationalparks-1 Source Git@b052ae6 Running About a minute ago 1m2s 您还可以使用以下命令查看构建日志: oc logs -f builds/nationalparks-1 构建完成并成功后: 进程会将生成的图像推送到内部 OpenShift 镜像仓库 部署 Deployment (d)将检测到镜像发生了变化,这将触发新的部署。 将为这个新部署生成一个ReplicaSet (RS)。 RS 将检测到没有Pod正在运行,将触发部署一个pod,因为我们的默认副本数仅为 1。 最后,当执行 oc get pods命令时,您会看到构建 Pod 已完成(退出),并且应用程序Pod处于就绪和运行状态: NAME READY STATUS RESTARTS AGE nationalparks-1-tkid3 1/1 Running 3 2m nationalparks-1-build 0/1 Completed 0 3m parksmap-57df75c46d-xltcs 1/1 Running 0 2h 如果您再次查看 Web 控制台,您会注意到,当您以这种方式创建应用程序时,OpenShift 还会为您创建一个Route。您可以在 Web 控制台中或通过命令行查看 URL: oc get routes Where you should see something like the following:您应该在哪里看到类似以下内容: NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD nationalparks nationalparks-%PROJECT%.%CLUSTER_SUBDOMAIN% nationalparks 8080-tcp edge parksmap parksmap-%PROJECT%.%CLUSTER_SUBDOMAIN% parksmap 8080-tcp edge none 在上面的示例中,URL 是: https://nationalparks-%PROJECT%.%CLUSTER_SUBDOMAIN% 由于这是一个后端应用程序,它实际上没有 Web 界面。但是,它仍然可以与浏览器一起使用。与 parksmap 前端一起工作的所有后端都需要实现 /ws/info/ 端点。要进行测试,请在浏览器中访问此 URL: National Parks Info Page 如果 Pod 正在运行并且应用程序不可用,请等待几秒钟并刷新页面,因为我们尚未为此配置健康检查。 您将看到一个简单的 JSON 字符串: {"id":"nationalparks","displayName":"National Parks","center":{"latitude":"47.039304","longitude":"14.505178"},"zoom":4} 之前我们说过: This is a Java Spring Boot application that performs 2D geo-spatial queries against a MongoDB database 但是我们现在还没有设置MongoDB数据库。 连接到容器 连接到数据库