3

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

现在,如果我想在这个集群上部署一个代理服务器来进行基本的流量转发,我该如何公开代理服务器“端点”?或者更一般地说,如果我将服务部署到这个 GKE 集群,我该如何公开它?

4

2 回答 2

1

Proxy server running behind NAT ?

Bad idea, unless it is only for your kubernetes cluster workload, but you didn't specify anywhere that it should be reachable only by other Pods running in the same cluster.

As you can read 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.

So it is not meant to be reachable from outside.

If you want to expose any application within your cluster, making it available for other Pods, use simple ClusterIP Service which is the default type and it will be created as such even if you don't specify its type at all.

于 2020-03-03T14:31:42.717 回答
1

通常,要公开在 Kubernetes 集群上运行的服务端点,您必须使用其中一种服务类型,因为 Pod 具有内部 IP 地址并且无法在外部寻址。

可能的服务类型:

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

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

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

  • ExternalName:此类型将Kubernetes内部DNS服务器配置为指向指定的IP地址(在集群内部提供动态DNS条目以连接外部服务)。

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

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

于 2020-03-08T22:05:33.253 回答