无法从一个集群访问 Kubernetes 服务到另一个集群(通过 VPC 对等互连)
Unable to access Kubernetes service from one cluster to another (over VPC peerng)
我想知道是否有人可以帮助解决我的问题,这是设置:
- 我们在 GKE 中有 2 个独立的 kubernetes 集群,运行在 v1.17 上,它们每个都位于一个单独的项目中
- 我们已经在两个项目之间设置了 VPC 对等
- 在集群 1 上,我们有 'service1' 由 内部 HTTPS 负载平衡器 公开,我们不希望它成为 public
- 在集群 2 上,我们打算能够通过内部负载均衡器访问 'service1',它应该通过两个项目之间的 VPC 对等连接来执行此操作
这是问题所在:
当我通过集群 2 上的 GKE 节点上的 SSH 连接时,我可以成功地 运行 curl 请求访问集群 1 上的 https://service1.domain.com 运行ning,并获得预期的响应,所以流量肯定是从集群 2 > 集群 1 路由的。但是,当我 运行 从 POD 执行相同的 curl 命令时,运行 在 GKE 节点上执行相同的 curl 请求超时。
我有 运行 尽可能多的故障排除,包括 telnet、traceroute 等,我真的很困惑为什么会这样。如果有人能阐明这里的区别,那就太好了。
我确实想知道 pod 网络是否以某种方式通过集群 public IP 而不是通过 VPC 对等连接转发流量。
您遇到的问题似乎与此 中提到的问题相似,也许您的 pods 使用的 IP 超出了 VPC 范围,因此无法访问对等 VPC?
更新:在 Google 云中,我尝试从另一个启用了 VPC 本地网络的集群访问该服务,我相信这允许 pods 使用 VPC 路由和可能的内部 IP .
问题已解决:-)
如其中一个答案所述 IP aliases (VPC-native) 应该开箱即用。如果使用基于路由的 GKE 集群而不是 VPC-native,您将需要使用自定义路由。
根据这个document
By default, VPC Network Peering with GKE is supported when used with
IP aliases. If you don't use IP aliases, you can export custom routes
so that GKE containers are reachable from peered networks.
这个document
中也有说明
If you have GKE clusters without VPC native addressing, you might have
multiple static routes to direct traffic to VM instances that are
hosting your containers. You can export these static routes so that
the containers are reachable from peered networks.
看来您没有使用“VPC-native”集群,您需要的是“IP 伪装”。
来自 this 文档:
“GKE 集群使用 IP 伪装,以便集群外部的目的地仅接收来自节点 IP 地址而不是 Pod IP 地址的数据包。这在期望仅接收来自节点 IP 地址的数据包的环境中很有用。”。 =20=]
您可以使用 ip-masq-agent
或 k8s-custom-iptables
。在此之后,它将起作用,因为它就像您从节点而不是 pod 内部进行调用一样。
我想知道是否有人可以帮助解决我的问题,这是设置:
- 我们在 GKE 中有 2 个独立的 kubernetes 集群,运行在 v1.17 上,它们每个都位于一个单独的项目中
- 我们已经在两个项目之间设置了 VPC 对等
- 在集群 1 上,我们有 'service1' 由 内部 HTTPS 负载平衡器 公开,我们不希望它成为 public
- 在集群 2 上,我们打算能够通过内部负载均衡器访问 'service1',它应该通过两个项目之间的 VPC 对等连接来执行此操作
这是问题所在: 当我通过集群 2 上的 GKE 节点上的 SSH 连接时,我可以成功地 运行 curl 请求访问集群 1 上的 https://service1.domain.com 运行ning,并获得预期的响应,所以流量肯定是从集群 2 > 集群 1 路由的。但是,当我 运行 从 POD 执行相同的 curl 命令时,运行 在 GKE 节点上执行相同的 curl 请求超时。
我有 运行 尽可能多的故障排除,包括 telnet、traceroute 等,我真的很困惑为什么会这样。如果有人能阐明这里的区别,那就太好了。
我确实想知道 pod 网络是否以某种方式通过集群 public IP 而不是通过 VPC 对等连接转发流量。
您遇到的问题似乎与此
更新:在 Google 云中,我尝试从另一个启用了 VPC 本地网络的集群访问该服务,我相信这允许 pods 使用 VPC 路由和可能的内部 IP .
问题已解决:-)
如其中一个答案所述 IP aliases (VPC-native) 应该开箱即用。如果使用基于路由的 GKE 集群而不是 VPC-native,您将需要使用自定义路由。
根据这个document
By default, VPC Network Peering with GKE is supported when used with IP aliases. If you don't use IP aliases, you can export custom routes so that GKE containers are reachable from peered networks.
这个document
中也有说明If you have GKE clusters without VPC native addressing, you might have multiple static routes to direct traffic to VM instances that are hosting your containers. You can export these static routes so that the containers are reachable from peered networks.
看来您没有使用“VPC-native”集群,您需要的是“IP 伪装”。
来自 this 文档: “GKE 集群使用 IP 伪装,以便集群外部的目的地仅接收来自节点 IP 地址而不是 Pod IP 地址的数据包。这在期望仅接收来自节点 IP 地址的数据包的环境中很有用。”。 =20=]
您可以使用 ip-masq-agent
或 k8s-custom-iptables
。在此之后,它将起作用,因为它就像您从节点而不是 pod 内部进行调用一样。