哪个服务正在kubernetes节点之间进行负载平衡?

时间:2018-06-08 10:01:12

标签: kubernetes

k8s集群的切入点是什么?如何将请求从入口点路由到某个容器?<​​/ p>

1 个答案:

答案 0 :(得分:1)

这个问题很一般,你有很多类型的负载均衡器(内部,第三方,Ingresses ...)

但最好的答案是Kubernetes services,因为上面的所有内容都会传递给他们。

kubernetes中的服务是一组Linux iptables(或IPVS)规则,它们将对进入特定IP地址的数据包执行目标网络地址转换(DNAT)。简而言之:

1-服务将具有名为ServiceIP或ClusterIP的虚拟IP地址。

2-用户使用clusterIP与kubernetes pods(单个容器或一组相关容器)进行通信。

3-节点中的Iptables将使用CNI将目的地ClusteIP的数据包转发到关联Pod的IP地址。

负载平衡是通过iptables完成的,每个服务都有一个Iptables规则:

 # iptables -t nat -L KUBE-SERVICES 
Chain KUBE-SERVICES (2 references)
target     prot opt source               destination  
KUBE-MARK-MASQ  tcp  -- !10.244.0.0/16        10.104.192.249       /* default/hypriot: cluster IP */ tcp dpt:http
KUBE-SVC-IKNY2FZN6EXMQQCV  tcp  --  anywhere             10.104.192.249       /* default/hypriot: cluster IP */ tcp dpt:http

# kubectl get svc hypriot
NAME      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
hypriot   ClusterIP   10.104.192.249   <none>        80/TCP    11d

对于此示例,部署连字符具有ClusterIP 10.104.192.249,第二个iptables规则将具有此目标Ip的所有数据包转发到CHAIN KUBE-SVC-IKNY2FZN6EXMQQCV

要查看此CHAIN将执行的操作:

# iptables -t nat -L KUBE-SVC-IKNY2FZN6EXMQQCV
Chain KUBE-SVC-IKNY2FZN6EXMQQCV (1 references)
target     prot opt source               destination         
KUBE-SEP-JEK5XLX6ULDDGJAZ  all  --  anywhere             anywhere             /* default/hypriot: */ statistic mode random probability 0.33332999982
KUBE-SEP-WTXTLPWDUQWUHKOF  all  --  anywhere             anywhere             /* default/hypriot: */ statistic mode random probability 0.50000000000
KUBE-SEP-OQ7KPRR3BI2AFITK  all  --  anywhere             anywhere             /* default/hypriot: */

每个KUBE-SEP都是一个Service EndPoint,它代表一个pod的地址,对于这个部署,hypriot有3个副本。

# kubectl get endpoints hypriot
NAME      ENDPOINTS                                       AGE
hypriot   10.244.1.14:80,10.244.2.21:80,10.244.3.153:80   11d
# kubectl get po -o wide 
NAME                       READY     STATUS    RESTARTS   AGE       IP             NODE
hypriot-587768b4f5-9dq2k   1/1       Running   0          11d       10.244.2.21    node03
hypriot-587768b4f5-czd86   1/1       Running   0          11d       10.244.3.153   node04
hypriot-587768b4f5-j22sh   1/1       Running   0          11d       10.244.1.14    node02

将选择其中一个端点,并将数据包转发到关联的KUBE-SEP链:

# iptables -t nat -L KUBE-SEP-JEK5XLX6ULDDGJAZ
Chain KUBE-SEP-JEK5XLX6ULDDGJAZ (1 references)
target     prot opt source               destination         
KUBE-MARK-MASQ  all  --  10.244.1.14          anywhere             /* default/hypriot: */
DNAT       tcp  --  anywhere             anywhere             /* default/hypriot: */ tcp to:10.244.1.14:80

这是DNAT将发生的最后一个难题,新目标将是所选的pod IP(本例中的pod 10.244.1.14hypriot-587768b4f5-j22sh),当另一个服务端点为选中后,数据包将被DNAT到另一个pod。

您可以使用Iptables -v标志来检查所使用的规则,这些规则将帮助您理解过程。

一些好的读物:https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/ https://kubernetes.io/docs/concepts/cluster-administration/networking/ https://kubernetes.io/docs/concepts/services-networking/service/#proxy-mode-iptables