我看到 kubernetes 可以使用 ClusterIP 和 NodePort 以及 LoadBalancing。对于负载平衡,它需要云。如果我没有云提供商,如何在节点之间进行负载均衡?!
您可能知道,最简单的方法是将Service 设置为输入NodePort,这会向kube-proxy 发出信号,以便在 上侦听30000-32767 默认范围内的随机端口每个节点。在后台,这个随机端口将被映射(端口转发)到Service 端口。
您现在可以将流量(比如30001 的随机端口)发送到任何 个节点,您将在 Pod 之间实现内部负载平衡。如果你现在启动一个例如VM 在与节点相同的网络中或在可以到达节点并跨 node-{a,b,c}:30001 设置负载平衡的网络中。
您可以,虽然不推荐有很多充分的理由,基本上只需将流量发送到多节点集群中的一个节点 (node-a:30001),流量仍将在内部进行负载平衡.这是可能的,因为kube-proxy 的所有实例都知道所有 Pod(或 Endpoints 在Service 的上下文中)在任何给定时间的位置。
请注意,kube-proxy 和 iptables(可能会有所不同!)是在所有情况下实现 Service 对象的组件,但类型为 LoadBalancer 时除外。 LoadBalancer 请求将被分派到内置或外部云控制器管理器。
Ingress 对象的存在是为了在一个或多个 Service 的前面添加 L7 逻辑,但正如您所见,如果没有 Ingress Controller 实现它,Ingress 将毫无价值。 HAProxy 和 Nginx Ingress 控制器或多或少会为您做同样的事情,但不会在短期内解决您的问题。是的,您将拥有负载平衡,但不是您想象的那样。
如果您没有任何形式的(私有/公共)云与 k8s 集成来支持您的 k8s 集群,那么 Nginx 和 HAProxy Ingress 控制器将只是在您的集群中运行的另一个 Service。你当然可以做一些智能的事情,比如代理、URL 路由、主机名匹配等。
如果您处于非云提供商环境(例如仅裸机)中,需要回答的问题之一是:如何在 Service 类型的 EXTERNAL-IP 字段中获取 IP 地址987654348@? 请注意,我假设是 kubectl get service 命令的输出。 一个很好的答案是,正如此处的 cmets 中所述:MetalLB。
MetalLB 将让您自动化配置 Service 类型为 LoadBalancer 的外部 IP。但您也可以手动配置Service 对象的externalIPs 字段,并将其设置为在您的环境中有意义的IP 地址。感谢@danielrubambura 指出这一点!
另请参阅官方 Nginx 控制器文档中的 this 页面,该页面可以阐明在某些情况下如何以及为何使用 MetalLB。
我将放弃 Nginx 和 HAProxy 控制器之间的比较,因为我认为在这种情况下这并不重要。最后,他们会通过Ingress 对象为您提供根据需要配置的 Nginx 或 HAProxy Pod,例如根据传入请求中的Host 标头路由到不同的Service。
希望这能把事情弄清楚一点!