che*_*hty 0 load-balancing kubernetes
在 Kubernetes 中,我们使用 ClusterIp/Nodeport/LoadBalancer 作为服务来暴露 pod。当多个端点绑定到一个服务(如部署)时,Kubernetes 将流量路由到其中一个端点的策略是什么?它会始终尝试尊重load balancing
政策还是随机选择?
正如 kubernetes.io官方解释的那样,Kubernetes使用iptables在一组 pod 之间分配流量。基本上发生的事情是,当您创建一个对象时,K8s 创建一个虚拟 ClusterIP 并指示 kube-proxy 守护进程更新每个节点上的 iptables,以便匹配该虚拟 IP 的请求将在一组 pod IP 之间实现负载平衡。这里的“虚拟”一词意味着 ClusterIP 与 pod IP 不同,它不是由网络接口分配的真实 IP 地址,仅用作“过滤器”来匹配流量并将它们转发到正确的目的地。kind: service
Kubernetes 文档说默认情况下负载平衡方法是循环法,但这并不完全准确。如果您查看任何工作节点上的 iptables,您会发现对于foo
ClusterIP 为 172.20.86.5 和 3 个 pod的给定服务,[过度简化] iptables 规则如下所示:
$ kubectl get service foo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
foo ClusterIP 172.20.86.5 <none> 443:30937/TCP 12m
Run Code Online (Sandbox Code Playgroud)
Chain KUBE-SERVICES (2 references)
target prot opt source destination
KUBE-SVC-4NIQ26WEGJLLPEYD tcp -- anywhere 172.20.86.5 /* default/foo:https cluster IP */ tcp dpt:https
Run Code Online (Sandbox Code Playgroud)
此KUBE-SERVICES
链式规则查找destination
172.20.86.5 的所有流量,并应用在另一个名为 的链中定义的规则KUBE-SVC-4NIQ26WEGJLLPEYD
:
Chain KUBE-SVC-4NIQ26WEGJLLPEYD (2 references)
target prot opt source destination
KUBE-SEP-4GQBH7D5EV5ANHLR all -- anywhere anywhere /* default/foo:https */ statistic mode random probability 0.33332999982
KUBE-SEP-XMNJYETXA5COSMOZ all -- anywhere anywhere /* default/foo:https */ statistic mode random probability 0.50000000000
KUBE-SEP-YGQ22DTWGVO4D4MM all -- anywhere anywhere /* default/foo:https */
Run Code Online (Sandbox Code Playgroud)
该链用于statistic mode random probability
将流量随机发送到定义的三个链之一(因为我有三个 pod,所以我这里有三个链,每个链都有 33.3% 的机会被选择接收流量)。这些链中的每一个都是将流量发送到后端 pod IP 的最终规则。例如看第一个:
Chain KUBE-SEP-4GQBH7D5EV5ANHLR (1 references)
target prot opt source destination
DNAT tcp -- anywhere anywhere /* default/foo:https */ tcp to:10.100.1.164:12345
Run Code Online (Sandbox Code Playgroud)
该DNAT
指令将数据包转发到 IP 地址 10.100.1.164(真实 pod IP)和端口 12345(这是foo
监听的端口)。其他两个链(KUBE-SEP-XMNJYETXA5COSMOZ
和KUBE-SEP-YGQ22DTWGVO4D4MM
)是相似的,除了每个链都有不同的 IP 地址。
同样,如果您的服务类型是NodePort
,Kubernetes 会在节点上分配一个随机端口(默认为 30000-32767)。有趣的是,工作节点上没有进程主动侦听此端口 - 相反,这是另一个 iptables 规则来匹配流量并将其发送到正确的 pod 集:
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination
KUBE-SVC-4NIQ26WEGJLLPEYD tcp -- anywhere anywhere /* default/foo:https */ tcp dpt:30937
Run Code Online (Sandbox Code Playgroud)
此规则匹配进入端口 30937 ( tcp dpt:30937
) 的入站流量,并将其转发到 chain KUBE-SVC-4NIQ26WEGJLLPEYD
。但是你猜怎么着:KUBE-SVC-4NIQ26WEGJLLPEYD
是与集群 ip 172.20.86.5 匹配并将流量发送到的完全相同的链,如上所示。
归档时间: |
|
查看次数: |
1361 次 |
最近记录: |