k8s服务如何将流量路由到多个端点

时间:2019-02-25 12:00:10

标签: kubernetes load-balancing

在Kubernetes中,我们将ClusterIp / Nodeport / LoadBalancer作为服务来公开Pod。 当有多个个端点绑定到一个服务(例如部署)时,Kubernetes将流量路由到哪个端点的策略是什么?它会一直尝试遵守load balancing政策还是随机选择?

3 个答案:

答案 0 :(得分:2)

Kubernetes使用iptables来将流量分布在一组Pod上,就像正式的explained by kubernetes.io一样。基本上,当您创建一个kind: service对象时,K8s将创建一个虚拟ClusterIP并指示kube-proxy守护程序集更新每个节点上的iptables,以便与该虚拟IP匹配的请求将在一组Pod IP上达到负载平衡。这里的“虚拟”一词意味着ClusterIP与Pod IP不同,它不是网络接口分配的真实IP地址,仅用作匹配流量并将其转发到正确目的地的“过滤器”。

Kubernetes文档说,默认情况下,负载平衡方法是循环轮询,但这并不完全准确。如果查看任何工作程序节点上的iptables,就会发现对于ClusterIP为172.20.86.5和3个Pod的给定服务foo,[过度简化] 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
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

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 */

此链使用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

DNAT指令将数据包转发到IP地址10.100.1.164(真实Pod IP)和端口12345(foo监听的端口)。其他两个链(KUBE-SEP-XMNJYETXA5COSMOZKUBE-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

此规则匹配去往端口30937(tcp dpt:30937)的入站流量,并将其转发到链KUBE-SVC-4NIQ26WEGJLLPEYD。但请猜猜是什么:KUBE-SVC-4NIQ26WEGJLLPEYD是与集群ip 172.20.86.5匹配并向其发送流量的完全相同的链。

答案 1 :(得分:0)

kubernetes服务使用循环策略将呼叫分配到多个Pod

答案 2 :(得分:0)

这可能会有所帮助 https://kubernetes.io/docs/concepts/services-networking/#proxy-mode-ipvs

简而言之,如果您想管理不同的负载平衡方法,则必须将k8s代理置于ipvs模式,并选择以下方法之一: rr:循环

lc:最少连接

dh:目标哈希

sh:源散列

sed:最短的预期延迟

nq:永不排队