【问题标题】:Routing traffic to kubernetes cluster将流量路由到 Kubernetes 集群
【发布时间】:2017-09-19 18:18:19
【问题描述】:

我有一个与 Kubernetes 网络相关的问题。

我有一个微服务(比如 numcruncherpod)在一个通过端口 9000 服务请求的 pod 中运行,并且我创建了一个相应的 NodePort 类型的服务(numcrunchersvc) 并且该服务暴露的节点端口是30900

我的集群有 3 个具有以下 IP 的节点:

  1. 192.168.201.70,
  2. 192.168.201.71
  3. 192.168.201.72

我将通过反向代理 (nginx) 将流量路由到我的集群。正如我在 nginx 中所了解的那样,我需要指定所有这些集群节点的 IP 才能将流量路由到集群,我的理解是否正确?

我担心的是,由于 nginx 不了解集群,因此决定流量应该发送到的集群节点可能不是一个好的判断。那么有没有更好的方法将流量路由到我的 kubernetes 集群?

PS:我没有在任何云平台上运行集群。

【问题讨论】:

  • 根据您的问题,我了解到您希望 nginx 知道,给定一个 pod,它在哪个节点上是正确的?
  • @JavierSalmeron 不完全是。即使来自 nginx 的流量到达任何节点,它也会被路由到相应的 pod(即使 pod 没有在该节点上运行),但这将是一个额外的跃点。所以我猜 LB 本身是集群的一部分(比如使用服务类型 Ingress)可能会更好。

标签: kubernetes


【解决方案1】:

这个答案有点晚,有点长,所以在开始之前我请求原谅。 :)

对于未在云提供商上运行 kubernetes 集群的人,有 4 种不同的选项可将集群内运行的服务暴露给外部世界。

  1. type: NodePort 的服务。这是最简单和默认的。 Kubernetes 为您的服务分配一个随机端口。集群中的每个节点都侦听到此特定端口的流量,然后将该流量转发到支持该服务的任何一个 Pod。这通常由 kube-proxy 处理,它利用 iptables 和使用循环策略的负载平衡。通常,由于此设置的 UX 并不漂亮,人们经常添加一个外部“代理”服务器,例如 HAProxy、Nginx 或 httpd 来监听单个 IP 上的流量并将其转发到这些后端之一。这是你,OP,描述的设置。

  2. 比这更进一步的是使用type: ExternalIP 的服务。这与NodePort 服务相同,除了它还让 kubernetes 在所有 kubernetes 节点上添加一个附加规则,即“到达目标 IP == 的所有流量都必须转发到 pod ”。这基本上允许您将任意 IP 指定为服务的“外部 IP”。只要发往该 IP 的流量到达集群中的一个节点,它就会被路由到正确的 Pod。但是,将流量传输到任何节点是您作为集群管理员的责任。这里的好处是,如果您指定您的一个节点(例如您的一个主节点)的物理接口之一的 IP,您不再需要运行 haproxy/nginx 设置。此外,您将跳数减少了 1 个。

  3. type: LoadBalancer 的服务。这种服务类型使裸机集群与云提供商平起平坐。一个功能齐全的负载均衡器提供商能够从预定义的池中选择 IP,自动将其分配给您的服务并将其发布到网络,前提是它已正确配置。当涉及到裸机上的 kubernetes 网络时,这是您将拥有的最“无缝”的体验。大多数 LoadBalancer 提供程序实现使用 BGP 与上游 L3 路由器进行通信和通告。 Metallb 和 kube-router 是适合这一细分市场的两个 FOSS 项目。

  4. Kubernetes 入口。如果您的要求仅限于 L7 应用程序,例如 REST API、HTTP 微服务等。您可以设置一个 Ingress 提供程序(nginx 就是这样一个提供程序),然后为您的所有微服务配置入口资源,而不是服务资源。您部署入口提供程序并确保它具有外部可用且可路由的 IP(例如,您可以将其固定到主节点,并使用该节点的物理接口 IP)。使用 ingress 而不是服务的优势在于,ingress 对象本机理解 HTTP mircoservices,您可以进行更智能的健康检查、路由和管理。

人们通常将 (1)、(2)、(3) 与 (4) 结合起来,因为前 3 个是 L4 (TCP/UDP) 而 (4) 是 L7。因此,诸如 URL 路径/基于域的路由、SSL 终止等事情由入口提供商处理,IP 生命周期管理和路由由服务层负责。

对于您的用例,理想的设置包括:

  1. 您的微服务部署,在您的 pod 上具有运行状况端点
  2. Ingress 提供程序,以便您可以调整/自定义您的路由/负载平衡以及用于 SSL 终止、域匹配等。
  3. (可选):使用LoadBalancer 提供程序来前置您的 Ingress 提供程序,这样您就不必手动配置 Ingress 的网络。

【讨论】:

    【解决方案2】:

    正确。您可以将流量路由到任何或所有 K8 minions。如有必要,K8 网络层将转发给适当的 minion。

    例如,如果你只运行一个 pod,nginx 很可能会循环请求。当请求命中一个没有运行 pod 的 minion 时,请求将被转发到确实运行 pod 的 minion。

    如果你运行 3 个 pod,每个 minion 上一个,请求将由任何从 nginx 获取请求的 minion 处理。

    如果您在每个 minion 上运行多个 pod,则请求将轮询到每个 minion,然后轮询到该 minion 上的每个 pod。

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2021-04-10
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多