K8s:通过Pod将流量路由到子网(从Pod访问VPN客户端)

时间:2019-12-01 16:20:39

标签: networking kubernetes routing google-kubernetes-engine openvpn

我正在Kubernetes / GKE上运行一个应用程序。

我有一堆没有公共IP的设备。我需要从应用程序访问那些设备的SSH和VNC。

最初的想法是在群集中运行OpenVPN服务器并连接设备,但后来我遇到了问题:

似乎没有任何优雅/惯用的方式将流量从应用程序路由到VPN客户端。

基本上,我只需要能够告诉route 10.8.0.0/24 via vpn-pod

我找到了可能的解决方案:

  • 修改节点上的路由。我只想让节点保持短暂状态,并且只在K8s清单中显示所有内容。

  • DaemonSet,以在具有K8s清单的节点上添加路由。目前尚不清楚如何跟踪OpenVPN pod IP的更改。

  • Istio。似乎有点过头了,但是我无法在文档中找到解决我问题的方法。 L3路由似乎不受支持,因此它必须涉及端口映射。

  • Calico。它在GKE上本身受支持,并且确实支持L3路由,但是我想避免为可能用单个自定义路由解决的问题引入如此深远的更改。

  • OpenVPN客户端sidecar。只要允许客户端相互通信,就可以非常优雅地工作,并且在何处以及如何托管VPN服务器都无关紧要。但是,我想隔离客户端,可能需要从不同的Pod访问客户端,这意味着必须将Sidecar放在多个位置,这会污染部署。可以通过将客户端分为不同IP范围的类来实现隔离。

  • GCP / GKE本身内的路由。它们仅允许将节点指定为下一跳。这也意味着应用程序和VPN服务器都必须在GCP内运行。

我目前倾向于在裸机上运行OpenVPN服务器并使用GCP路由。它可以正常工作,我可以从K8s应用程序ping VPN客户端,但是它似乎仍然很脆弱且很难连接。

但是,只有Sidecar解决方案提供了一种完全分离问题的方法。

是否有惯用的解决方案可以从其他Pod访问Pod专用网络?

1 个答案:

答案 0 :(得分:0)

您设计的解决方案-使用OpenVPN服务器作为多个设备的网关(我假设将有数十个甚至数百个同时连接)是实现此目的的最佳方法。

很遗憾,GCP的VPN不提供所需的功能(仅Site2站点连接),因此我们无法使用它。

您可以通过将OpenVPN放入GCP(与应用程序位于同一VPC网络中)来简化解决方案,以便您的应用程序可以直接与服务器通信,然后与客户端通信。我相信通过这样做,您将摆脱那“脆弱而硬连线”的部分。

您将必须决定哪种解决方案最适合您-在GCP内外开放VPN。

我认为,如果您打算在GCP中托管Open VPN服务器,它将更加优雅,简单,但不一定便宜。

不管采用哪种解决方案,您都可以将客户端设置在不同的ip范围内,但是我将配置一些iptables规则(在Open VPN服务器上)以阻止通信并仅允许客户端访问网络中的几个IP。这样一来,如果将来您需要一些客户端进行通信,则只需iptable配置即可。