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模型分析
7.1.1 ClusterIP模型分析
1、从OUTPUT发出的请求会被无条件拦截到KUBE-SERVICES自定义规则链上
2、打印KUBE-SERVICES自定义链,所有对nginx-svc发起的请求,都调度到KUBE-SVC-<HASH>链上
#来源不是10.244.0.0/16网段,但请求的是nginx-svc的IP则交给KUBE-MARK-MASQ链进行处理
3、打印KUBE-SVC-<HASH>自定义链,而后进行逐行分析
#第1条: 创建一条自定义链
#第2~4条: 由iptables将请求调度到不同的KUBE-SEP-<HASH>上
4、打印任意一条KUBE-SEP-<HASH>自定义链
#第1条: 创建一条自定义链
#第2条: 请求IP如果是自己Pod的的IP,则交由KUBE-MARK-MASQ处理
#第3条: 进行DNAT地址转换,将请求ServiceIP替换为后端的PodIP地址,然后将请求发出
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地址转换
6、打印KUBE-POSTROUTING自定义链规则
#第1条: 创建一条自定义链
#第2条: 如果没有匹配到标记0x4000/0x4000,则RETURN回POSTROUTING继续处理
#第3条: 如果匹配第2条的印记,则继续添加一个标记0x4000/0x0
#第4条: 对源地址进行SNAT,SNAT的地址为本节点去往目标IP最近的接口IP地址
7.1.2 NodePort分析
1、从OUTPUT发出的请求会被无条件拦截到KUBE-SERVICES自定义规则链上
2、打印KUBE-SERVICES自定义链,过滤与nodeport相关规则,规则调度到了KUBE-NODEPORTS自定义链
3、打印KUBE-NODEPORTS自定义链,然后过滤与nginx-svc相关的规则
#第1条: 创建一条自定义链
#第3条: 所有请求本机的30000跳转至KUBE-SVC-<HASH>自定义链规则处理
4、打印KUBE-SVC-<HASH>自定义链,而后进行逐行分析
#第1条: 创建一条自定义链
#第2~4条: 将请求调度到对应的KUBE-SEP-<HASH>自定义链
5、打印KUBE-SEP-<HASH>自定义链
#第1条: 创建一条自定义链
#第2条: 请求IP如果是自己Pod的的IP,则交由KUBE-MARK-MASQ处理
#第3条: 进行DNAT地址转换,将请求ServiceIP替换为后端的PodIP地址
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地址转换
7、打印KUBE-POSTROUTING自定义链规则
#第1条: 创建一条自定义链
#第2条: 如果没有匹配到标记0x4000/0x4000,则RETURN回POSTROUTING继续处理
#第3条: 如果匹配第2条的印记,则继续添加一个标记0x4000/0x0
#第4条: 对源地址进行SNAT,SNAT的地址为本节点去往目标IP最近的接口IP地址
7.2 IPVS模型分析
1、会在每个节点上创建一个名为kube-ipvs0的虚拟接口,并将集群所有Service对象的ClusterIP都配置在该接口
2、kube-proxy将每个Service生成一个虚拟服务器VirtualServer的定义
注意: ipvs仅需要借助极少量的iptables规则完成源地址转换、源端口转换等
#设置集群为IPVS模式
kubectl edit cm kube-proxy -n kube-system
#重启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