Kubernetes 上微服务之间集群间通信的最佳方式?

ABh*_*nav 1 java spring-boot kubernetes microservices kubernetes-ingress

我是微服务的新手,想了解在 Kubernetes 上部署的微服务中实现以下行为的最佳方式是什么:

有 2 个不同的 K8s 集群。微服务 B 部署在两个集群上。

现在如果微服务 A 调用微服务 B 并且 B 的 pod 在集群 1 中不可用,那么调用应该转到集群 2 的 B。

我可以想象通过使用 Netflix OSS 来实现这个功能,但在这里我没有使用它。

另外,暂时将集群间通信放在一边,我应该如何在微服务之间进行通信?

我知道的一种方法是为每个微服务创建 NodePort 类型的 Kubernetes 服务,并在调用微服务中使用 IP 和 nodePort。

问题:如果有人删除了目标微服务的K8s Service怎么办?在重新创建 K8s 服务时,K8s 将随机分配一个新的 nodePort,然后我将不得不返回到我的调用微服务并更改目标微服务的 nodePort。如何与 nodePort 解耦?

我研究了 kubedns,但似乎它只适用于集群。

我对 Istio 和 Kubernetes Ingress 的了解非常有限。这些中的任何一个是否提供了我正在寻找的东西?

抱歉问了一个很长的问题。任何形式的指导都会非常有帮助。

Mr.*_*ler 5

您可以使用服务公开您的应用程序,您可以使用某些类型的服务:

  • ClusterIP:在集群内部 IP 上公开服务。选择此值会使服务只能从集群内部访问。这是默认值 ServiceType

  • NodePort:在每个节点的 IP 上的静态端口 ( NodePort)上公开服务 。甲 ClusterIP 服务,向其中的 NodePort 服务的路由,自动创建。您将能够NodePort 通过请求从集群外部联系 服务 <NodeIP>:<NodePort>

  • LoadBalancer:使用云提供商的负载均衡器在外部公开服务。 NodePortClusterIP 服务,外部负载平衡器路由到的服务是自动创建的。

  • ExternalName:通过返回 记录将服务映射到externalName 字段的内容 (例如 foo.bar.example.comCNAME

对于内部通信,您可以使用 service type ClusterIP,您可以为您的应用程序配置服务 dns 而不是 IP。即:my-app-1可以使用 dnshttp://my-app-1或 fqdn 内部访问被调用的服务http://my-app-1.<namespace>.svc.cluster.local

对于外部通信,您可以使用NodePortLoadBalancer

NodePort当您的节点很少并且知道所有节点的 ip 时,这很好。是的,通过服务文档,您可以指定特定的端口号:

如果需要特定的端口号,可以在该nodePort字段中指定一个值。控制平面将为您分配该端口或报告 API 事务失败。这意味着您需要自己处理可能的端口冲突。您还必须使用一个有效的端口号,该端口号位于为 NodePort 使用配置的范围内。

LoadBalancer给你更大的灵活性,因为你不需要知道所有的节点ip,你只需要知道服务IP和端口。但LoadBalancer仅在 cloudproviders 中支持,如果您想在裸机集群中实现,我建议您查看MetalLB

最后,还有一个选项是 use ingress,在我看来,这是向外部公开 HTTP 应用程序的最佳方式,因为您可以按路径和主机创建规则,并且它为您提供了比服务更大的灵活性。但支持 HTTP/HTTPS,如果您需要 TCP 则转到服务

我建议您查看此链接以深入了解服务和入口的工作原理:

Kubernetes 服务

Kubernetes 入口

NGINX 入口