首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >库伯奈特斯的真实LoadBalancing?

库伯奈特斯的真实LoadBalancing?
EN

Stack Overflow用户
提问于 2018-07-27 14:04:13
回答 1查看 371关注 0票数 4

什么是负载均衡器?

负载平衡改进了跨多个计算资源(如计算机、计算机集群、网络链接、中央处理单元或磁盘驱动器)之间的负载分配。

The NodePort

NodePort不是负载均衡器。(我知道,一旦流量在集群内,kube-proxy负载平衡了豆荚之间的流量),我的意思是,最终用户点击http://NODEIP:30111 (例如) URL访问应用程序。即使业务在POD之间是负载均衡的,用户仍然会点击一个节点,即" node“,这是K8s的走狗,但是真正的负载均衡器,对吗?

入侵者服务

在这里,同样,假设入口控制器被部署,入口服务也被部署.我们在入口服务中指定的子域应该指向K8s集群中的“一个”节点,然后入口控制器负载平衡豆荚之间的通信量。这里也有终端用户点击单个节点,这是K8s的仆从,但真正的负载均衡器,对吗?

来自云提供商的负载均衡器(例如AWS ELB)

我有一个疑问,云提供商的LB是如何实现负载平衡的?这些业务是否真的将流量分配到部署了哪个吊舱的适当节点,还是仅仅将流量转发给主节点或从属节点?

如果上面的观点是正确的。何处是真正的负载平衡之间的豆荚/适当的节点之间的流量。

我能在K8s中实现真正的负载平衡吗?我问了一个相关的question here

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-27 15:10:46

NodePort不是负载均衡器。

你在某种程度上是对的,是的,它不是用来平衡负载的。

用户仍然点击一个节点,即“节点”,这是K8s的仆从,但真正的负载均衡器,对吗?

使用NodePort,您必须在任何一次访问单个节点,但您必须记住,kube-proxy正在所有节点上运行。因此,您可以在集群中的任何节点(即使是工作负载未在其上运行的节点)上命中NodePort,并且仍然会命中要命中的端点。这在以后变得很重要。

我们在入口服务中指定的子域应该指向K8s集群中的"a“节点。

不,不是这样的。

你的入口控制器还需要暴露在外部。如果您使用的是云提供商,一个常用的模式是使用Type=LoadBalancer服务公开您的入口控制器。LoadBalancing仍然发生在服务中,但是in允许您以更友好的方式使用该服务。不要把入口和负载平衡混淆起来。

我怀疑云提供商LB是如何实现负载平衡的?这些业务是否真的将流量分配到部署了哪个吊舱的适当节点,还是仅仅将流量转发给主节点或从属节点?

如果您查看Kubernetes中的供应服务,您将看到为什么它是有意义的。

下面是一个LoadBalancer类型的服务:

代码语言:javascript
复制
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

您可以看到,我已经部署了一个具有LoadBalancer类型的入口控制器。这创建了一个AWS,但也注意到,就像NodePort一样,它将入口控制器吊舱上的端口80映射到32394端口。

那么,让我们看一下AWS中的实际LoadBalancer:

代码语言:javascript
复制
aws elb describe-load-balancers --load-balancer-names a4c80f4eb1d7c11e886d80652b702125

{
    "LoadBalancerDescriptions": [
        {
            "LoadBalancerName": "a4c80f4eb1d7c11e886d80652b702125",
            "DNSName": "internal-a4c8<redacted>",
            "CanonicalHostedZoneNameID": "<redacted>",
            "ListenerDescriptions": [
                {
                    "Listener": {
                        "Protocol": "TCP",
                        "LoadBalancerPort": 443,
                        "InstanceProtocol": "TCP",
                        "InstancePort": 31281
                    },
                    "PolicyNames": []
                },
                {
                    "Listener": {
                        "Protocol": "HTTP",
                        "LoadBalancerPort": 80,
                        "InstanceProtocol": "HTTP",
                        "InstancePort": 32394
                    },
                    "PolicyNames": []
                }
            ],
            "Policies": {
                "AppCookieStickinessPolicies": [],
                "LBCookieStickinessPolicies": [],
                "OtherPolicies": []
            },
            "BackendServerDescriptions": [],
            "AvailabilityZones": [
                "us-west-2a",
                "us-west-2b",
                "us-west-2c"
            ],
            "Subnets": [
                "<redacted>",
                "<redacted>",
                "<redacted>"
            ],
            "VPCId": "<redacted>",
            "Instances": [
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                },
                {
                    "InstanceId": "<redacted>"
                }
            ],
            "HealthCheck": {
                "Target": "TCP:32394",
                "Interval": 10,
                "Timeout": 5,
                "UnhealthyThreshold": 6,
                "HealthyThreshold": 2
            },
            "SourceSecurityGroup": {
                "OwnerAlias": "337287630927",
                "GroupName": "k8s-elb-a4c80f4eb1d7c11e886d80652b702125"
            },
            "SecurityGroups": [
                "sg-8e0749f1"
            ],
            "CreatedTime": "2018-03-01T18:13:53.990Z",
            "Scheme": "internal"
        }
    ]
}

这里要注意的最重要的事情是:

LoadBalancer正在将ELB中的端口80映射到NodePort:

代码语言:javascript
复制
{
                "Listener": {
                    "Protocol": "HTTP",
                    "LoadBalancerPort": 80,
                    "InstanceProtocol": "HTTP",
                    "InstancePort": 32394
                },
                "PolicyNames": []
 }

您还将看到有多个目标Instances,而不是一个:

代码语言:javascript
复制
aws elb describe-load-balancers --load-balancer-names a4c80f4eb1d7c11e886d80652b702125 | jq '.LoadBalancerDescriptions[].Instances | length'
8

最后,如果您查看我的集群中的节点数量,您将看到实际上已经添加到LoadBalancer中的所有节点:

代码语言:javascript
复制
kubectl get nodes -l "node-role.kubernetes.io/node=" --no-headers=true | wc -l                                             
8

因此,总之- Kubernetes确实用服务实现了真正的LoadBalancing (无论是NodePort还是LoadBalancer类型),而入口只会使服务更容易被外界访问。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51559671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档