设置Kubernetes负载均衡器服务的初学者指南。“Kubernetes负载均衡器”是一个非常宽泛的术语,可以指代多种事物。在本文中,我们将了解两种类型的负载均衡器:一种是用于将Kubernetes服务暴露给外界的负载均衡器,另一种是工程师用来平衡这些服务的网络流量负载的负载均衡器。继续阅读以了解处理Kubernetes负载均衡器的最佳实践。什么是Kubernetes负载均衡器?在Kubernetes中,容器被分组为具有共享存储和网络资源的pod,以及如何运行这些容器的规范。一组相关的Pod可以组成一个KubernetesService。由于pod不是持久的——Kubernetes自动创建和销毁它们——它们的IP地址也不是持久的。要公开Pod,您可以使用称为服务的Kubernetes资源。Kubernetes服务允许您公开一组pod以供外部或内部使用。您可以从多种类型的服务中进行选择,因此这里有一个快速概览以帮助您入门。Kubernetes服务概述ClusterIP-这是一种默认类型的K8s服务,仅在内部公开一组pod。以下是ClusterIP服务的YAML定义示例:apiVersion:v1kind:Servicemetadata:name:my-internal-servicespec:selector:app:my-apptype:ClusterIPports:-name:httpport:80targetPort:80protocol:TCPClusterIP用于内部应用程序通信,在集群外不可用。NodePort-该服务在集群中的每个节点IP上公开给定端口。示例YAML定义:apiVersion:v1kind:Servicemetadata:name:my-nodeport-servicespec:selector:app:my-apptype:NodePortports:-name:httpport:80targetPort:80nodePort:30000protocol:TCP请注意,NodePort服务有很多缺点:每个都有每个端口只能是一项服务您只能使用端口30000-32767,如果您的节点/VMIP地址发生变化,您需要注意这一点。这就是为什么不建议将其用于生产用例。LoadBalancer–此服务使用外部负载均衡器公开一组pod。所有托管的Kubernetes产品都有自己的实现(对于EKS,您可以使用NLB、ALB等),并且在大多数情况下,它们是由云提供商创建的。但也有一些项目旨在将其暴露在裸机集群上——metallb是一个很好的例子(我在本文末尾分享了更多例子)。但这还没有结束。Kubernetes还有一个名为Ingress的API对象。Ingress建立在KubernetesService之上(要暴露Ingress,需要使用KubernetesService)。Ingress的主要职责是根据预定的路由规则或算法将网络流量分配给服务。它还将pod暴露给外部流量,通常是通过HTTP。根据您的业务目标和环境的具体情况,您可以使用不同的负载分配策略。YAML定义示例:apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:minimal-ingressannotations:nginx.ingress.kubernetes.io/rewrite-target:/spec:ingressClassName:nginx-examplerules:-http:paths:-路径:/testpathpathType:Prefixbackend:service:name:testport:number:80负载均衡器流量分配策略在多个后端服务之间有效地分配网络流量是最大化可扩展性和可用性的关键。在如何对pod的外部流量进行负载平衡方面,您有很大的自由度,但每种策略都有其优势和权衡。这完全取决于您的负载、要求和偏好。负载平衡算法的选择是你应该谨慎选择的——否则,你最终会得到一个不平衡的负载分布或一个运行过热的单一网络服务器。以下是您应该考虑的一些负载平衡算法。RoundRobin使用这种调度算法,您可以跟踪一系列获得新连接的符合条件的服务器。请注意,此解决方案是静态的-它并未真正考虑这些单独服务器之间的速度或性能差异。它只是确保请求按顺序到达服务器。Roundrobin无法区分慢速和快速服务器,因此它为每个服务器分配相同数量的连接。如果您期望高性能生产流量,它可能不是最佳选择。L4RoundRobinLoadBalancerKubernetes中的基本负载均衡策略之一。它列出了发送到服务的所有请求并路由它们。kube-proxy借助iptables规则为服务实现虚拟IP,增加了流程的复杂性。它还为每个请求增加了额外的延迟,如果服务数量持续增长,这可能会堆积成一个问题。L7循环负载平衡L7代理通过API网关将流量定向到Kubernetespod,绕过kube-proxy并管理对可用pod的请求。负载均衡器还跟踪KubernetesEndpointsAPI提供的pod。当它收到对给定Kubernetes服务的请求时,它会在相关pod之间循环请求以找到可用的pod。L4kube-proxy和IPVS默认情况下,kube-proxy使用iptables进行路由,但它也可以使用IP虚拟服务器(IPVS)。IPVS的优点是可扩展性:在O(1)时间内运行,与所需的路由规则数量无关。这个数字与服务的数量成正比。如果你正在运行一个拥有数千个服务的庞大Kubernetes集群,IPVS是一个不错的选择。但是IPVS是L4路由,所以有一定的局限性。环形散列这种调度算法基于从指定密钥派生的散列。散列允许跨服务器分布新连接。环形哈希是大量服务器和动态内容的绝佳解决方案,因为它结合了负载平衡和持久性。它被许多需要每个客户端状态的电子商务应用程序或服务使用。当需要添加或删除服务器时,一致性哈希不必重新计算整个哈希表。因此,它不会影响其他连接。请注意,环哈希在大规模运行时可能会增加一些请求延迟。此外,此算法生成的查找表可能不适合您的CPU的处理器缓存。Maglev类似于环哈希,Maglev是一种最初由谷歌开发的一致性哈希算法。其背后的想法是提高环哈希相对于哈希表查找的速度。它的创建者的另一个目标是最小化算法的内存占用。如果您决定将Maglev用于微服务,预计会在节点出现故障时产生高昂的查找表成本。由于K8spod的相对短暂性,使用Maglev可能不是最好的主意。最少连接数是一种动态负载均衡算法,它将客户端请求分配到具有最少活动连接数和最少连接负载的Pod。由于这一点,它可以适应缓慢或不健康的服务器。但是,当所有Pod都同样健康时,负载将被平均分配。处理Kubernetes负载均衡器的最佳实践在实施Kubernetes负载均衡器时,需要采取一些配置步骤来确保您的K8s部署充分利用您选择的负载均衡器。以下是在Kubernetes中使用负载均衡器的一些最佳实践。检查负载均衡器是否启动似乎太明显以至于无法包含在此列表中,但它是一个关键的检查。您需要在K8s系统中启用服务负载均衡器。您的负载均衡器需要支持遏制和服务发现。此外,您的应用程序应设计为容器化。每个云服务提供商都有自己的负载均衡器实现——其中大多数允许使用服务注释进行微调启用就绪探测就绪探测通知K8s应用程序它们是否准备好为流量提供服务。当它们将流量传递给pod时,您需要启用就绪探测器。为此,您需要在任何K8s部署中定义它。如果您没有适当的探测,用户将到达pod,但不会得到正常的服务器响应。这是因为就绪探测器的工作是向Kubernetes发出信号,告知何时将Pod置于负载均衡器之后,将服务置于代理之后。启用LivenessProbe您应该启用的另一个关键探测器是liveness探测器。它让Kubernetes知道pod是否健康到足以继续工作,或者重启它是否是一个更好的主意。它基于bash命令执行简单或复杂的检查。该探针用于帮助K8s确定负载均衡器是否正常工作或者其某些组件是否需要支持。即使您的应用程序包含错误,LivenessProbe也会提高可用性。应用网络策略为了保护您的K8s部署,负载均衡器必须能够将安全组策略应用到虚拟机或工作节点。理想情况下,您应该将入站和出站流量限制在所需的最低限度。设置这样的限制有什么好处?它可以帮助您防止意外地将不需要的服务暴露给出站流量。Kubernetes具有网络安全策略功能,可以为部署中的所有资源提供服务。您还需要确保您的Kubernetes集群配备了支持网络策略的网络插件。启用CPU/内存请求,以便容器能够自动请求资源。这有助于释放系统所需的CPU和内存资源。此外,启用这些请求允许您定义这些资源,以便Pod不会耗尽内存。最重要的是,您消除了CPU或内存接管节点上的所有资源并导致错误或故障的风险。超越负载均衡器优化当Kubernetes处理需要高可用性的工作负载时,将pod分布到不同的可用区(AZ)非常重要。这就是您如何确保即使其中一个AZ出现故障也可以访问应用程序。CASTAI支持这种类似于K8s调度器的pod调度。跨不同可用性区域分布pod意味着使用LoadBalancer,它支持在不同区域之间分配流量。在大多数情况下,它应该开箱即用,因为大多数云都有一个支持在区域之间分配流量的负载均衡器。不过,还是值得仔细看看。此外,除了利用不同的可用区外,CASTAI还允许您在不同的子网中平均分配工作负载,以便充分利用所有子网。您可以在此处找到有关子网使用计算的更多信息。额外奖励:在您的家庭实验室中进行负载均衡使用适当的负载均衡器部署生产级Kubernetes集群是一项挑战——但是如果您想了解有关设置K8s集群的更多信息怎么办?Homelab可以回答这个问题。仅仅为了好玩而创建K8s集群可能具有挑战性,但却是有益的。在家庭网络上设置适当的LB也很困难,因为您不太可能在家里拥有企业级网络设备。因此,从您的家庭集群公开您的宠物项目的最简单方法可能是使用NodePort类型的K8s服务。动态IP不会成为问题,因为您将拥有具有静态IP的节点。但是,如果我们想更进一步呢?并想使用更像生产级集群的东西?为此,您可以使用名为Metallb的项目。该项目处于测试阶段,但在家庭实验室中应该可以正常工作。Metallb有两种L2工作模式,一个家用路由器就够了。简而言之,这意味着机器只是有多个IP地址。或者您可以使用称为BGP的更高级模式。在那里你有跨多个节点的真正负载平衡,但路由器需要有BGP支持。我们希望本文能帮助您深入了解Kubernetes负载均衡选项,并且您已准备好在下一个项目中使用所有负载均衡器。
