kubernetes externalTrafficPolicy:集群服务超时(包括 tcp 转储)

kubernetes externalTrafficPolicy: Cluster service timing out (tcp dump included)

我有一个 kubernetes 服务设置为 externalTrafficPolicy: Cluster(这是一个简单的 nginx 后端)。当我尝试从集群外部卷曲它时,它经常超时。 loadBalancerSourceRanges 设置为 0.0.0.0/0,它实际上很少成功(2/20 次)。

我知道在 externalTrafficPolicy:Cluster 服务中,集群中的节点使用 iptables 访问 pod。所以我从 pod 和集群中试图到达 pod 的节点做了一些 tcpdumps

下面是来自后端 pod 尝试访问并向其发送数据的节点的 tcpdump。 (注意我正在为我的集群 CNI 插件使用 Calico)。 10.2.243.236是后端pod的IP

sudo tshark -i vxlan.calico | grep 10.2.243.236
Running as user "root" and group "root". This could be dangerous.
Capturing on 'vxlan.calico'
468 463 5.867497471   10.2.0.192 -> 10.2.243.236 TCP 58 38109 > http [SYN] Seq=0 Win=7514 Len=0 MSS=1460
464 5.867920115 10.2.243.236 -> 10.2.0.192   TCP 58 http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310
604 599 7.372050068 10.2.243.236 -> 10.2.0.192   TCP 58 [TCP Retransmission] http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310
759 781 9.372058511 10.2.243.236 -> 10.2.0.192   TCP 58 [TCP Retransmission] http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310
1094 1078 13.372017415 10.2.243.236 -> 10.2.0.192   TCP 58 [TCP Retransmission] http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310
1877 1913 21.372786131 10.2.243.236 -> 10.2.0.192   TCP 58 [TCP Retransmission] http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310
3285 3281 37.372007425 10.2.243.236 -> 10.2.0.192   TCP 58 [TCP Retransmission] http > 38109 [SYN, ACK] Seq=0 Ack=1 Win=26200 Len=0 MSS=1310

所以基本上看起来节点正在发起 TCP 连接,但没有响应 pod 的 syn-ack 消息,最终连接超时。

我该如何进一步调试呢?我对如何调试节点似乎没有响应它最初启动的连接的原因有些疑惑。

注意:我可以从每个节点内成功卷曲 pod IP。

答:我们在kubernetes集群上安装了Calico作为CNI插件。我们没有设置 kube 代理的 --cluster-cidr 参数,因为我们相信 Calico 会负责创建规则。

在 kubernetes 节点上 运行 iptables-save 后,发现没有规则实际匹配 pod cidr 范围,因此数据包被默认的 FORWARD DROP 规则丢弃(这可以使用 iptables 验证-保存-c).

设置 kube-proxy 的 cluster-cidr 参数并在所有工作节点上重新启动 kube proxy 后,IPtables 规则按预期创建,具有 externalTrafficPolicy: Cluster 的服务按预期工作。