什么是负载均衡器?
负载平衡改进了跨多个计算资源(如计算机、计算机集群、网络链接、中央处理单元或磁盘驱动器)之间的负载分配。
The NodePort
NodePort不是负载均衡器。(我知道,一旦流量在集群内,kube-proxy负载平衡了豆荚之间的流量),我的意思是,最终用户点击http://NODEIP:30111 (例如) URL访问应用程序。即使业务在POD之间是负载均衡的,用户仍然会点击一个节点,即" node“,这是K8s的走狗,但是真正的负载均衡器,对吗?
入侵者服务
在这里,同样,假设入口控制器被部署,入口服务也被部署.我们在入口服务中指定的子域应该指向K8s集群中的“一个”节点,然后入口控制器负载平衡豆荚之间的通信量。这里也有终端用户点击单个节点,这是K8s的仆从,但真正的负载均衡器,对吗?
来自云提供商的负载均衡器(例如AWS ELB)
我有一个疑问,云提供商的LB是如何实现负载平衡的?这些业务是否真的将流量分配到部署了哪个吊舱的适当节点,还是仅仅将流量转发给主节点或从属节点?
如果上面的观点是正确的。何处是真正的负载平衡之间的豆荚/适当的节点之间的流量。
我能在K8s中实现真正的负载平衡吗?我问了一个相关的question here
发布于 2018-07-27 15:10:46
NodePort不是负载均衡器。
你在某种程度上是对的,是的,它不是用来平衡负载的。
用户仍然点击一个节点,即“节点”,这是K8s的仆从,但真正的负载均衡器,对吗?
使用NodePort,您必须在任何一次访问单个节点,但您必须记住,kube-proxy正在所有节点上运行。因此,您可以在集群中的任何节点(即使是工作负载未在其上运行的节点)上命中NodePort,并且仍然会命中要命中的端点。这在以后变得很重要。
我们在入口服务中指定的子域应该指向K8s集群中的"a“节点。
不,不是这样的。
你的入口控制器还需要暴露在外部。如果您使用的是云提供商,一个常用的模式是使用Type=LoadBalancer服务公开您的入口控制器。LoadBalancing仍然发生在服务中,但是in允许您以更友好的方式使用该服务。不要把入口和负载平衡混淆起来。
我怀疑云提供商LB是如何实现负载平衡的?这些业务是否真的将流量分配到部署了哪个吊舱的适当节点,还是仅仅将流量转发给主节点或从属节点?
如果您查看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您可以看到,我已经部署了一个具有LoadBalancer类型的入口控制器。这创建了一个AWS,但也注意到,就像NodePort一样,它将入口控制器吊舱上的端口80映射到32394端口。
那么,让我们看一下AWS中的实际LoadBalancer:
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:
{
"Listener": {
"Protocol": "HTTP",
"LoadBalancerPort": 80,
"InstanceProtocol": "HTTP",
"InstancePort": 32394
},
"PolicyNames": []
}您还将看到有多个目标Instances,而不是一个:
aws elb describe-load-balancers --load-balancer-names a4c80f4eb1d7c11e886d80652b702125 | jq '.LoadBalancerDescriptions[].Instances | length'
8最后,如果您查看我的集群中的节点数量,您将看到实际上已经添加到LoadBalancer中的所有节点:
kubectl get nodes -l "node-role.kubernetes.io/node=" --no-headers=true | wc -l
8因此,总之- Kubernetes确实用服务实现了真正的LoadBalancing (无论是NodePort还是LoadBalancer类型),而入口只会使服务更容易被外界访问。
https://stackoverflow.com/questions/51559671
复制相似问题