使用 IP 白名单对外部端点的 Kubernetes 出站调用

Kubernetes outbound calls to an external endpoint with IP whitelisting

我们在 google 云的 Google Kubernetes 引擎上使用 Kubernetes。我们的系统根据请求动态生成实例,这些实例调用外部网络服务。外部服务生成图片,每个实例的带宽使用量不小。

此外部 Web 服务配置了 IP 白名单。

有什么方法可以将所有请求从选定的 pods(它们分组在一个节点池中)转移到具有单个 IP 的外部服务?

答案是Yes,实际上有几种方法可以实现这一点。我将回答一个简单的方法来完成这项工作。通过代理服务器隧道。

也可以将外部 ip 分配给所有节点并允许它们从 web 服务中完成,但许多工程师不喜欢这样做,因为出于一百万个安全原因,没有人愿意将节点暴露给外部世界。

在同一个集群中添加一个单独的非常小的 nano VM,并安装 HAProxyNginx 或您最喜欢的代理。或者在您已有的实例之一上安装代理,但要确保它附加了外部 ip,并且它应该在您的集群内,以减少任何延迟问题。

现在绑定代理中的 url 以接受到特定端口的连接并将它们路由到具有外部 Web 服务的实例。这是 HAProxy 代码的示例。

listen port_2020
  bind :2020
  mode tcp
  server external-web-service externalwebservice.mycompany.com:443 check

本次设置完成后。假设您的 k8s 是 运行 masters 在 10.0.1.0/24 和 nodes 在 10.0.2.0/24。并在 10.10.1.101/32 的某处添加了此附加代理服务,外部 ip 为 52.*.*.*,位于同一 VPC 中。现在您所要做的就是在 10.10.1.101 上打开通信以接受从 10.0.2.0/24port 2020 的通信。

现在您的 pods 必须继续轮询 10.10.1.101:2020/api/health/check 而不是直接外部网络服务。

现在您可以在您的网络服务虚拟机上仅将代理虚拟机 IP 52.*.*.* 列入候补名单,而不会出现任何问题。

这只是如何实现的示例。但是有几种方法可以完成这项工作。使用 sidecar 也有许多高级方法可以做到这一点。

希望这对您有所帮助。