我们在Google Cloud的Google Kubernetes Engine上使用Kubernetes。我们的系统根据请求动态生成实例,这些实例调用外部 Web 服务。外部服务生成镜像,每个实例的带宽使用量不小。
此外部 Web 服务配置了 IP 允许列表。
有什么方法可以将从所选 pod(它们分组在节点池中(的所有请求汇集到具有单个 IP 的外部服务?
答案是Yes
,实际上有几种方法可以实现这一点。我将回答一种简单的方法来完成此操作。通过代理服务器建立隧道。
也可以将外部 ip 分配给所有节点并允许它们来自 Web 服务,但许多工程师不喜欢这样做,因为出于一百万个安全原因,没有人愿意将节点暴露给外部世界。
在同一群集中添加一个单独的非常小的可能是nano VM,并安装HAProxy
或Nginx
或您喜欢的代理。或者在您已有的实例之一上安装代理,但请确保它附加了外部 IP,并且它应该在您的集群内,以减少任何延迟问题。
现在,绑定代理中的 url 以接受与特定端口的连接,并将其路由到具有外部 Web 服务的实例。这是HAProxy代码的一个示例。
listen port_2020
bind :2020
mode tcp
server external-web-service externalwebservice.mycompany.com:443 check
完成此设置后。假设您的 k8s 在10.0.1.0/24
上运行主节点,在10.0.2.0/24
上运行节点。并在10.10.1.101/32
的某个位置添加了此附加代理服务,其外部 IP 为52.*.*.*
在同一 VPC 中。现在您所要做的就是在10.10.1.101
上打开通信以接受来自10.0.2.0/24
的port 2020
通信。
现在,您的 Pod 必须继续轮询10.10.1.101:2020/api/health/check
而不是直接轮询外部 Web 服务。
现在,您可以仅将 Web 服务虚拟机上的代理虚拟机 ip52.*.*.*
列入候补名单,而不会出现任何问题。
这只是如何做到这一点的一个例子。但是有几种方法可以做到这一点。使用边车也有许多高级方法可以做到这一点。
希望这是有帮助的。