常规
ClusterIP
确保网络连接
type: ClusterIP
服务是公司的责任
kube-proxy
--通常在集群的每个节点上运行的组件。kube代理通过拦截每个节点上pod的传出流量并过滤针对服务ip的流量来实现这一点。由于它连接到Kubernetes API,kube代理可以确定哪些Pod IP与每个服务IP相关联,并可以相应地转发流量。
从概念上讲,kube代理可能被认为类似于反向代理(因此得名),但通常使用IPtables规则(或者,从kubernetes1.9开始,可选IPVS)。每个创建的服务将在每个节点上产生一组IPtables规则,该规则拦截并将针对服务IP的流量转发到各个Pod IP(服务IP是纯虚拟的,并且仅存在于这些IPtables规则中;在整个集群中,您将找不到一个实际的网络接口来保存该IP)。
负载平衡也通过IPtables规则(或ipv)实现。负载平衡总是发生在
来源
流量来源的节点。
下面是一个来自
Debug Services
u@node$ iptables-save | grep hostnames
-A KUBE-SEP-57KPRZ3JQVENLNBR -s 10.244.3.6/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-57KPRZ3JQVENLNBR -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.3.6:9376
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -s 10.244.1.7/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.1.7:9376
-A KUBE-SEP-X3P2623AGDH6CDF3 -s 10.244.2.3/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-X3P2623AGDH6CDF3 -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.244.2.3:9376
-A KUBE-SERVICES -d 10.0.1.175/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-X3P2623AGDH6CDF3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR
有关更多信息,请查看
Virtual IPs and Service Proxies
手册中的章节。
丛生
服务,还有
Headless Services
clusterIP: None
创建服务时)。他们不会使用kube代理;相反,它们的DNS主机名将直接解析为与服务关联的所有Pod ip。负载平衡是通过常规DNS循环来实现的。