【问题标题】:Unable to access Kubernetes service from one cluster to another (over VPC peerng)无法从一个集群访问 Kubernetes 服务到另一个集群(通过 VPC 对等互连)
【发布时间】:2021-06-10 14:14:25
【问题描述】:

我想知道是否有人可以帮助解决我的问题,设置如下:

  • 我们在 GKE 中有 2 个独立的 Kubernetes 集群,在 v1.17 上运行,它们各自位于一个单独的项目中
  • 我们已经在两个项目之间建立了 VPC 对等
  • 在集群 1 上,我们有一个由内部 HTTPS 负载平衡器公开的“service1”,我们不希望它公开
  • 在集群 2 上,我们打算能够通过内部负载均衡器访问“service1”,并且它应该通过两个项目之间的 VPC 对等连接来完成此操作

问题来了: 当我在集群 2 上的 GKE 节点上通过 SSH 连接时,我可以成功运行 curl 请求以访问在集群 1 上运行的 https://service1.domain.com,并获得预期的响应,因此流量肯定是从集群 2 > 集群 1 路由的。但是,当我从 POD 运行相同的 curl 命令并在 GKE 节点上运行时,相同的 curl 请求会超时。

我已经尽可能多地进行了故障排除,包括 telnet、traceroute 等,但我真的很困惑为什么会这样。如果有人能阐明这里的区别,那就太好了。

我确实想知道 pod 网络是否以某种方式通过集群公共 IP 而不是通过 VPC 对等连接转发流量。

【问题讨论】:

  • 听起来像是路由问题。手动创建路由,因此对 cluster2 pod 范围的请求将发送到 cluster2 节点。 VPC 对等互连支持次要范围,但要丢弃。

标签: kubernetes networking cloud cluster-computing google-kubernetes-engine


【解决方案1】:

看来您没有使用“VPC-native”集群,而您需要的是“IP 伪装”。

来自this 文档: “GKE 集群使用 IP 伪装,因此集群外部的目的地只接收来自节点 IP 地址而不是 Pod IP 地址的数据包。这在期望只接收来自节点 IP 地址的数据包的环境中很有用。”

您可以使用ip-masq-agentk8s-custom-iptables。在此之后,它将起作用,因为它就像您从节点而不是 pod 内部进行调用一样。

【讨论】:

    【解决方案2】:

    正如其中一个答案IP aliases (VPC-native) 中提到的那样,应该可以开箱即用。如果使用基于路由的 GKE 集群而不是 VPC 原生集群,则需要使用自定义路由。

    据此document

    默认情况下,与 GKE 一起使用时支持 VPC 网络对等互连 IP 别名。如果不使用 IP 别名,可以导出自定义路由 以便 GKE 容器可以从对等网络访问。

    这在document中也有说明

    如果您有没有 VPC 原生寻址的 GKE 集群,您可能有 多个静态路由将流量引导到虚拟机实例 托管您的容器。您可以导出这些静态路由,以便 容器可从对等网络访问。

    【讨论】:

      【解决方案3】:

      更新:在谷歌云中,我尝试从另一个启用了 VPC 原生网络的集群访问服务,我相信这允许 pod 使用 VPC 路由和可能的内部 IP。

      问题解决了:-)

      【讨论】:

        【解决方案4】:

        您面临的问题似乎与SO question 中提到的问题相似,也许您的 pod 使用了 VPC 范围之外的 IP,因此无法访问对等 VPC?

        【讨论】:

          猜你喜欢
          • 2023-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-06
          • 2020-10-21
          • 2018-10-29
          • 2019-06-10
          相关资源
          最近更新 更多