【问题标题】:How does Traefik / Ngnix - (Ingress Controllers) forwards request to two different services having configured with same port number.?Traefik / Nginx -(入口控制器)如何将请求转发到配置有相同端口号的两个不同服务。?
【发布时间】:2020-08-29 10:47:12
【问题描述】:

基本上,我使用 docker-compose 进行了以下 Hdfs 集群设置:

节点 1,IP:192.168.1.1,服务部署如下:

Namenode1:9000
HMaster1: 8300
ZooKeeper1:1291

节点 2,IP:192.168.1.2,服务部署如下:

Namenode2:9000
ZooKeeper2:1291

Traefik / Ngnix - (Ingress Controllers) 如何将请求转发到配置相同端口号的两个不同服务?

【问题讨论】:

    标签: kubernetes docker-compose traefik nginx-ingress traefik-ingress


    【解决方案1】:

    有几个很棒的教程介绍了 kubernetes 中的入口和负载平衡如何工作,例如this one by Mark Betz。作为一般规则,考虑服务和工作负载而不是运行工作负载的特定节点会有所帮助。

    部署在 Kubernetes 中的工作负载(所谓的Pod)有自己的内部 IP 地址,称为ClusterIP。该 pod 可以打开一个或多个端口,仅在该 pod 拥有的 IP 地址上。

    如果您现在有多个 pod 来分配负载,例如就像 5 个 Web 服务器进程或后端逻辑一样,客户端(在集群内部)很难跟踪所有这些 Pod IP,因为它们也会在 Pod 更新或由于崩溃而重新启动时发生变化。这就是为什么 Kubernetes 有一个所谓的 services 概念。它们提供了一个稳定的 DNS 名称和 IP,然后透明地“转发”到一个健康的 pod。因此,您的客户端只需要知道 DNS 名称,而不需要跟踪特定的 pod IP。

    如果你现在想向公众公开这样的service,有不同的方法。您可以将您的服务设置为type: LoadBalancer,然后在您的云提供商上设置一些负载均衡器基础架构,并将流量路由到节点,然后再路由到 pod - 或者 - 您已经有一个入口控制器,只需根据以下内容定义路由主机名和路径。入口控制器本身就是这样一种负载均衡服务,带有附加的云负载均衡器,并且还有一些 pod(例如 traefik 或 nginx 容器),然后相应地路由您的数据包。

    所以回到你最初的问题:如果你想公开一个具有多个相同类型 pod 的服务,那么你首先使用 selector 创建一个与你的 Pods 匹配的 Service 资源,然后您创建一个单一的ingress 资源,该资源提供主机名/路径并引用此服务。入口控制器将获取这些入口资源并相应地配置 traefik 或 nginx。入口控制器并不真正关心主机 IP 和端口号,因为它作用于内部 kubernetes ClusterIP,所以当你有入口时,你甚至不需要(也不应该)直接公开这样的服务.

    我希望这能回答您关于通过入口控制器公开两个工作负载的问题。详情请查看the Kubernetes docs on Ingresses。根据您命名的服务(zookeeper、hdfs),负载平衡和入口可能不是您在这种情况下所需要的。 Zookeeper 实例在大多数情况下应该是内部的,并且需要单独处理,因此您可能需要查看headless services,以了解此用例。另请查看 Kubernetes 文档以获取 a way to run zookeeper

    【讨论】:

    • 我有两个不同的服务(namenode1 和 namenode2),它们指向同一个端口 9000。我想了解这个负载均衡器如何将请求转发到这些不同的服务?请求是否会转发到 namenode1 和 namenode2,因为它们是两个不同的服务?或者请求会被转发到namenode1/namenode2之一?
    • 正如我已经指出的,Kubernetes 中的服务主要是一种内部构造。工作负载(pod)和服务是分开定义的。您甚至可以通过创建多个通过标签匹配相同 pod 的服务资源来为同一组 pod 创建多个服务。然后可以在入口控制器上指定入口的流量分配。通常这是循环或加权循环。检查例如这里的 traefik 文档docs.traefik.io/routing/services/#weighted-round-robin-service
    • 但是请记住,这一切都发生在服务的虚拟构造上,并且与主机或主机端口号没有真正的联系。也许您可以在一个单独的问题中阐明您的特定用例 - 您尝试完成的工作 - 并关闭/标记此问题为已回答?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多