据我了解,当POD与服务对话时,IP表已由CNI提供程序进行了更新(这可能是特定于某些,但不是全部的CNI提供程序)。 iptables基本上提供了一个虚拟IP,然后将其进行轮询或分发(以某种方式)到后端临时容器。这些 Pane 可能位于群集中的同一主机或另一主机上。此时(再次基于CNI),当conntrack将svc-ip重新映射到POD的dest-ip时,它用于使src和dst保持直线。我想知道的是,如果dest pod在同一主机上,我不确定它如何在返回路径上路由。我会怀疑仍然通过服务,然后可能使用conntrack作为返回路径。
当Pod通过目标Pod在同一主机上的服务与Pod对话时,kubernetes是否会两次使用conntrack?

最佳答案

在尝试解释此主题时,我将以Calico为例。
仅需要从源Pod到服务端点的Conntrack。您必须对其进行跟踪才能将其余的流数据包发送到同一目标端点。返回路径始终只有一个选项:从目标容器到源容器,这意味着即使在此处使用conntrack,它也不改变任何内容,因为返回路径由NAT表管理。
还值得一提:

您可以使用conntrack command line interface来搜索,列出,检查和维护Linux内核的连接跟踪子系统。
例如:conntrack -L将以/ proc / net / ip_conntrack格式显示连接跟踪表:

 # conntrack -L
 tcp      6 431982 ESTABLISHED src=192.168.2.100 dst=123.59.27.117 sport=34846 dport=993 packets=169 bytes=14322 src=123.59.27.117 dst=192.168.2.100 sport=993 dport=34846 packets=113 bytes=34787 [ASSURED] mark=0 secmark=0 use=1
 tcp      6 431698 ESTABLISHED src=192.168.2.100 dst=123.59.27.117 sport=34849 dport=993 packets=244 bytes=18723 src=123.59.27.117 dst=192.168.2.100 sport=993 dport=34849 packets=203 bytes=144731 [ASSURED] mark=0 secmark=0 use=1
conntrack v0.9.7 (conntrack-tools): 2 flow entries have been shown.
一个实际的例子是您更改Calico的策略以禁止以前允许的流量。 Calico只需要检查在允许的流中(一对IP地址和端口之间)第一个数据包的策略,然后conntrack自动允许同一流中的其他数据包,而Calico无需重新检查每个数据包。如果最近在先前允许的流上交换了数据包,并且该流的conntrack状态尚未到期,那么即使更改了Calico策略,该conntrack状态也将允许在同一IP地址和端口之间发送更多数据包。为避免这种情况,您可以使用conntrack -D手动删除相关的conntrack状态,然后使用conntrack -E删除,以便通过新的Calico策略观察连接事件。
资料来源:
  • Linux Conntrack
  • Connection tracking
  • Kube-proxy modes
  • Packet flow

  • 我希望这有帮助。

    关于networking - 当Pod通过目标Pod在同一主机上的服务与Pod对话时,kubernetes是否会两次使用conntrack?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62661030/

    10-12 23:36