在本文中,我们将探讨在 Kubernetes 之上开发 Java 应用程序时的一些痛点。我们将研究Eclipse JKube的Kubernetes Maven 插件中新添加的功能,它允许您在本地机器上运行的应用程序在 Kubernetes 集群中公开。
如果您还没有听说过 Eclipse JKube 或 Kubernetes Maven Plugin,我建议您先阅读以下 DZone 文章:
- DZone:使用 JKube Kubernetes Maven 插件将 Maven 应用程序部署到 Kubernetes
- DZone:使用 JKube Kubernetes Gradle 插件容器化 Gradle 应用程序并部署到 Kubernetes
- 这篇博文面向使用 Kubernetes 并熟悉容器化应用程序开发的 Java 开发人员。我们假设读者有使用 Docker 和 Kubernetes 的经验。
- Eclipse JKube 的 Kubernetes 远程开发功能适用于开发与 Kubernetes 中的多个微服务通信的 Java 应用程序的 Java 开发人员,这很难在本地计算机上复制。
- Docker Compose: 您可以提供自己的 YAML 文件来配置您的应用程序服务,并通过您提供的 YAML 配置启动所有服务。这仅限于 Docker 环境。有时,由于资源限制,这些服务可能无法启动。此外,我们可能不允许在本地复制敏感数据。
- 开发服务:一些流行的框架还支持在开发/测试环境中自动提供依赖服务。开发人员只需关心启用此功能,框架负责启动服务并将其与您的应用程序连接。这也仅限于 Docker 环境。
- 构建和部署工具: 使用 Kubernetes 相关工具部署所有依赖服务,然后将您的应用程序部署到 Kubernetes。
- 与以前仅限于 Docker 的替代方案相比并不流畅
- 在每个小变化上构建和部署应用程序会导致开发迭代变慢
我们在 Eclipse Cloud Tooling 的团队专注于创建工具,以简化跨分布式服务的开发人员活动和开发工作流程。在Kubernetes Maven Plugin上工作和测试时,我们注意到在本地开发的同时重复构建和部署应用程序到 Kubernetes 并不是最有效的工作方式。
在Kubernetes Maven Plugin v1.10.1 中,我们添加了一个新的目标k8s:remote-dev。这个目标试图通过以下方式简化跨分布式服务的 Java 开发人员工作流程:
- 使用在 Kubernetes 集群中运行的远程服务
- 实时应用程序编码,同时与 Kubernetes 集群中运行的其他服务交互
- 公开本地运行的应用程序或通过连接到远程服务
让我们考虑一个场景,我们正在编写一个试图从其他微服务获取笑话字符串的笑话微服务。下面是一张图表,让您更好地理解:
图 1:使用两个现有服务的 Simple Joke 应用程序
自定义笑话服务是我们的主要应用程序,它有一个端点 /random-joke。它分别通过 /chuck-norris 和 /joke 端点依赖于另外两个微服务 ChuckNorris 和 Jokes。用户使用 /random-joke 端点请求一个笑话,我们的应用程序从两个微服务之一随机获取一个笑话字符串。
为了开发和测试我们的应用程序,我们需要分别访问这些依赖的 ChuckNorris 和 Jokes 服务。让我们看看开发人员的工作流程是什么样的:
- 在本地开发和测试 Custom Joke 微服务时,开发人员不得不在本地一次又一次地设置依赖的微服务。
- 为了验证应用程序在 Kubernetes 中是否正常工作。开发人员必须在每次开发迭代中构建、打包 Custom Joke 应用程序并将其部署到 Kubernetes。
- 依赖服务(ChuckNorris 和 Joke)可能是相当重量级的服务,并且可能有一些它们自己的依赖服务。在开发人员的环境中本地设置这些可能并不简单。
假设您有两个应用程序已经在 Kubernetes 集群中运行,您当前的应用程序依赖于它们:
让我们将运行在 Kubernetes 集群中的这些远程服务暴露给我们的本地机器。下面是一张图表,让你更好地理解:
图二:JKube远程开发简化远程开发
为此,我们需要为我们的插件提供 XML 配置以公开这些服务:
org.eclipse.jkube
kubernetes-maven-plugin
${jkube.version}
service1
8080
8081
service2
8080
8082
上面的配置正在做这两件事:
- 在本地计算机上的端口 8081 上公开名为 service1 的 Kubernetes 服务
- 在本地计算机上的端口 8082 上公开名为 service2 的 Kubernetes 服务
运行 Kubernetes 远程开发目标:
$ mvn k8s:remote-dev
[INFO] Scanning for projects...
[INFO]
[INFO] -----------< org.eclipse.jkube.demos:random-jokes-generator >-----------
[INFO] Building random-jokes-generator 1.0.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- kubernetes-maven-plugin:1.10.1:remote-dev (default-cli) @ random-jokes-generator ---
[INFO] k8s: Waiting for JKube remote development Pod [jkube-remote-dev-9cafc1e1-054b-4fab-8f4e-b4345056478e] to be ready...
[INFO] k8s: JKube remote development Pod [jkube-remote-dev-9cafc1e1-054b-4fab-8f4e-b4345056478e] is ready
[INFO] k8s: Opening remote development connection to Kubernetes: jkube-remote-dev-9cafc1e1-054b-4fab-8f4e-b4345056478e:54252
[INFO] k8s: Kubernetes Service service1:8080 is now available at local port 8081
[INFO] k8s: Kubernetes Service service2:8080 is now available at local port 8082尝试在端口上访问本地可用的服务:
$ curl localhost:8081/
Chuck Norris's OSI network model has only one layer - Physical.
$ curl localhost:8082/
Why do Java programmers have to wear glasses? Because they don't C#.
如您所见,您可以分别在端口 8081 和 8082 上本地访问 Kubernetes 服务 service1 和 service2。
结论
在本文中,您了解了 Eclipse JKube 的 Kubernetes Maven 插件的远程开发目标,以及如何将本地应用程序公开到 Kubernetes 集群,反之亦然。
如果您有兴趣了解有关 Eclipse JKube 的更多信息,可以查看以下链接:
- Documentation
- Github Issue Tracker
- StackOverflow
- YouTube Channel
- Gitter Chat
热门跟贴