calico跨主机node访问pod问题

实验环境:calico版本:v0.23,kubernetes版本:1.35

kubernetes网络使用calico,当namespace使用以下命令配置隔离policy的后:


kubectl annotate ns "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"


问题:跨主机node访问pod被隔离了。但是kubernetes中外网访问service需要node节点可以访问所有pod。


通过分析calico创建的iptables,node跨主机访问pod进过FORWARD链的时候被drop掉了。创建namespace的时候,calico默认会创建felix-p-_e9d3a9f50c6dd3a-i  felix-p-k8s_ns.net1-sub1-i 这两条链,第一条链会把非pod的流量给drop掉。

Chain felix-to-528799797b0 (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            MARK and 0xfeffffff
    0     0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Start of tier k8s-network-policy */ MARK and 0xfdffffff
    0     0 felix-p-_e9d3a9f50c6dd3a-i  all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x0/0x2000000
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1000000/0x1000000 /* Return if policy accepted */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x0/0x2000000 /* Drop if no policy in tier passed */
    0     0 felix-p-k8s_ns.net1-sub1-i  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1000000/0x1000000 /* Profile accepted packet */
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* Packet did not match any profile (endpoint eth0) */



可以通过以下命令给k8s默认的ns的profile添加rule

./calicoctl profile k8s_ns.net1-sub1 rule add inbound --at=1 allow from cidr 10.10.102.0/24


结果如图所示:

calico跨主机node访问pod问题_第1张图片

查看iptables发现该rule被添加到了第二条链。

Chain felix-p-k8s_ns.net1-sub1-i (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       all  --  *      *       10.10.102.0/24       0.0.0.0/0            MARK or 0x1000000
    0     0 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0x1000000/0x1000000
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0      

通过手动删除第一条链发现跨主机的node流量可以访问pod。



你可能感兴趣的:(calico)