Amazon web services Kubernetes中的真正负载平衡?
什么是负载平衡器 负载平衡改进了跨多个服务器的工作负载分布 计算资源,如计算机、计算机集群、网络 链路、中央处理器或磁盘驱动器 节点端口 节点端口不是负载平衡器。(我知道Amazon web services Kubernetes中的真正负载平衡?,amazon-web-services,kubernetes,load-balancing,amazon-elb,Amazon Web Services,Kubernetes,Load Balancing,Amazon Elb,什么是负载平衡器 负载平衡改进了跨多个服务器的工作负载分布 计算资源,如计算机、计算机集群、网络 链路、中央处理器或磁盘驱动器 节点端口 节点端口不是负载平衡器。(我知道kube proxy一旦流量进入集群,就在pod之间进行负载平衡)我的意思是,最终用户点击http://NODEIP:30111(例如)访问应用程序的URL。即使POD之间的流量是负载平衡的,用户仍然会点击单个节点,即“节点”,它是K8s的仆从,但却是一个真正的负载平衡器,对吗 入口服务 这里也一样,假设入口控制器已部署,入口服
kube proxy
一旦流量进入集群,就在pod之间进行负载平衡)我的意思是,最终用户点击http://NODEIP:30111
(例如)访问应用程序的URL。即使POD之间的流量是负载平衡的,用户仍然会点击单个节点,即“节点”,它是K8s的仆从,但却是一个真正的负载平衡器,对吗
入口服务
这里也一样,假设入口控制器已部署,入口服务也已部署。我们在ingress服务中指定的子域应该指向K8s集群中的“a”节点,然后ingress控制器负载平衡POD之间的流量。这里也有终端用户使用的单节点,这是K8s的仆从,但却是一个真正的负载平衡器,对吗
来自云提供商的负载平衡器(例如AWS ELB)
我有一个疑问,云提供商的LB如何实现负载平衡?这些是否真的将流量分配给部署了POD的适当节点,或者只是将流量转发给主节点或从属节点
如果上述观点是正确的。其中是POD/相应节点之间流量的真正负载平衡
我可以在K8s中实现真正的负载平衡吗?我问了一位亲戚
节点端口不是负载平衡器
在某种程度上,你是对的,是的,它不是为负载平衡器而设计的
用户仍然会点击一个节点,即“节点”,它是K8s的仆从,但却是一个真正的负载平衡器,对吗
使用NodePort,您必须在任何时候命中单个节点,但必须记住kube proxy
正在所有节点上运行。因此,您可以点击集群中任何节点上的NodePort(即使工作负载未在其上运行的节点),并且仍然会点击您想要点击的端点。这在以后变得很重要
我们在入口服务中指定的子域应该指向K8s集群中的“a”节点
不,事情不是这样的
您的入口控制器仍需暴露在外部。如果您使用的是云提供商,一种常用的模式是使用Type=LoadBalancer
服务公开您的入口控制器。负载平衡仍然在服务中发生,但Ingress允许您以更用户友好的方式使用该服务。不要混淆入口和负载平衡
我怀疑云提供商LB如何实现负载平衡?这些是否真的将流量分配给部署了POD的适当节点,或者只是将流量转发给主节点或从属节点
如果您查看Kubernetes中的配置服务,您就会明白为什么它是有意义的
以下是LoadBalancer类型的服务:
kubectl get svc nginx-ingress-controller -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller LoadBalancer <redacted> internal-a4c8... 80:32394/TCP,443:31281/TCP 147d
kubectl get nodes -l "node-role.kubernetes.io/node=" --no-headers=true | wc -l
8
这里需要注意的最重要的事情是:
LoadBalancer正在将ELB中的端口80映射到节点端口:
{
"Listener": {
"Protocol": "HTTP",
"LoadBalancerPort": 80,
"InstanceProtocol": "HTTP",
"InstancePort": 32394
},
"PolicyNames": []
}
您还将看到有多个target实例,而不是一个:
aws elb describe-load-balancers --load-balancer-names a4c80f4eb1d7c11e886d80652b702125 | jq '.LoadBalancerDescriptions[].Instances | length'
8
最后,如果您查看我的集群中的节点数量,您将看到实际上是添加到LoadBalancer的所有节点:
kubectl get svc nginx-ingress-controller -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller LoadBalancer <redacted> internal-a4c8... 80:32394/TCP,443:31281/TCP 147d
kubectl get nodes -l "node-role.kubernetes.io/node=" --no-headers=true | wc -l
8
总之,Kubernetes确实使用服务(无论是节点端口还是负载平衡器类型)实现了真正的负载平衡,而ingress只是让外部世界更容易访问该服务感谢您的详细回答。关于Ingress
:如果Ingress控制器部署在裸机K8s上,则上述场景是正确的??i、 e指定的子域应指向一个节点。这取决于您的基础结构。您可以尝试使用MetalLB作为解决方案,或者您的负载平衡器提供商提供了一个与k8sok集成的解决方案,谢谢。那么...怎么样这是实现自定义LB的好方法。我知道它不畅销。