将流量路由到kubernetes群集

时间:2017-09-19 18:18:19

标签: kubernetes

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

我有一个微服务(比如 numcruncherpod )在一个正在通过端口9000提供请求的pod中运行,我创建了一个类型NodePort的相应服务(< em> numcrunchersvc )和此服务公开的节点端口是30900

我的群集有3个节点,其中包含以下IP:

  1. 192.168.201.70,
  2. 192.168.201.71
  3. 192.168.201.72
  4. 我将通过反向代理(nginx)将流量路由到我的集群。据我所知,在nginx中我需要指定所有这些集群节点的IP来将流量路由到集群,我的理解是否正确?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

  2. 从此开始的步骤是使用type: ExternalIP的服务。这与NodePort服务相同,除了它还获得kubernetes在所有kubernetes节点上添加额外规则,其中显示&#34;到达目的地IP的所有流量==必须被转发到豆荚&#34;。这基本上允许您将任意IP指定为&#34;外部IP&#34;为了服务。只要发往该IP的流量到达群集中的某个节点,它就会路由到正确的Pod。但是,作为集群管理员,您有责任将流量传输到任何节点。这里的优点是,如果您指定其中一个节点(例如一个主节点)的物理接口之一的IP,则不再需要运行haproxy / nginx设置。此外,您将跳数减少了一个。

  3. type: LoadBalancer的服务。此服务类型使裸机群集与云提供商平分。一个功能完备的负载均衡器提供商能够从预定义的池中选择IP,自动将其分配给您的服务并将其通告给网络,假设它已正确配置。这是最无缝的&#34;在裸机上讨论kubernetes网络时遇到的经验。大多数LoadBalancer提供程序实现使用BGP与上游L3路由器进行通信和通告。 Metallb和kube-router是适合这个利基的两个FOSS项目。

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

  5. 通常人们将(1),(2),(3)中的一个与(4)组合,因为前3个是L4(TCP / UDP),而(4)是L7。因此,URL路径/基于域的路由,SSL终止等内容由入口提供商处理,IP生命周期管理和路由由服务层负责。

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

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

答案 1 :(得分:1)

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

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

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

如果你在每个minion上运行多个pod,请求将循环到每个minion,然后循环到该minion上的每个pod。