26 K8S 之 Service 资源调度
Cluster 类型 Service 对象的相关规则主要位于 KUBE-SERVICES、KUBE-MARQ-MASK 和 KUBE-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-<HASH>:定义一个服务的流量调度规则,它通过随机调度算法将请求分发给该 Service 的所有后端端点,每个后端端点定义在以 KUBE-SEP 为前缀名称的自定义链上,后缀是端点信息的 hash 值。
KUBE-SEP-<HASH>:定义一个端点相关的流量处理规则。它通常包含两条规则:前一条用于为那些源自该端点自身(-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 地址)上的服务端口的请求流量由默认或指定的调度算法分发至相关的各真实服务器。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/64f17366968b00877cc12cf30】。文章转载请联系作者。
评论