问题:
解决思路:
分析原因:
kube-proxy 在 ipvs 模式下自定义了八条链,分别为 KUBE-SERVICES、KUBE-FIREWALL、KUBE-POSTROUTING、KUBE-MARK-MASQ、KUBE-NODE-PORT、KUBE-MARK-DROP、KUBE-FORWARD、KUBE-LOAD-BALANCER
NodePort的过程:
NAT表PREROUTING
PREROUTING的规则非常简单,凡是发给自己的包,*(经过KUBE-SERVICES直接转发给KUBE-NODEPORTS)则交给子链KUBE-NODEPORTS处理 KUBE-NODEPORTS规则如下:
其中通过KUBE-MARK-MASQ给包打0x4000/0x4000的标记,然后交给子链KUBE-SVC-UVFA6R2T7DODYNMU处理,具体流程如下:
其功能就是按照概率均等的原则DNAT到其中一个Endpoint
IP,即就是通过DNAT把该主机的30090端口的访问转发至->10.233.10.67:443上
以上流程可以归纳为:
外部主机访问master01:30090->NAT表PREROUTING->NAT表KUBE-SERVICES(因为不是CLUSTER_IP,因此不用判断,直接进入下一步)->NAT表KUBE-NODE-PORT->NAT表KUBE-MARK-MASQ->NAT表KUBE-SVC-UVFA6R2T7DODYNMU->DNAT把该主机的30090端口的访问转发至->10.233.10.67:443上*[如果10.233.10.67不是该节点上的pod,则会通过cni网络插件“calico或者fannel”转发至对应节点的pods上]**
CLUSTER_IP的流程
clusteip为10.223.13.16
解决方法
在 PREROUTING 中加入一条规则,将要屏蔽的ip直接DNAT到一个不用的端口,这样就不会在PREROUTING 的时候直接跳过INPUT进入K8S网络中
iptables -t nat -I PREROUTING -p tcp ! -s x.x.x.x/30 --dport 30001-j REDIRECT --to-ports 65535
联系客服