iptables代理模式下的ClusterIP iptables代理模式下的ClusterIP,每个Service在每个节点上(由kube-proxy负责生成)都会生成相应的iptables规则:
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值。
代码块1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 root@k8s-node01:~ -P OUTPUT ACCEPT -A OUTPUT -m comment --comment "kubernetes service portals" -j KUBE-SERVICES -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT -m addrtype --dst-type LOCAL -j CNI-HOSTPORT-DNAT root@k8s-master01:~ NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demoapp-svc ClusterIP 10.97.72.1 <none> 80/TCP 3d16h root@k8s-node01:~ -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.97.72.1/32 -p tcp -m comment --comment "default/demoapp-svc:http cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ -A KUBE-SERVICES -d 10.97.72.1/32 -p tcp -m comment --comment "default/demoapp-svc:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-ZAGXFVDPX7HH4UMW
KUBE-MARK-MASQ:专用目的自定义链,所有转至该自定义链的报文都将被置入特有的防火墙标记(0x4000)以便于将特定的类型的报文定义为单独的分类,目的在将该类报文转发到目标端点之前由POSTROUTING规则链进行源地址转换。
代码块2 1 2 3 4 5 6 7 8 root@k8s-node01:~ -N KUBE-MARK-MASQ -A KUBE-MARK-MASQ -j MARK --set-xmark 0x4000/0x4000
KUBE-SVC-:定义一个服务的流量调度规则,它通过随机调度算法(RANDOM)将请求分发给该Service的所有后端端点,每个后端端点定义在以KUBE-SEP为前缀名称的自定链上,后缀是端点信息的hash值。
代码块3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 root@k8s-node01:~ -N KUBE-SVC-ZAGXFVDPX7HH4UMW -A KUBE-SVC-ZAGXFVDPX7HH4UMW -m comment --comment "default/demoapp-svc:http" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-W5CYPK4IZKSNY6AN -A KUBE-SVC-ZAGXFVDPX7HH4UMW -m comment --comment "default/demoapp-svc:http" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-SNI6ZIEBIF6J7SOT -A KUBE-SVC-ZAGXFVDPX7HH4UMW -m comment --comment "default/demoapp-svc:http" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-SLUESE2KECGDKA4X -A KUBE-SVC-ZAGXFVDPX7HH4UMW -m comment --comment "default/demoapp-svc:http" -j KUBE-SEP-5NZKGQCCADX66CX7 root@k8s-master01:~ Name: demoapp Namespace: default Labels: app=demoapp Annotations: <none> Subsets: Addresses: 10.244.1.4,10.244.2.3,10.244.3.2,172.16.11.81 NotReadyAddresses: <none> Ports: Name Port Protocol ---- ---- -------- 80 80 TCP Events: <none>
KUBE-SEP-:定义一个端点相关的流量处理规则,它通常包含两条规则,前一条用于为那些源自该端点自身(-s ep_ip)的请求流量调用自定义链KUBE-MARQ-MASK打上特有的防火墙标记,后一条负责将发往该端点的所有流量进行目标IP地址和端口转换,新目标为该端点的IP和端口(-j DNAT –to-destination ep_ip:ep_port)。
代码块4 1 2 3 4 5 6 7 root@k8s-node01:~ -N KUBE-SEP-W5CYPK4IZKSNY6AN -A KUBE-SEP-W5CYPK4IZKSNY6AN -s 10.244.1.4/32 -m comment --comment "default/demoapp-svc:http" -j KUBE-MARK-MASQ -A KUBE-SEP-W5CYPK4IZKSNY6AN -p tcp -m comment --comment "default/demoapp-svc:http" -m tcp -j DNAT --to-destination 10.244.1.4:80
KUBE-POSTROUTING:专用的自定义链,由内置链POSTROUTING无条件调用,负责将拥有特有防火墙标记0x4000的请求报文进行源地址转换(Target为实现地址伪装的MASQUERADE),新的源地址为报文离开协议栈时流经接口的主IP(primary ip)地址。
代码块5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 root@k8s-node01:~ -P POSTROUTING ACCEPT -A POSTROUTING -m comment --comment "CNI portfwd requiring masquerade" -j CNI-HOSTPORT-MASQ -A POSTROUTING -m comment --comment "kubernetes postrouting rules" -j KUBE-POSTROUTING -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 10.244.0.0/16 -d 10.244.0.0/16 -j RETURN -A POSTROUTING -s 10.244.0.0/16 ! -d 224.0.0.0/4 -j MASQUERADE --random-fully -A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.1.0/24 -j RETURN -A POSTROUTING ! -s 10.244.0.0/16 -d 10.244.0.0/16 -j MASQUERADE --random-fully root@k8s-node01:~ -N KUBE-POSTROUTING -A KUBE-POSTROUTING -m mark ! --mark 0x4000/0x4000 -j RETURN -A KUBE-POSTROUTING -j MARK --set-xmark 0x4000/0x0 -A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -j MASQUERADE --random-fully
iptable代理模式下NodePort NodePort的流量的来源都为集群外部,所以其是由PREROUTING链调用的KUBE-SERVICE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 root@k8s-node01:~ -P PREROUTING ACCEPT -A PREROUTING -m comment --comment "kubernetes service portals" -j KUBE-SERVICES -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A PREROUTING -m addrtype --dst-type LOCAL -j CNI-HOSTPORT-DNAT root@k8s-master01:~ -A KUBE-SERVICES ! -s 10.244.0.0/16 -d 10.97.56.1/32 -p tcp -m comment --comment "default/demoapp-service-nodeport:http cluster IP" -m tcp --dport 80 -j KUBE-MARK-MASQ -A KUBE-SERVICES -d 10.97.56.1/32 -p tcp -m comment --comment "default/demoapp-service-nodeport:http cluster IP" -m tcp --dport 80 -j KUBE-SVC-YDLXCW2IFVSJIZMR -A KUBE-SERVICES -m comment --comment "kubernetes service nodeports; NOTE: this must be the last rule in this chain" -m addrtype --dst-type LOCAL -j KUBE-NODEPORTS root@k8s-master01:~ -N KUBE-NODEPORTS -A KUBE-NODEPORTS -p tcp -m comment --comment "default/demoapp:80" -m tcp --dport 31156 -j KUBE-MARK-MASQ -A KUBE-NODEPORTS -p tcp -m comment --comment "default/demoapp:80" -m tcp --dport 31156 -j KUBE-SVC-AZ2VLIOX5VGKTCYB root@k8s-master01:~ -N KUBE-SVC-AZ2VLIOX5VGKTCYB -A KUBE-SVC-AZ2VLIOX5VGKTCYB -m comment --comment "default/demoapp:80" -m statistic --mode random --probability 0.25000000000 -j KUBE-SEP-A5X3QL25Q5UGSWY7 -A KUBE-SVC-AZ2VLIOX5VGKTCYB -m comment --comment "default/demoapp:80" -m statistic --mode random --probability 0.33333333349 -j KUBE-SEP-WSKJMSX5XPODQ46G -A KUBE-SVC-AZ2VLIOX5VGKTCYB -m comment --comment "default/demoapp:80" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-ZCPJGBG3WJTOIVRD -A KUBE-SVC-AZ2VLIOX5VGKTCYB -m comment --comment "default/demoapp:80" -j KUBE-SEP-EKC65ZBALV67XSBV root@k8s-master01:~ -N KUBE-SEP-A5X3QL25Q5UGSWY7 -A KUBE-SEP-A5X3QL25Q5UGSWY7 -s 10.244.1.4/32 -m comment --comment "default/demoapp:80" -j KUBE-MARK-MASQ -A KUBE-SEP-A5X3QL25Q5UGSWY7 -p tcp -m comment --comment "default/demoapp:80" -m tcp -j DNAT --to-destination 10.244.1.4:80