kubernetes - 有 1 个用于 Kubernetes 出口流量的传出 IP
问题描述
当前设置
集群规格:Digital Ocean 上的托管 Kubernetes
目标
我的 pod 正在访问一些网站,但我想先使用代理。
问题
我需要使用的代理只在“允许列表”中使用 1 个 IP 地址。
我的集群使用不同的节点,使用 node-autoscaler,所以我有多个不断变化的 IP 地址。
我正在考虑的解决方案
- 在集群外部设置代理(squid?nginx?)(当前在我访问 HTTPS 网站时不起作用)
- Istio 可以让我设置网关吗?(不了解 Istio)
- 使用 GCP 管理的 K8s,并按照Kubernetes 集群传出流量 IP上的答案进行操作。但是我们所有的堆栈都在 Digital Ocean 上,那里的定价更好。
我很想知道什么是最佳实践,最简单的解决方案,或者是否有人以前经历过这样的用例:)
最好的
解决方案
您可以设置所有流量通过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 网关。它由谷歌管理,所以不应该失败。不过也不便宜。
推荐阅读
- java - Java:赋予输入中更高的值更多的权重
- java - 如何使用 JPA 和 Springboot 以 JSON 格式返回子对象详细信息
- python-3.x - Python(beautiful-soup)在爬行时为现有 html 返回“none”
- report - Power BI - 数据建模
- geometry - 一个点在其他两个点之间的坐标,并且知道从起点到目标点的距离
- nginx - Nginx HTTPS only works after page is refreshed
- ssl - Ec2 上的 Cloudflare SSL
- mysql - 上传照片时连接被重置 laravel
- python - 需要在函数迭代中从 Python 转换为 Julia
- javascript - 两段 javascript 代码可以完美地单独工作,但不能一起工作