使用 Quarkus 和 Eclipse JKube 进行 Kubernetes 原生开发
本文解释了 Eclipse JKube 远程开发是什么,以及它如何帮助开发人员使用 Quarkus 构建 Kubernetes 原生应用程序。
简介
正如我在上一篇文章 Quarkus 的 Kubernetes 原生内部循环开发 中提到的,微服务并非孤立存在。它们通常与其他服务通信,例如数据库、消息代理或其他微服务。由于这种分布式特性,开发人员常常难以开发(和测试!)作为更大系统一部分的单个微服务。
上一篇文章探讨了一些常见的内部循环开发周期挑战,并展示了 Quarkus 如何与其他技术结合来帮助解决其中一些挑战。Eclipse JKube 远程开发不是其中提到的技术之一,因为它在文章撰写时并不存在。现在它已经存在,当然应该被提及。
什么是 Eclipse JKube 远程开发?
Eclipse JKube 提供帮助将 Java 应用程序引入 Kubernetes 和 OpenShift 的工具。它是一系列用于构建容器镜像以及生成和部署 Kubernetes 或 OpenShift 清单的插件和库。
Eclipse JKube 远程开发 是作为 Eclipse JKube 1.10 版本的一部分首次发布的预览功能。这项新功能以 Kubernetes 为中心,使开发人员能够在连接到 Kubernetes 集群的同时,从本地计算机运行和调试 Java 应用程序。它在逻辑上类似于将本地开发机置于 Kubernetes 集群内部。来自集群的请求可以流入本地开发机,而传出的请求可以流回集群。
还记得我在第一篇文章中使用的Quarkus Superheroes中的这张图吗?

我们之前使用 Skupper 作为代理,将 Kubernetes 集群连接到本地计算机。自 1.10 版本以来,Eclipse JKube 消除了使用 Skupper 或在 Kubernetes 集群或本地计算机上安装其任何组件的需要。Eclipse JKube 通过将 Kubernetes Service
端口映射到本地计算机,处理与 Kubernetes 集群的所有底层通信。
Eclipse JKube 远程开发与 Quarkus
新的 Eclipse JKube 远程开发功能可以使 Quarkus Superheroes 示例变得非常有趣。如果我们想重现图 1 中所示的场景,我们只需对本地的 rest-fights
应用程序进行少量重新配置,然后在 Quarkus 开发模式下运行它。
首先,将 Quarkus Superheroes 部署到 Kubernetes。然后,将 Eclipse JKube 配置添加到 rest-fights/pom.xml
文件的 <plugins>
部分
<plugin>
<groupId>org.eclipse.jkube</groupId>
<artifactId>openshift-maven-plugin</artifactId>
<version>1.11.0</version>
<configuration>
<remoteDevelopment>
<localServices>
<localService>
<serviceName>rest-fights</serviceName>
<port>8082</port>
</localService>
</localServices>
<remoteServices>
<remoteService>
<hostname>rest-heroes</hostname>
<port>80</port>
<localPort>8083</localPort>
</remoteService>
<remoteService>
<hostname>rest-villains</hostname>
<port>80</port>
<localPort>8084</localPort>
</remoteService>
<remoteService>
<hostname>apicurio</hostname>
<port>8080</port>
<localPort>8086</localPort>
</remoteService>
<remoteService>
<hostname>fights-kafka</hostname>
<port>9092</port>
</remoteService>
<remoteService>
<hostname>otel-collector</hostname>
<port>4317</port>
</remoteService>
</remoteServices>
</remoteDevelopment>
</configuration>
</plugin>
截至本文撰写时,openshift-maven-plugin 的 1.11.0 版本是最新版本。您可能需要检查是否有更新的版本。 |
此配置告诉 OpenShift 将发送到名为 rest-fights
的 OpenShift Service
的端口 8082
上的请求代理到本地计算机的同一端口。此外,它将本地计算机的端口 8083
、8084
、8086
、9092
和 4317
转发回 OpenShift 集群,并将它们绑定到各种 OpenShift 服务。
上面的代码列表使用了 JKube OpenShift Maven 插件。如果您使用的是其他 Kubernetes 变体,可以使用 JKube Kubernetes Maven 插件 进行相同的配置。 如果您使用的是 Gradle,也有 JKube OpenShift Gradle 插件 和 JKube Kubernetes Gradle 插件 可用。 |
现在配置已就绪,您需要在 rest-fights
目录中打开两个终端。在第一个终端中,运行 ./mvnw oc:remote-dev
来启动远程开发代理服务。一旦启动,转到第二个终端并运行
./mvnw quarkus:dev \
-Dkafka.bootstrap.servers=PLAINTEXT://:9092 \
-Dmp.messaging.connector.smallrye-kafka.apicurio.registry.url=https://:8086
此命令在 Quarkus 开发模式下启动 rest-fights
应用程序的本地实例。来自集群的请求将进入您的本地计算机。本地应用程序将连接到集群上的其他服务,例如 rest-villains
和 rest-heroes
应用程序、Kafka 代理、Apicurio Registry 实例和 OpenTelemetry collector。通过此配置,Quarkus 开发服务将为本地运行的应用程序启动一个本地 MongoDB 实例,展示了如何将本地服务与远程集群上可用的其他服务结合使用。
您可以在请求流经 Kubernetes 集群、进入您的本地计算机,然后返回集群时,对本地应用程序进行实时代码更改!您甚至可以在进行本地更改时启用持续测试,以确保您的更改不会破坏任何东西。
Quarkus 远程开发与 Eclipse JKube 远程开发的主要区别在于,在 Quarkus 远程开发中,应用程序在远程 Kubernetes 集群中运行。本地更改将在本地计算机和远程环境之间同步。而在 JKube 远程开发中,应用程序在本地计算机上运行,流量从集群流向本地计算机,然后再流出到集群。
总结
正如您所见,Eclipse JKube 远程开发很好地补充了 Quarkus 开发体验。它使您能够轻松地将 Quarkus 的强大功能与 Kubernetes 相结合,以帮助创造更好的开发人员体验,无论是本地、分布式还是介于两者之间。