Bootstrap

26 K8S之Service资源调度

Cluster类型Service对象的相关规则主要位于KUBE-SERVICESKUBE-MARQ-MASKKUBE-POSTROUTING这3个自定义链,以及那些以KUBE-SVC或KUBE-SEP为前缀的各个自定义链上,用于实现Service流量筛选、分发和目标地址转换(端点地址),以及为非源自Pod网络的请求报文进行源地址转换。

KUBE-SERVICES:包含所有ClusterIP类型Service的流量匹配规则,由PREROUTING和OUTPUT两个内置链直接调用。每个Service对象包含两条规则定义,对于所有发往该Service(目标IP为Service_IP且目标端口为Service_Port)的请求报文:前一条规则用于为非源自Pod网络(! -s 10.244.0.0/16)中的请求报文打上特有的防火墙标记,而打标签的操作则要借助KUBE-MARQ-MASK自定义链中的规则,后一条规则负责将所有报文转至专用的以KUBE-SVC为名称前缀的自定义链,后缀是Service信息的HASH值。

KUBE-MARQ-MASK:专用目的自定义链,所有转至该自定义链的报文都将被打上特有的防火墙标记(0x4000),以便于将特定类型的报文定义为单独的分类,进而在将该类报文转发到目标端点之前由POSTROUTING规则链进行源地址转换。

KUBE-SVC-:定义一个服务的流量调度规则,它通过随机调度算法将请求分发给该Service的所有后端端点,每个后端端点定义在以KUBE-SEP为前缀名称的自定义链上,后缀是端点信息的hash值。

KUBE-SEP-:定义一个端点相关的流量处理规则。它通常包含两条规则:前一条用于为那些源自该端点自身(-s ep_ip)的流量请求调用自定义链KUBE-MARQ-MASK,打上特有的防火墙标记;后一条负责对发往该端点的所有流量进行目标IP地址和端口转换,新目标为该端点的IP和端口(-j DNAT --to-destination ep_ip:ep_port)。

KUBE-POSTROUTING:专用的自定义链,由内置链POSTROUTING无条件调用,负责对带特有防火墙标记0x4000的请求报文进行源地址转换或地址伪装(MASQUERADE),新的源地址为报文离开协议栈时流经接口的主IP地址。

所有发往NodePort类型的Service对象的请求流量的目标IP和端口分别是节点IP和NodePort,这类报文无法由KUBE-SERVICES自定义链上那些基于Service IP和Service Port定义的流量匹配规则所匹配,但会由该自定义链上的最后一条规则转给KUBE-NODEPORTS自定义链

相较于iptables代理模型的复杂表示逻辑,ipvs的代理逻辑也较为简单,它仅有两个关键配置要素。首先,kube-proxy会在每个节点上创建一个名为kube-ipvs0的虚拟网络接口,并将集群上所有Service对象的ClusterIP和ExternalIP配置到该接口,使相应IP地址的流量都可被当前节点捕获。其次kube-proxy会为每个Service生成相关的ipvs虚拟服务器(Virtual Server)定义,该虚拟服务器的真实服务器(Real Server)是由相应Service对象的后端端点组成,到达虚拟服务器VIP(虚拟IP地址)上的服务端口的请求流量由默认或指定的调度算法分发至相关的各真实服务器。