将流量路由到kubernetes集群

sat*_*esh 2 kubernetes

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

我有一个在通过端口提供请求的Pod中运行的微服务(例如numcruncherpod9000,并且我已经创建了一个相应的服务类型NodePortnumcrunchersvc)和该服务公开的节点端口30900

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

  1. 192.168.201.70,
  2. 192.168.201.71
  3. 192.168.201.72

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

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

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

ffl*_*ing 6

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

对于不在Cloud Providers上运行kubernetes集群的人,有4种不同的选项可以将集群内部运行的服务暴露给外部环境。

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

  2. 与此相提并论的是使用的服务type: ExternalIP。该NodePort服务与该服务相同,不同之处在于它还使kubernetes在所有kubernetes节点上添加一条附加规则,即“到达目标IP ==的所有流量必须基本上可以让您将任何任意IP指定为服务的“外部IP”。只要发往该IP的流量到达群集中的节点之一,它将被路由到正确的位置。但是,作为集群管理员,您必须负责将流量传送到任何节点,如果您指定了一个物理接口之一的IP,则不再需要运行haproxy / nginx设置。节点数(例如主节点之一),此外,将跳数减少了1。

  3. 的服务type: LoadBalancer。这种服务类型使裸机集群与云提供商处于同等地位。一个功能齐全的负载平衡器提供商可以从预定义的池中选择IP,自动将其分配给您的服务,并在正确配置的情况下将其发布到网络。对于裸机上的kubernetes网络,这是您将获得的最“无缝”的体验。大多数LoadBalancer提供程序实现都使用BGP与上游L3路由器进行通话和通告。Metallb和kube-router是适合此领域的两个FOSS项目。

  4. Kubernetes入口。如果您的需求仅限于REST API,HTTP微服务等L7应用程序,则可以设置单个Ingress提供程序(nginx是这样的提供程序之一),然后为所有微服务配置Ingress资源,而不是服务资源。部署入口提供程序,并确保它具有外部可用的可路由IP(例如,可以将其固定到主节点,并对该节点使用物理接口IP)。与服务相比,使用Ingress的优点是Ingress对象可以原生理解HTTP mircoservices,并且可以执行更智能的运行状况检查,路由和管理。

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

对于您的用例,理想的设置将涉及:

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


Dre*_*rew 2

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

例如,如果您只运行一个 pod,nginx 很可能会循环处理请求。当请求到达没有运行 pod 的 minion 时,请求将被转发到运行 pod 的 minion。

如果您运行 3 个 Pod,每个 Minion 一个,则该请求将由从 nginx 获取请求的任何 Minion 处理。

如果您在每个 Minion 上运行多个 pod,则请求将循环发送到每个 Minion,然后循环发送到该 Minion 上的每个 pod。