7 Service模型分析

访问Service会出现如下4种情况:

1、Pod-A --> Service --> 调度 --> Pod-B/Pod-C

2、Pod-A --> Service --> 调度 --> Pod-A

3、Docker --> Service --> 调度 --> Pod-B/Pod-C

4、NodePort --> Service --> 调度 --> Pod-B/Pod-C

7.1 iptables模型分析

K8s四层代理Service(模型分析)_IP

7.1.1 ClusterIP模型分析

K8s四层代理Service(模型分析)_自定义_02

1、从OUTPUT发出的请求会被无条件拦截到KUBE-SERVICES自定义规则链上

K8s四层代理Service(模型分析)_Pod_03

2、打印KUBE-SERVICES自定义链,所有对nginx-svc发起的请求,都调度到KUBE-SVC-<HASH>链上

#来源不是10.244.0.0/16网段,但请求的是nginx-svc的IP则交给KUBE-MARK-MASQ链进行处理

K8s四层代理Service(模型分析)_自定义_04

3、打印KUBE-SVC-<HASH>自定义链,而后进行逐行分析

#第1条: 创建一条自定义链

#第2~4条: 由iptables将请求调度到不同的KUBE-SEP-<HASH>上

K8s四层代理Service(模型分析)_IP_05

4、打印任意一条KUBE-SEP-<HASH>自定义链

#第1条: 创建一条自定义链

#第2条: 请求IP如果是自己Pod的的IP,则交由KUBE-MARK-MASQ处理

#第3条: 进行DNAT地址转换,将请求ServiceIP替换为后端的PodIP地址,然后将请求发出

K8s四层代理Service(模型分析)_自定义_06

5、OUTPUT处理完毕后,数据包会流入POSTROUTING链,由POSTROUTING链决定怎么发送数据包

#第1条: 创建一条自定义链;

#第3条: 所有的数据包必须先进入KUBE-POSTROUTING自定义链进行规则匹配

#第4条: 如果源地址是172.17.0.0/16,目标地址接口不是docker0则进行地址转换

#第5条: 如果源地址是192.168.122.0/24,目标地址是224.0.0.0/24,则RETURN

#第9条: 如果源地址是192.168.122.0/24,目标地址不是192.168.122.0/24,则进行MASQUE地址转换

K8s四层代理Service(模型分析)_IP_07

6、打印KUBE-POSTROUTING自定义链规则

#第1条: 创建一条自定义链

#第2条: 如果没有匹配到标记0x4000/0x4000,则RETURN回POSTROUTING继续处理

#第3条: 如果匹配第2条的印记,则继续添加一个标记0x4000/0x0

#第4条: 对源地址进行SNAT,SNAT的地址为本节点去往目标IP最近的接口IP地址

K8s四层代理Service(模型分析)_自定义_08

K8s四层代理Service(模型分析)_IP_09

7.1.2 NodePort分析

K8s四层代理Service(模型分析)_自定义_10

1、从OUTPUT发出的请求会被无条件拦截到KUBE-SERVICES自定义规则链上

K8s四层代理Service(模型分析)_IP_11

2、打印KUBE-SERVICES自定义链,过滤与nodeport相关规则,规则调度到了KUBE-NODEPORTS自定义链

K8s四层代理Service(模型分析)_IP_12

3、打印KUBE-NODEPORTS自定义链,然后过滤与nginx-svc相关的规则

#第1条: 创建一条自定义链

#第3条: 所有请求本机的30000跳转至KUBE-SVC-<HASH>自定义链规则处理

K8s四层代理Service(模型分析)_IP_13

4、打印KUBE-SVC-<HASH>自定义链,而后进行逐行分析

#第1条: 创建一条自定义链

#第2~4条: 将请求调度到对应的KUBE-SEP-<HASH>自定义链

K8s四层代理Service(模型分析)_自定义_14

5、打印KUBE-SEP-<HASH>自定义链

#第1条: 创建一条自定义链

#第2条: 请求IP如果是自己Pod的的IP,则交由KUBE-MARK-MASQ处理

#第3条: 进行DNAT地址转换,将请求ServiceIP替换为后端的PodIP地址

K8s四层代理Service(模型分析)_IP_15

6、数据经过OUTPUT,然后从FORWARD链走向POSTROUTING链

#第1条: 创建一条自定义链;

#第3条: 所有的数据包必须先进入KUBE-POSTROUTING自定义链进行规则匹配

#第4条: 如果源地址是172.17.0.0/16,目标地址接口不是docker0则进行地址转换

#第5条: 如果源地址是192.168.122.0/24,目标地址是224.0.0.0/24,则RETURN

#第9条: 如果源地址是192.168.122.0/24,目标地址不是192.168.122.0/24,则进行MASQUE地址转换

K8s四层代理Service(模型分析)_自定义_16

7、打印KUBE-POSTROUTING自定义链规则

#第1条: 创建一条自定义链

#第2条: 如果没有匹配到标记0x4000/0x4000,则RETURN回POSTROUTING继续处理

#第3条: 如果匹配第2条的印记,则继续添加一个标记0x4000/0x0

#第4条: 对源地址进行SNAT,SNAT的地址为本节点去往目标IP最近的接口IP地址

K8s四层代理Service(模型分析)_自定义_17

7.2 IPVS模型分析

1、会在每个节点上创建一个名为kube-ipvs0的虚拟接口,并将集群所有Service对象的ClusterIP都配置在该接口

2、kube-proxy将每个Service生成一个虚拟服务器VirtualServer的定义

注意: ipvs仅需要借助极少量的iptables规则完成源地址转换、源端口转换等

#设置集群为IPVS模式

kubectl edit cm kube-proxy -n kube-system

K8s四层代理Service(模型分析)_IP_18

#重启proxy的pod,先过滤proxy的相关名称,然后删除以达到重启的目的

kubectl delete pod $(kubectl get pod -n kube-system|grep proxy|awk '{print $1}') -n kube-system

#查看IP

ip addr show kube-ipvs0