我们正在尝试在 Kubernetes 集群中建立一个 OpenVPN 远程访问服务器,以取代之前托管在本地防火墙上的服务。
我们的更广泛的网络部分位于 GCP/GCE 上,通过 IPsec 将动态 BGP 路由到我们的内部站点。
目前,在现有的内部 OpenVPN 服务器上,分配给连接客户端的 IP 地址可以从网络的其余部分路由,因此我们可以在没有 NAT 的情况下与它们进行入站和出站通信。
我们希望将服务迁移到 Kubernetes Engine,因为我们的所有其他 Linux 工作负载都将迁移到那里,而且我们更喜欢 DevOps 风格的工作流程,用它来管理可用性和恢复。
那么,假设我们的 OpenVPN 容器有客户端连接到 10.30.50.0/24 范围,Pod IP 动态分配在 10.50.30.0/20,我们如何告诉 GCP 将 10.30.50.0/24 范围路由到 Pod 中的 OpenVPN 服务?这可能吗?
一个想法是在 Pod 启动时调用 GCE API 来添加指向 Pod IP 的静态路由,但我不确定流量是否会传输集群并到达 Pod 中的 OpenVPN。
答案1
无法在 GCP 中创建路由以将子网 10.30.50.0/24 从辅助 IP 范围 10.30.0.0/20 路由到使用 OpenVPN。因此,有两种可能的解决方案可以实现您想要的效果:
1.- 您可以在 GCP 中创建一个 VM 实例来设置 OpenVPN 隧道。然后您可以添加一个静态路由在 GCP 中使用此 VM 实例的 nexthop。与 OpenVPN 实例位于同一 VPC 网络中的 GKE 集群将使用它作为 nexthop,因此来自节点的所有流量都将使用 OpenVPN 隧道。如果您不想通过 VPN 实例重定向来自集群中所有节点的所有流量,您可以指定标签并在创建集群或节点池期间附加它。
- 您可以像上例一样创建一个虚拟机实例,而不是配置下一跳为“Open VPN”实例的默认路由,而是需要在 GKE 集群的节点内配置 iptables。例如,配置一个 iptable,使所有到目标 IP 地址和源 IP 地址 10.30.50.0/24 的流量都使用下一跳“OpenVPN 实例的 IP 地址”。
请记住,对于这两种解决方案,您必须启用别名 IP在每个 GKE 集群中允许从本地到 pod 的通信。