gpt4 book ai didi

kubernetes - Kubernetes中的微服务发现服务

转载 作者:行者123 更新时间:2023-12-02 11:53:01 27 4
gpt4 key购买 nike

最近,我已经阅读了很多有关微服务和kubernetes的文章,并且还尝试了这两种技术。
我知道k8中可用的不同组件,例如pod,服务,部署...
我也知道服务可以是ClusterIP类型,以限制到群集内的连接。

假设我们有10个微服务,每个微服务都使用某种http服务器公开其功能。基本上每个微服务都是一个REST API。
用kubernetes来讲,这是一个由Pod管理的容器,并且会有一个服务来管理此Pod的连接性。

我的问题如下:
如果您未使用像Spring这样的利用Eureka的框架,例如每个微服务中的裸骨golang http服务器。每个服务如何在不将服务名称和端口号传递给每个微服务的情况下找到另一个服务。

例如:
假设服务A在端口8080上公开,需要调用服务B在端口8081上公开,而另一个服务在端口8082上运行;这意味着我们需要将端口作为环境变量传递给服务A ...您可以清楚地看到,当服务数量增加时,将很难维护所有这些环境变量。

人们如何解决这个问题?他们是否使用某种集中式服务注册表?如果是,那么该服务注册表将如何与kubernetes服务集成?

提前致谢

更新

提供的可接受答案是正确的解释,我没看到的是,例如在kubernetes中,通常每个部署对象都有其自己的IP地址,因此可以为每个微服务使用相同的端口号。

如果有人对简单/虚拟微服务示例感兴趣,那么我整理了一个可以在带有minikube的本地kubernetes集群上运行的小项目。

https://github.com/fouadkada/simple_microservice_example

最佳答案

我了解服务是指微服务,
但是为了避免歧义,首先我想定义一些东西。当我说服务时,是指k8s服务。当我说应用程序时,是指在pod中运行的应用程序。

现在您的问题:

How does each service find the other service without passing the service name and port number to each microservice



在kubernetes中,有一个服务概念( link to docs)。
每个服务都在k8s dns服务器(通常是CoreDNS)中注册。您可以将这些服务的名称用作常规FQDN。

Let's say Service A is exposed on port 8080 which needs to call Service B which is exposed on port 8081 and another service which is running on port 8082; this means that we need to pass the ports as environment variables to Service A.



正如@sachin已经正确提到的那样,通常不会因为每个应用程序都对每个应用程序使用不同的端口。
最好使用Porst来了解特定端口上可以使用的应用程序类型。例如当您看到端口80时,几乎可以确定它是HTTP服务器。当您看到6379时,可以确定它的redis等。

Kubernetes networking model上的k8s文档中,您可以找到:

Every Pod gets its own IP address. This means you do not need to explicitly create links between Pods and you almost never need to deal with mapping container ports to host ports. This creates a clean, backwards-compatible model where Pods can be treated much like VMs or physical hosts from the perspectives of port allocation, naming, service discovery, load balancing, application configuration, and migration.



您可能还不知道的最后一件事是,当k8s启动pod时,一些有关已经存在的服务的信息是通过环境变量传递的。您可以自己检查;只需执行到任何Pod的运行 set即可查看所有环境变量。

这是示例输出(我删除了不重要的部分):
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443

但是请注意,这些环境变量是仅在与您的应用程序相同的 namespace 中列出的服务,并且仅是那些存在然后创建pod的服务。容器启动后创建的任何内容都不会反射(reflect)在环境中。

总结并回答您的问题:

How do people solve such a problem?



人们使用DNS(每个k8s群集中都存在)和静态端口(不会随机更改的端口)。

当然,有像 Consul这样的解决方案,但是k8s的即用功能足以满足90%以上的用例。

关于kubernetes - Kubernetes中的微服务发现服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62267722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com