Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Kubernetes中的真正负载平衡?_Amazon Web Services_Kubernetes_Load Balancing_Amazon Elb - Fatal编程技术网

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的好方法。我知道它不畅销。