【问题标题】:Expose services inside Kubernetes cluster behind NAT在 NAT 后面公开 Kubernetes 集群内的服务
【发布时间】:2020-06-15 11:02:57
【问题描述】:

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

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

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine nat gke-networking


    【解决方案1】:

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

    可能的服务类型:

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

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

    • LoadBalancer:此类型在每个节点上打开一个端口,与 NodePort 一样,还分配一个Google Cloud Load Balancer service,并将该服务配置为访问在 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

    【讨论】:

      【解决方案2】:

      在 NAT 之后运行的代理服务器?

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

      如你所见here:

      Cloud NAT 不会从 互联网。仅对作为响应到达的数据包执行 DNAT 到出站数据包。

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

      如果您想公开集群中的任何应用程序,使其可用于其他Pods,请使用简单的ClusterIP Service,这是默认类型,即使您未指定,它也会按原样创建它的类型。

      【讨论】:

      • 谢谢!如果我想将代理服务器暴露给互联网,而不仅仅是同一个集群中的 Pod,该怎么办?本质上,我想要一个代理将流量转发到 3rd-party 服务,并且我需要一个固定的静态 IP 来加入白名单。
      • 如果你想将你的代理服务器暴露在互联网上,你不会使用 Cloud NAT。 Loadbalancer 是您的正确选择。
      • Here 您可以找到关于外部负载均衡器的更详细描述。您可以使用以下命令轻松创建它:kubectl expose deployment proxy-server-deployment --name=proxy-server-loadbalancer --type=LoadBalancer。默认情况下,它将在端口80 上公开您的代理服务器。如果它在监听 8080 并且您希望它也可以在您的公共 IP 上的此端口上使用,请将 --port=8080--target-port=8080 添加到上述命令。
      猜你喜欢
      • 2021-12-21
      • 2019-01-05
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多