我们将与一家公司合作,他们使用 VPN 将其网络 (A) 连接到包含 kubernetes 集群的 Google Cloud VPC (B)。他们将通过此隧道将所有流量路由到我们的网络。
为了测试这一点,我们使用 Google VPN 连接了两个 Google VPC 网络(一个模仿 (A),一个模仿 (B))。连接正常,虚拟机可以使用内部 IP 相互 ping 通。A 的 BGP 通告 0.0.0.0/0,B 通告其子网。两者都有允许彼此子网进入的防火墙规则。
内部网络使用公共 DNS 并将 IP 解析为公共 IP。
我正在寻找一种方法来做两件事:
- 将我们的云服务的公共 IP 路由到本地(内部负载平衡器) IP。这样 A 就可以使用公网 IP 访问我们在 B 中的 k8s 集群。
- 将目的地为公共互联网的流量路由到互联网,以便网络 A 可以通过 VPN 隧道访问互联网。
我研究过多种 Google 服务(NAT 网关、内部负载均衡器、路由器等),但(由于缺乏经验)找不到适合这些问题的解决方案。使用 Google 云原生解决方案是否可行?
答案1
在与 Google 支持人员联系后,他们为我提供了一个可行的解决方案。事实上,仅使用 Google Cloud 原生工具是不可能实现的,但可以让它发挥作用。
所以第一部分是通过 VPN 隧道连接互联网:
需要在负责互联网流量的项目中设置自定义 NAT 网关。Google 提供了相关说明这里,它甚至可以是 HA,并且有一个 terraform 模块和大量示例假如。
完成后您需要添加一些路线:
添加一条路由,将所有指定为 0.0.0.0/0 的流量发送到 NAT 网关虚拟机
添加仅适用于 NAT 网关 VM(使用实例标签)的较低优先级路由,并将下一跳设为默认 Internet 网关。
如果您向本地网络通告 0.0.0.0/0,它现在会将所有流量通过您的云网络发送到互联网。我想在这里提一下,现在不可能再直接连接到本地网络,因为它对所有流量都使用 NAT 网关(可以通过向本地网络添加针对原始 IP 的路由来绕过)。
第二部分是将指定给外部 IP 的流量重定向到内部 IP(例如我上面问题中的 kubernetes 集群):
首先你需要添加内部负载均衡器到您的集群。
由于所有流量都通过 NAT 网关虚拟机路由,因此您可以在虚拟机上手动将 PREROUTING 规则添加到 iptable:
sudo iptables -t nat -A PREROUTING -d $EXTERNAL_LOAD_BALANCER_IP -j DNAT --to-destination $INTERNAL_LOAD_BALANCER_IP
如果您将$ORIGINAL_DESTINATION
集群的外部负载均衡器 IP 和$INTERNAL_LOAD_BALANCER_IP
内部负载均衡器 IP 设置为外部负载均衡器 IP,则所有应该以外部负载均衡器为目标的流量现在都将到达内部负载均衡器。这也意味着无需添加自定义 DNS。
答案2
请注意,目前不支持这种连接。这是内部集群与 GKE Master 连接方式的限制。节点和 Master 使用 VPC 对等连接 [1] 私下相互通信;但是,对等 VPC 网络在管理上保持独立,并且路由、防火墙、VPN 和其他流量管理工具在每个 VPC 网络中单独管理和应用 [2]。因此,通过 VPN 建立的连接无法到达通过对等连接的 Master。
此外,外部 IP 无法通过 VPN 隧道进行路由,目前,Google Cloud VPN 仅支持使用内部 IP 路由数据包。
我们有一个现有的功能请求,已转发给我们的工程团队,您可以通过访问公共问题跟踪器上的此帖子[3]进行跟踪。
[1]https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#overview [2]https://cloud.google.com/vpc/docs/vpc-peering#key_properties [3]https://issuetracker.google.com/69449519