Java - Kubernetes 按标签查找服务



我正在尝试使用Spring cloud和minikube开发一个示例应用程序,它由3个spring启动应用程序组成。

前两个是两个不同的应用程序(服务器),它们具有相同的终结点但功能不同,第三个是用于将其他两个应用程序集成到一个公开的 API 中的客户端。

我设法在minikube中部署了所有三个应用程序,并设法开发了完整的堆栈并使它们相互通信,但现在我想更进一步,自动发现两个服务器,而无需对服务名称进行硬编码。

我使用相同的标签在minikube中部署了两台服务器,并希望找到一些东西,以便客户端能够自动找到与两个服务器应用程序相关的服务。这将允许轻松扩展应用程序,以便当我将新服务器添加到堆栈时,客户端将找到它并公开它,而无需任何更改。

使用Netflix Eureka,这可以通过使用类似的东西轻松实现

discoveryClient.getInstances("service-name").forEach((ServiceInstance s)

但我不想在微服务列表中添加额外的 eureka 服务器,因为我们将使用 kubernetes。

有没有为kubernetes提供此功能的库?

我找到了帮助我实现这一目标的 fabric8 库。 仍然不知道这是否是正确的答案,但它:D

https://github.com/fabric8io/kubernetes-client/tree/master/kubernetes-client

@RequestMapping("/")
private String getResponse() {
String ret = "hello from Client L0L!!!n";
//Config config = new ConfigBuilder().withMasterUrl("https://mymaster.com").build();
//KubernetesClient client = new DefaultKubernetesClient(config);
KubernetesClient client = new DefaultKubernetesClient();

ServiceList services = client.services().withLabel("APIService").list();
Service server = null;
log.warn("---------------------------------------------->");
for (Service s : services.getItems()) {
log.warn(s.getMetadata().getName());
log.warn(s.toString());
if (s.getMetadata().getLabels().containsKey("ServiceType") && s.getMetadata().getLabels().get("ServiceType").equals("server"))
server = s;
}
log.warn("---------------------------------------------->");
String s = "";
if (server != null) {
RestTemplate t = new RestTemplate();
String url = "http://" + server.getMetadata().getName() + ":" + server.getSpec().getPorts().get(0).getPort() + "/";
log.warn("Contacting server service on: " + url);
s = t.getForObject(url, String.class);
log.warn("Response: " + s);
} else {
log.warn("Didn't find service with label ServiceType=server!!!");
}
return ret + " - " + s;
}

我创建了两个服务,并添加了代码中使用的两个标签。

您可以使用:

命令行界面:kubectl get services --selector=YOUR-LABEL-NAME.

API:labelSelector参数GET /api/v1/namespaces/{namespace}/services请参阅 API 文档。

但是,要小心服务内部的动态服务发现。正如 derSteve 在下面的评论中提到的 - 服务之间依赖关系的最佳实践是将它们部署为称为deployments的逻辑包,无需对其执行以前未知服务的发现。请参阅此链接。

最新更新