首页 > 解决方案 > 有 1 个用于 Kubernetes 出口流量的传出 IP

问题描述

当前设置

集群规格:Digital Ocean 上的托管 Kubernetes

目标

我的 pod 正在访问一些网站,但我想先使用代理。

问题

我需要使用的代理只在“允许列表”中使用 1 个 IP 地址。

我的集群使用不同的节点,使用 node-autoscaler,所以我有多个不断变化的 IP 地址。

我正在考虑的解决方案


我很想知道什么是最佳实践,最简单的解决方案,或者是否有人以前经历过这样的用例:)

最好的

标签: kubernetesproxy

解决方案


您可以设置所有流量通过istio-egressgateway

然后,您可以将其操作istio-egressgateway为始终部署在集群的同一节点上,并将该 IP 地址列入白名单。

优点:超级简单。但。如果您还没有使用 Istio,仅仅为此设置 Istio 可能会用火箭筒杀死蚊子。

缺点:需要确保节点不会更改 IP 地址。否则,istio-egressgateway它本身可能无法部署(如果您没有将标签添加到新节点),您将需要为新节点重新配置所有内容(新 IP 地址)。另一个缺点可能是,如果流量增加,会有一个 HPA,它将部署更多的网关副本,并且所有副本都将部署在同一个节点上。因此,如果您将拥有大量流量,那么隔离一个节点可能是一个好主意,仅出于此目的。

正如您所建议的那样,另一种选择是;代理。我会直接推荐一个 Envoy 代理。我的意思是,Istio 无论如何都会使用 Envoy 对吗?所以,直接拿到proxy,放到一个pod里,和我之前说的一样就行了;节点亲和性,因此它将始终在同一个节点上运行,因此它将使用相同的 IP 出去。

优点:您不会为一件小事安装整个服务网格控制平面。

缺点:和以前一样,如果出现问题,您仍然会遇到节点 IP 更改的问题,另外您需要管理自己的Deployment对象、HPA、配置 Envoy 代理等,而不是使用 Istio 对象(Gateway例如VirtualService)。

最后,我看到了第三种选择;在集群外部设置 NAT 网关,并配置您的流量以通过它。

优点:您无需配置任何 kubernetes 对象,因此无需设置任何节点亲和性,因此不会出现节点超载或 IP 更改。此外,您可以从集群中删除外部 IP 地址,这样会更安全(除非您有其他需要直接访问 Internet 的工作负载)。此外,可能将单个节点配置为 NAT 将比在节点中运行的 kubernetes pod 更具弹性。

缺点:设置起来可能有点复杂?

还有一个通用的骗局,您只能将 1 个 IP 地址列入白名单,因此您将始终遇到单点故障。甚至NAT网关;它仍然可能失败。

GCP 静态 IP 无济于事。另一个帖子的建议是保留一个 IP 地址,这样您就可以随时重复使用它。但这并不是说您会将该 IP 地址自动添加到出现故障的随机节点中。需要人工干预。我不认为你可以让一个特定的节点拥有一个静态 IP 地址,如果它出现故障,新创建的节点将选择相同的 IP。据我所知,该服务不存在。

现在,GCP 确实提供了一个非常有弹性的 NAT 网关。它由谷歌管理,所以不应该失败。不过也不便宜。


推荐阅读