什么是负载均衡器?
负载平衡改进了跨多个计算资源(如计算机、计算机群集、网络链路、中央处理器或磁盘驱动器)的工作负载分布
NodePort不是负载平衡器。(我知道一旦流量在集群内,kube proxy就会在pod之间进行负载平衡)我的意思是,最终用户点击http://NODEIP:30111(例如)访问应用程序的URL。即使POD之间的流量是负载平衡的,用户仍然会点击一个节点,即“节点”,它是K8s的仆从,但却是一个真正的负载平衡器,对吗?
这里也一样,想象入口控制器和入口服务也被部署了。我们在入口服务中指定的子域应该指向K8s集群中的“a”节点,然后入口控制器负载平衡Pod之间的流量。这里还有最终用户访问单个节点,它是K8s的小弟,但却是真正的负载均衡器,对吗?
我有一个疑问,云提供商的LB如何进行负载平衡?这些是真的将流量分配到部署PODS的适当节点,还是只是将流量转发到主节点或小节点?
如果上述点为真。真正的负载平衡pod/适当节点之间的流量在哪里。
我可以在K8s中实现真正的负载平衡吗?我在这里问了一个相关的问题
从你所说的和我用K8S研究了2个月的情况来看。当您只运行1个实例时,这里似乎没有负载平衡器。当我们扩展工作负载时,我们需要扩展包括POD在内的所有内容。
NodePort不是负载均衡器。
在某种程度上,您是对的,是的,它不是为负载平衡器而设计的。
用户仍然会访问单个节点,即“节点”,它是K8s的仆从,但却是真正的负载平衡器,对吗?
使用NodePort,您必须在任何时候命中单个节点,但您必须记住,kube代理正在所有节点上运行。因此,您可以点击集群中任何节点上的NodePort(即使没有运行工作负载的节点),但仍然会点击要点击的endpoint。这在以后变得很重要。
我们在入口服务中指定的子域应该指向K8s集群中的“a”节点
不,事情不是这样的。
您的入口控制器仍然需要在外部公开。如果您使用的是云提供商,一种常用的模式是使用Service ofType=LoadBalancer
公开您的入口控制器。服务仍然会发生负载平衡,但入口允许您以更用户友好的方式使用该服务。不要混淆入口和负载平衡。
我怀疑云提供商LB如何进行负载平衡?这些是真的将流量分配到部署PODS的适当节点,还是只是将流量转发到主节点或小节点?
如果您查看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 ELB,但也需要注意,例如,它将入口控制器pod上的端口80映射到端口32394。
那么,让我们看看AWS中的实际负载平衡器:
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映射到节点端口:
{
"Listener": {
"Protocol": "HTTP",
"LoadBalancerPort": 80,
"InstanceProtocol": "HTTP",
"InstancePort": 32394
},
"PolicyNames": []
}
您还将看到有多个目标实例,而不是一个:
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确实使用服务(无论是节点端口还是负载平衡器类型)实现了真正的负载平衡,而入口只是让外部世界更容易访问该服务
我最近开始研究Kubernetes集群。在我们的集群中,对给定Kubernetes服务的网络调用流如下所示: 外部非K8S负载均衡器- 对于给定的服务,有两个副本。通过查看副本中容器的日志,我可以看到调用被路由到不同的pod。据我所知,我们还没有为Kubernetes中的服务明确设置任何负载平衡策略。 我有几个问题: 1)K8S是否有默认的负载平衡策略?我读过库贝-proxy和随机路由。它看起来绝
我们在库伯内特斯运行了Spring Boot服务,并且正在使用Spring Cloud库伯内特斯负载均衡器功能和RestTemboard来调用其他Spring Boot服务。我们这样做的主要原因之一是历史上的——因为之前我们使用Eureka在EC2中运行我们的服务进行服务发现,迁移后我们保持了Spring发现客户端/客户端负载平衡(更新依赖项等,以便它与Spring Cloud库伯内特斯项目一起工
我有一个包含 3 个节点的 Kubernetes 集群。 示例部署 我没有入口,但我有外部负载均衡器,可以轮询 80.11.12.10、80.11.12.11、 的流量。 所以我这样设置我的服务。 问题在于,由于现有的 kubernetes 服务负载均衡器,流量会获得两次负载均衡。除此之外,这是不必要的,它会破坏连接持久性。有没有办法强制 Kubernetes 在每个节点的本地机器 Pod 上转发
我在两个节点上运行 Kubernetes,并在两个节点上部署一个应用程序(两个 pod,每个节点一个)。 这是一个Spring Boot应用程序。它使用OpenFygnd来实现服务可发现性。在应用程序中,我定义了一个一来控制程序,它有几个API和一个从API内部调用的@Autow的@Service。 每当我对其中一个API进行请求时,Kubernetes都会使用某种负载平衡来将流量路由到其中一个p
我在pod中运行了高视频编码任务。这些任务在接收用户请求时运行,并且CPU密集型非常高。我想确保CPU使用率最低的pod应该在传入请求中接收。库伯内特斯有没有办法根据CPU使用率的百分比来平衡我的负载?
在使用Google容器引擎时,人们会推荐GCP的本机负载平衡器还是Kubernetes服务type=负载平衡器选项? 人们推荐哪一种?