【问题标题】:Kubernetes Ingress and Node FailureKubernetes 入口和节点故障
【发布时间】:2021-05-27 09:15:05
【问题描述】:

我正在尝试了解来自集群外部的调用的 Kubernetes 高可用性。 (对于我的新本地 Kubernetes 集群)

例如:桌面应用程序需要调用托管在 Kubernetes 中的服务。

我看到这可能发生的两种主要方式,NodePort 和 Ingress。

节点端口

NodePort 发生节点故障时会发生什么似乎相当明显。任何使用新离线节点作为其寻址节点的调用都将失败。如果您使用的是 NodePort,则需要确保您有某种方法可以检测到您正在使用的节点已关闭,并将流量转移到另一个节点。 (并恢复在您检测到停机之前发生的任何丢失的流量。)

这似乎是负载均衡器的工作。它可以进行健康监控并将流量发送到已启动的节点。

入口

我不太确定 Ingress 控制器和 Ingress 资源是如何工作的。这里似乎有一点魔力。 Ingress 控制器是否在后台使用 NodePort?我看到很多关于负载均衡器平衡器的假设,这些假设在我阅读的帖子中没有解释。是否预计在集群外部会有一个负载均衡器?

在哪种情况下,带有负载均衡器的 NodePort 和带有负载均衡器的 Ingress 有什么区别?负载均衡器向调用系统提供单个 URL,然后尽最大努力使调用到达启动的 Kubernetes 节点(通过 NodePort 或 Ingress 控制器)。 (这让我想知道,如果两者都确实需要负载平衡器来隐藏被调用的节点,为什么两者都存在。)

但是我再次感到困惑,因为您使用单个 URL 发送到 Ingress 资源,那么负载均衡器如何决定节点?

在我看来,Kubernetes 似乎只在集群内部具有高可用性。在集群外部,调用者的工作是通过您自己的 ping 系统或负载均衡器确保他们将要寻址的节点。

Kubernetes 是否有任何功能可以帮助减少节点停机时间?从解决集群的桌面应用程序的角度来看,而不是从保持服务正常运行的 pod 的角度来看。

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    是的,你是对的,入口控制器将从集群中创建 LoadBalancer。

    入口控制器将管理集群内的入口对象,您可以重定向流量并在集群内管理它。

    Kubernetes 是否有任何功能可以帮助减少节点停机时间

    如果您的一个节点出现故障,则跨节点运行多个副本,另一个节点上的其他 POD 将启动并提供服务,直到旧的不健康节点恢复正常状态。

    对不起,我不明白(在这种情况下,带有负载均衡器的 NodePort 和带有负载均衡器的 Ingress 之间有什么区别?)单个 URL 节点端口和入口部分的含义。如果你想用简单的语言理解入口,你可以将其视为 NGINX。您可以使用不同的 SSL/TLS 证书定义多站点域和重定向规则。

    【讨论】:

      【解决方案2】:

      这个问题有几个部分 - 依次回答。 Kubernetes 中默认的服务类型有 ClusterIP、NodePort 和 LoadBalancer。

      什么是服务?

      在 Kubernetes 中,Service 是一种抽象,它定义了一组逻辑 Pod 和访问它们的策略(有时这种模式称为微服务)。

      基本上,它是一组 pod 前面的逻辑负载均衡器,由 pod 标签确定。

      ClusterIP 如何工作?

      ClusterIP 是一个内部服务,这意味着分配给该服务的 IP 地址是集群内部的。它通过 kube-proxy 中的一些魔法起作用(如果您想了解更多信息,请阅读 documentation)。死 pod 会自动从负载均衡中移除。

      NodePort 是如何工作的?

      NodePort 是一个外部服务,它通过打开主机中的端口来工作。一个 ClusterIP 被自动创建(reference),通过更多的 kube-proxy 魔术,到达 NodePort 的流量被发送到 ClusterIP,它又被发送到适当的后端 pod。

      如果您正在访问其 NodePort 的节点出现故障,您将无法访问您的应用程序,这是正确的。

         traffic
            |
            v
      --------------    --------------    --------------
      |            |    |            |    |            |
      |  NodePort  |    |  NodePort  |    |  NodePort  |
      |            |    |            |    |            |
      --------------    --------------    --------------
      

      LoadBalancer 是如何工作的?

      LoadBalancer 是一个外部服务,它通过在每个节点上的开放 NodePort 之间对流量进行负载平衡来工作。这意味着在幕后,当您创建 LoadBalancer 时,会创建一个 NodePort。通常,这适用于云提供商:创建云提供商负载均衡器资源,将流量路由到每个节点上的 NodePort。云提供商负载均衡器中内置了运行状况检查,以确定哪些节点已启动。

                           traffic
                              |
                              v
                    --------------------
                    |                  |
                    |  Cloud Provider  |
                    |  Load Balancer   |
                    |                  |
                    --------------------
            |-----------------|------------------|
            v                 v                  v
      --------------    --------------    --------------
      |            |    |            |    |            |
      |  NodePort  |    |  NodePort  |    |  NodePort  |
      |            |    |            |    |            |
      --------------    --------------    --------------
      

      入口控制器如何工作?

      入口控制器(通常)是在集群上运行的软件组件,它提供 L7 路由(与 LoadBalancer 提供的 L4 路由相反)。通常,这会自动创建一个 LoadBalancer 服务,因为入口控制器是在集群内运行的一组 pod。

      流程发生如下:

      图片借自here

      请注意,pod 前面的绿色箭头实际上表示使用 ClusterIP 进行负载平衡。

      我应该为外部流量使用什么?

      使用 LoadBalancer 或入口控制器。不要完全按照您描述的原因使用 NodePort:您无法知道节点已关闭。

      【讨论】:

      • 感谢您的回复。但我仍然很困惑。入口控制器流量仍必须流向其中一个节点。即使使用入口控制器。入口如何处理节点中断。如果在入口期间使用单个 url,外部负载均衡器如何知道它正在访问哪个节点?
      • 入口控制器使用外部负载均衡器(通常 - 根据特定控制器有例外,但这适用于 nginx、traefik 等)。因此,它依赖于外部负载均衡器来处理节点中断(当然,假设在多个节点上有入口控制器 pod,否则您会有不同的问题)。
      • 外部负载均衡器并不关心它击中的是哪个节点。它可以命中任何活动节点,并且 kube-proxy 将进行适当的路由。后端有一个内置的健康检查,因此外部负载均衡器将知道不路由到死节点。
      • 入口控制器对应的单个url/IP地址实际上是和LoadBalancer关联的。基于上述,流程为:外部流量 -> 外部负载均衡器 -> Kubernetes LoadBalancer -> NodePort -> 入口控制器 ClusterIP -> 入口控制器 pod(根据路径/主机确定适当的路由)-> 应用程序 ClusterIP(确切一个由控制器 pod 确定)-> 应用程序 pod。
      • 所以最终所有的Inbound流量都使用一个节点端口进入Kubernetes集群。但是 Ingress 只需要一个对多个服务(因为它在调用进入集群后进行服务路由)。使用普通节点端口系统时,每个服务都需要一个节点端口。 (但两者都依赖节点端口进入 Kubernetes 集群。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      相关资源
      最近更新 更多