私はcalicoのiptablesルールをデバッグしようとしましたが、奇妙な問題を見つけました。 nat:PREROUTING以降、一部のパケットが失われました。
3つの異なるノードに3つのポッドがあります。たとえば、次のようになります。
edge1/net-tool-edge1:10.22.46.41/192.168.0.16
node1/net-tool-node1:10.22.46.16/10.234.102.161
master/net-tool-master:10.22.49.16
edge1にはcalico-nodeはありませんが、edge1ではfabedge-agent(他のCNI)が実行されていることを指摘する必要があります。 Edge1に問題があるため、net-tool-edge1のパケットはNode1で失われます。これが私がcalico iptableルールをデバッグしようとしている理由です。なぜなら、fabedgeのバグがカリコに影響を与えないと思うからです。
trace
この記事で提案されているように、ターゲットを使用してiptablesをデバッグしました。https://www.opsist.com/blog/2015/08/11/how-do-i-see-what-iptables-is-doing.html
Calicoが正常に動作すると(net-tool-master - > net-tool-node1)、次の結果が表示されます。
raw:PREROUTING:policy:3
mangle:PREROUTING:rule:1
mangle:cali-PREROUTING:rule:3
mangle:cali-from-host-endpoint:return:1
mangle:cali-PREROUTING:return:5
mangle:PREROUTING:policy:2
nat:PREROUTING:rule:1
nat:cali-PREROUTING:rule:1
nat:cali-fip-dnat:return:1
nat:cali-PREROUTING:return:2
nat:PREROUTING:rule:2
nat:KUBE-SERVICES:return:18
nat:PREROUTING:policy:4
mangle:FORWARD:policy:1
filter:FORWARD:rule:1
filter:cali-FORWARD:rule:1
filter:cali-FORWARD:rule:2
filter:cali-from-hep-forward:return:1
filter:cali-FORWARD:rule:4
filter:cali-to-wl-dispatch:rule:3
filter:cali-tw-cali20fd069ebc8:rule:3
filter:cali-tw-cali20fd069ebc8:rule:4
filter:cali-pri-_zbxMTbNMDRyfczFBup:rule:1
filter:cali-pri-_zbxMTbNMDRyfczFBup:rule:2
filter:cali-tw-cali20fd069ebc8:rule:5
filter:cali-FORWARD:rule:5
filter:cali-to-hep-forward:return:1
filter:cali-FORWARD:rule:6
filter:cali-cidr-block:return:1
filter:cali-FORWARD:return:7
filter:FORWARD:rule:2
filter:FABEDGE-FORWARD:return:4
filter:FORWARD:rule:3
filter:KUBE-FORWARD:return:5
filter:FORWARD:rule:4
filter:KUBE-SERVICES:return:1
filter:FORWARD:rule:5
filter:KUBE-EXTERNAL-SERVICES:return:1
filter:FORWARD:rule:6
filter:DOCKER-USER:return:1
filter:FORWARD:rule:7
filter:DOCKER-ISOLATION-STAGE-1:return:2
filter:FORWARD:rule:12
mangle:POSTROUTING:rule:1
mangle:cali-POSTROUTING:rule:1
mangle:POSTROUTING:policy:2
nat:POSTROUTING:rule:1
nat:cali-POSTROUTING:rule:1
nat:cali-fip-snat:return:1
nat:cali-POSTROUTING:rule:2
nat:cali-nat-outgoing:return:2
nat:cali-POSTROUTING:return:4
nat:POSTROUTING:rule:2
nat:FABEDGE-POSTROUTING:return:3
nat:POSTROUTING:rule:3
nat:KUBE-POSTROUTING:rule:1
nat:POSTROUTING:policy:5
パケットが失われた場合(net-tool-edge1 - > net-tool-node1)、トレースは次のようになります。
raw:PREROUTING:policy:4
mangle:PREROUTING:rule:1
mangle:cali-PREROUTING:rule:3
mangle:cali-from-host-endpoint:return:1
mangle:cali-PREROUTING:return:5
mangle:PREROUTING:policy:2
nat:PREROUTING:rule:1
nat:cali-PREROUTING:rule:1
nat:cali-fip-dnat:return:1
nat:cali-PREROUTING:return:2
nat:PREROUTING:rule:2
nat:KUBE-SERVICES:return:18
nat:PREROUTING:policy:4
デフォルトポリシーはパケットを破棄するようですが、natテーブルのPREROUTINGデフォルトポリシーは次のとおりですACCEPT
。
[root@node1 ~]# iptables -t nat -L PREROUTING --line-numbers
Chain PREROUTING (policy ACCEPT)
num target prot opt source destination
1 cali-PREROUTING all -- anywhere anywhere /* cali:6gwbT8clXdHdC1b1 */
2 KUBE-SERVICES all -- anywhere anywhere /* kubernetes service portals */
3 DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
これは実際にはnat:PREROUTING:policy:4
正常な痕跡にも現れるので、それが原因ではないかもしれないと思います。
何が起こったのか本当にわからない。 conntrackの履歴も見つかりませんでした。
どんな助けでも歓迎します。よろしくお願いします。
答え1
パケットが失われる理由は、パスがなく、rp_filterがオンになっているためです。 rp_filterをオフにすると、データパケットが最終的にnet-tool-node1に到達する可能性があります。