我刚刚开始使用Kubernetes,我对kubernetes负载均衡方法有一些疑问,无法在kubernetes文档中找到明确的答案。
首先,让我们说我们已经创建了一个部署“iis”,并将其扩展为3个副本。现在没有创建服务我们如何访问这些端点?
现在,我们已经使用ClusterIP为此部署创建了一个服务(具有3个副本),因此它仅在集群中公开。现在,服务将如何对集群内此服务的流量进行负载均衡?它是使用循环法还是随机选择端点?根据kubernetes的文档,有2个服务代理,用户空间或iptables,我怎么知道我的服务使用的是哪一个?
接下来,我们使用LoadBalancer公开了该服务。它在云提供商上创建负载均衡器并使用它。我的问题是这个外部负载均衡器如何平衡到pod的流量?它是否平衡了服务和服务的流量,将其重定向到端点,还是将流量直接平衡到端点(pod)?此外,在此LoadBalancer案例中,内部流量(来自群集内部)对此服务的负载是如何进行负载平衡的?
请尝试详细解答。
答案 0 :(得分:2)
首先,让我们说我们创建了一个部署" iis",并将其缩放为3个副本。现在没有创建服务我们如何访问这些端点?
除非你有一个带外解决方案(就像你注册POD ips的标准负载均衡器)你不能。服务可以缓解pod之间的连接。使用它们!
现在,服务如何对集群内此服务的流量进行负载均衡?
为了理解这一点,值得了解服务如何在Kubernetes中运作。
服务由kube-proxy处理。 Kube-proxy(现在默认情况下)创建iptables规则,看起来有点像这样:
-A KUBE-SERVICES ! -s 192.168.0.0/16 -d <svc-ip>/32 -p tcp -m comment --comment "namespace/service-name: cluster IP" -m tcp --dport svc-port -j KUBE-MARK-MASQ
会发生什么,iptables查看发往svc-ip的所有数据包,然后将指示发送到正在生成服务的pod IP
如果你仔细看看iptables规则,并搜索&#34;概率&#34; - 你会看到这样的事情:
-A KUBE-SVC-AGR3D4D4FQNH4O33 -m comment --comment "default/redis-slave:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-25QOXGEMBWAVOAG5
-A KUBE-SVC-GYQQTB6TY565JPRW -m comment --comment "default/frontend:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-JZXZFA7HRDMGR3BA
-A KUBE-SVC-GYQQTB6TY565JPRW -m comment --comment "default/frontend:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-ZW5YSZGA33MN3O6G
所以答案是,它是随机的,有一些概率加权。有关概率如何加权的更全面的解释可以在github comment
中看到根据kubernetes的文档,有2个服务代理,用户空间或iptables,我怎么知道我的服务使用的是哪一个?
同样,这是由kube-proxy决定的,并在kube-proxy启动时决定。它是kube-proxy进程上的命令行标志。默认情况下,它会使用iptables,强烈建议您坚持使用iptables,除非您知道自己在做什么。
我的问题是这个外部负载均衡器如何平衡到pod的流量?
这完全取决于您的云提供商和您选择的LoadBalance。 LoadBalancer服务类型在NodePort上公开服务然后将负载均衡器上的外部端口映射回来。 所有LoadBalancer类型的不同之处在于注册在外部提供商的负载均衡器中为服务提供服务的节点IP,例如:ELB,而不是在内部clusterIP服务中。我建议您阅读云提供商的文档以确定这一点。
此外,在此LoadBalancer情况下,内部流量(来自群集内部)如何对此服务进行负载平衡?
再次,请参阅云提供商的文档。