kubernetes kube-proxy iptables问题


如题,在kubernetes里关于创建service后,会自动在node上创建相应的规则。但对其不是很理解。

-A PREROUTING -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-CONTAINER
-A PREROUTING -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-CONTAINER
-A OUTPUT -m comment --comment "handle ClusterIPs; NOTE: this must be before the NodePort rules" -j KUBE-PORTALS-HOST
-A OUTPUT -m addrtype --dst-type LOCAL -m comment --comment "handle service NodePorts; NOTE: this must be the last rule in the chain" -j KUBE-NODEPORT-HOST

以service默认的ClusterIP方式为例:
创建service以后,kube-proxy会自动在集群里的node上创建以下两条规则:
-A KUBE-PORTALS-CONTAINER -d 10.254.217.168/32 -p tcp -m comment --comment "default/frontend:" -m tcp --dport 80 -j REDIRECT --to-ports 45587
-A KUBE-PORTALS-HOST -d 10.254.217.168/32 -p tcp -m comment --comment "default/frontend:" -m tcp --dport 80 -j DNAT --to-destination 192.168.1.124:45587

如果是NodePort方式,还会额外生成两条:
-A KUBE-NODEPORT-CONTAINER -p tcp -m comment --comment "default/frontend:" -m tcp --dport 30002 -j REDIRECT --to-ports 45587
-A KUBE-NODEPORT-HOST -p tcp -m comment --comment "default/frontend:" -m tcp --dport 30002 -j DNAT --to-destination 192.168.1.124:45587

1、四个chain分别作用是什么
2、外部访问service,node上的流程是怎么样的
已邀请:

wulonghui - PaaS工程师

赞同来自: 用心阁


-A KUBE-PORTALS-CONTAINER -d 10.254.217.168/32 -p tcp -m comment --comment "default/frontend:" -m tcp --dport 80 -j REDIRECT --to-ports 45587
-A KUBE-PORTALS-HOST -d 10.254.217.168/32 -p tcp -m comment --comment "default/frontend:" -m tcp --dport 80 -j DNAT --to-destination 192.168.1.124:45587

Kube-Proxy负责Service VIP的转发, 这2条规则的作用是将访问10.254.217.168/32:80 的请求被转发到主机的45587端口,而45587端口正是Kube-Proxy监听的端口,它会转发给Service关联的Pod.另外,KUBE-PORTALS-CONTAINER 的作用是转发容器发出的请求,KUBE-NODEPORT-HOST的作用是转发在主机上的请求,作用其实都是转发10.254.217.168/32:80的请求。

另外NodePort方式下会多加2条规则:
-A KUBE-NODEPORT-CONTAINER -p tcp -m comment --comment "default/frontend:" -m tcp --dport 30002 -j REDIRECT --to-ports 45587
-A KUBE-NODEPORT-HOST -p tcp -m comment --comment "default/frontend:" -m tcp --dport 30002 -j DNAT --to-destination 192.168.1.124:45587

作用是转发请求到主机30002 端口的请求到主机的45587端口,即通过主机IP:30002 就可以访问到Service。2个Chain的作用跟之前类似。

gosharplite

赞同来自: 用心阁


K8S用三个网段。
<ol><li>service cluster ip,这是给service用的虚拟网段。你的环境设定可能是kube-apiserver --service-cluster-ip-range=10.254.217.0/32。</li><li>node ip,物理机ip。你的worker node ip是192.168.1.124。</li><li>container overlay ip,容器虚拟覆盖网路,这里看不出来数字。若用flannel,可能的设定为etcdctl -C "http://<etcd server>:2379" mk /coreos.com/network/config '{"Network":"<strong>11.1.0.0/16</strong>","Backend":{"Type":"vxlan"}}'。</li></ol>
楼上写的不错,若开两台worker nodes来玩,会更清楚。

要回复问题请先登录注册