【问题标题】:send request from kubernetes pods through load balancer ip通过负载均衡器 ip 从 kubernetes pod 发送请求
【发布时间】:2020-01-08 15:07:19
【问题描述】:

我在DigitalOcean 上有一个使用traefik 1.7 作为入口控制器的k8s 集群。 我们的域指向trafik创建的负载均衡器ip。

所有传入的请求都通过负载均衡器 ip 并由trafik 路由到适当的服务。

现在我想从我的服务向只接受注册 IP 的外部系统执行 HTTP 请求。

我可以向他们提供负载平衡器的 IP 并让所有出站请求都通过负载平衡器 IP 吗?或者我需要为他们提供所有节点的公共 IP?

谢谢

【问题讨论】:

    标签: kubernetes ip load-balancing digital-ocean traefik


    【解决方案1】:

    你可以做任何一个。

    但最好的解决方案是让所有流量都通过负载平衡器,假设这是一些具有隧道功能的代理服务器,并通过外部系统上的负载平衡器 IP 打开通信。因为,想象一下,现在您可能有十几个节点运行 100 个微服务,而现在您打开了外部系统安全组以允许来自十几个的流量。

    但是在接下来的几个月中,您可能会从 12 个节点增加到 100 个节点,并且每当您在 DigitalOcean 中添加节点时更新外部系统的安全组的开销。

    但您也可以尝试不同的方法,即添加一个独立的代理服务器并通过它从您的 pod 路由流量。类似 [this] (Kubernetes outbound calls to an external endpoint with IP whitelisting)。

    请注意,不仅仅是这些选项,还有多种方法可以实现这一点,另一种方法是将 NAT IP 与您的所有节点相关联,并将每个节点保留在专用网络后面也可以。这完全取决于您希望如何设置它以及您计划实现的系统的目的。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      很遗憾,Ingress 资源无法使用出站请求。 所以需要为所有节点提供公网IP。

      另外一个思路,如果你使用正向代理(例如 nginx、haproxy),你可以通过设置 nodeSelector 来限制调度正向代理 Pod 的节点。 通过这样做,我认为您可以限制提供公共 IP 地址的节点。

      【讨论】:

        【解决方案3】:

        从 k8s 集群到 cluster-external 服务的出口数据包将节点的 IP 作为源 IP。因此,您可以在外部系统中注册 k8s 节点的 IP,以允许来自 k8s 集群的出口数据包。

        https://kubernetes.io/docs/tutorials/services/source-ip/ 表示来自 k8s 的出口数据包使用节点 IP 进行源 NAT:

        Source NAT:替换数据包上的源IP,通常用节点的IP

        以下可用于从 k8s 集群发送出口数据包:

        【讨论】:

        【解决方案4】:

        kube-static-egress-ip 提供了一种解决方案,集群操作员可以使用该解决方案定义出口规则,其中一组 pod 的出站流量始终使用配置的静态出口 IP 进行 SNAT。 kube-static-egress-ip 使用自定义资源以 Kubernetes 原生方式提供此功能。

        【讨论】:

          猜你喜欢
          • 2015-01-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-02
          • 2020-01-30
          • 2013-12-09
          • 2019-05-27
          相关资源
          最近更新 更多