首页 文章

将流量路由到kubernetes集群

提问于
浏览
1

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

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

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

  • 192.168.201.70,

  • 192.168.201.71

  • 192.168.201.72

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

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

PS:我没有在任何 Cloud 平台上运行集群 .

2 回答

  • 1

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

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

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

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

  • 1

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

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

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

    • 从此开始的步骤是使用 type: ExternalIP 服务 . 这与 NodePort 服务相同,不同之处在于它还获取kubernetes在所有kubernetes节点上添加一条额外规则,该节点显示“为目的地IP到达的所有流量==还必须转发到服务的pod ". This basically allows you to specify any arbitrary IP as the "外部IP” . 只要发往该IP的流量到达群集中的某个节点,它就会路由到正确的Pod . 但是,作为集群管理员,您有责任将流量传输到任何节点 . 这里的优点是,如果指定其中一个节点(例如一个主节点)的物理接口之一的IP,则不再需要运行haproxy / nginx设置 . 此外,您将跳数减少一个 .

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

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

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

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

    • 微服务的部署,在您的pod上有 Health endpoints

    • Ingress提供程序,以便您可以调整/自定义路由/负载 balancer 以及用于SSL终止,域匹配等 .

    • (可选):使用 LoadBalancer 提供商来阻止您的Ingress提供商,这样您就不会使用网络 .

相关问题