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

amq*_*amq 7 networking routes openvpn kubernetes google-kubernetes-engine

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

我有很多没有公共IP的设备。我需要从应用程序访问这些设备的 SSH 和 VNC。

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

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

基本上,我所需要的就是能够告诉route 10.8.0.0/24 via vpn-pod

我发现的可能的解决方案:

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

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

  • 伊斯蒂奥。似乎有点矫枉过正,我无法在文档中找到问题的解决方案。L3路由好像不支持,所以必须涉及到端口映射。

  • 印花布。它在 GKE 上得到原生支持,并且确实支持 L3 路由,但我想避免对本来可以通过单个自定义路由解决的问题引入如此深远的更改。

  • OpenVPN 客户端边车。工作起来会非常优雅,只要允许客户端相互通信,VPN 服务器的托管位置和方式并不重要。但是,我想隔离客户端,并且可能需要从不同的 pod 访问客户端,这意味着必须将 sidecar 放置在多个位置,从而污染部署。可以通过将客户端分为不同 IP 范围的类别来实现隔离。

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

我目前倾向于在简单的虚拟机上运行 OpenVPN 服务器并使用 GCP 路由。它可以工作,我可以从 K8s 应用程序 ping VPN 客户端,但它看起来仍然脆弱且硬连线。

然而,只有 sidecar 解决方案提供了一种完全分离关注点的方法。

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

Woj*_*k_B 1

您设计的解决方案 - 使用 OpenVPN 服务器充当多个设备的网关(我假设会有数十个甚至数百个同时连接)是最好的方法。

不幸的是,GCP 的 VPN 不提供所需的功能(仅 Site2site 连接),因此我们无法使用它。

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

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

在我看来,如果您在 GCP 中托管 Open VPN 服务器,它会更加优雅和简单,但不一定更便宜。

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