k8s集群的切入点是什么?如何将请求从入口点路由到某个容器?</ p>
答案 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.14
为hypriot-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