在 NAT 后面公开 Kubernetes 集群内的服务

Expose services inside Kubernetes cluster behind NAT

我有一个使用 Cloud NAT 设置的 GKE 集群,因此来自任何 node/container 的向外流量都将具有相同的外部 IP。 (我在使用 3rd 方服务时需要这个用于白名单目的)。

现在,如果我想在这个做基本流量转发的集群上部署一个代理服务器,我该如何暴露代理服务器"endpoint"?或者更笼统地说,如果我将服务部署到这个 GKE 集群,我该如何公开它?

NAT 后面的代理服务器 运行 ?

坏主意,除非它仅用于您的 kubernetes 集群 工作负载,但您没有指定任何地方只能由其他 Pods 运行 在同一个集群中。

如你所见here:

Cloud NAT does not implement unsolicited inbound connections from the internet. DNAT is only performed for packets that arrive as responses to outbound packets.

所以它并不意味着可以从外面到达。

如果您想公开集群中的任何应用程序,使其可供其他 Pods 使用,请使用简单的 ClusterIP Service,这是默认类型,它将被创建为即使您根本不指定其类型也是如此。

通常,要在 Kubernetes 集群上公开服务端点 运行,您必须使用 Service Types 之一,因为 Pods 具有内部 IP 地址并且无法从外部寻址.

可能的服务类型:

  • ClusterIP:这也使用内部 IP 地址,因此无法从外部寻址。

  • NodePort:这种类型在您的 Kubernetes 集群中的每个节点上打开一个端口,并配置 iptables 将到达该端口的流量转发到提供实际服务的 Pods .

  • LoadBalancer:这种类型和NodePort一样在每个节点上都开一个端口,也分配一个Google Cloud Load Balancer service,并配置那个服务访问Kubernetes上开的端口节点(实际上是负载平衡您的操作 Kubernetes 节点之间的传入流量)。

  • ExternalName:该类型配置Kubernetes内部DNS服务器指向指定IP地址(提供集群内部动态DNS入口连接外部服务)

其中,NodePortLoadBalancer 可用于您的目的。使用简单的 NodePort 类型服务,您将需要 public 可访问的节点 IP 地址,并且分配的端口可用于通过集群的任何节点访问您的代理服务。由于您的任何一个节点都可能随时消失,因此只有当您的代理客户端知道如何切换到另一个节点 IP 地址时,这种服务访问才有用。或者您可以使用 LoadBalancer 类型的服务,在这种情况下,您可以使用配置的 Google 云负载均衡器的 IP 地址供您的客户端连接,并期望负载均衡器将流量转发到集群的 运行 节点中的任何一个,然后将流量转发到提供此服务的 Pods 节点之一。

为了让您的代理服务器作为客户端访问 Internet,您还需要某种 public IP 地址。您可以给 Kubernetes 节点 public IP 地址(在这种情况下,如果您有多个节点,您会看到多个源 IP 地址,因为每个节点都有自己的 IP 地址),或者如果您使用您的 Kubernetes 节点的私有地址,您需要一个源 NAT 功能,就像您已经使用的那样:Cloud NAT