Kubernetes CNI Hairpin 流量

Kubernetes CNI Hairpin 流量

我使用以下方式设置了 Kubernetes 集群Kubernetes 的艰难之路教程中,每当 Pod 通过 ClusterIP(发夹流量)连接到同一节点上的另一个 Pod 时,连接就会挂起。

如果我直接访问 pod,而不通过 ClusterIP,一切都可以正常工作。

因此,从视觉上看,这是行不通的:

PodA -> ServiceA ClusterIP -> PodA 
PodA -> ServiceB ClusterIP -> PodB on same node 

但是,这种方法 100% 有效,任何 Pod 都可以直接通过其 IP 联系另一个 Pod:

PodA -> ServiceB ClusterIP -> PodB on other node 

我发现有关调试服务的 Kubernetes 文档并进行了检查,一切似乎都很好,直到Pod 无法通过 Service VIP 访问自身

我在输出中看到为我的服务添加了规则iptables-save(并且我确认使用iptables模式):

-A KUBE-SERVICES ! -s 10.200.0.0/16 -d 10.32.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.32.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SERVICES ! -s 10.200.0.0/16 -d 10.32.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.32.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4

我可以从 kubelet 的日志promiscuous-bridge发夹模式标志中看到:

kubelet[12496]: I1204 04:13:29.761707   12496 flags.go:33] FLAG: --hairpin-mode="promiscuous-bridge"

我没有看到Hairpin mode set to "promiscuous-bridge"具体确认模式的日志,因此我也在 kubelet-config.yml 中明确设置了它

另外,我编辑了 CNI 插件以添加promiscMode: true文档),我PROMISCcnio0界面上看到:

cnio0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500

此时,我认为要么 1)本教程没有涉及发夹式流量工作,要么 2)我搞砸了一些不为人知的、导致问题的东西,但我不知道是什么!

由于这个 Kubernetes the Hard Way 教程被认为是规范的设置参考,我怀疑它是否会是第一名……有人有其他建议来确定第二名吗?

答案1

这是 CNI 的一个已知问题这里这里

我认为抽象的“允许发夹行为”是插件的一个属性。有些插件支持它。有些插件不支持。有些插件可能需要配置才能以多种方式支持它。如果您在 Kubernetes 安装中不支持它,则一类服务行为将无法正常工作。对于某些安装来说,这可能没问题,但对于其他安装来说则不行。

不过,你可以使用绒布hairpinMode设置为(true默认的 flannel 配置不会设置HairpinModetrue)。该部分配置如下所示:

    {
      "name": "<name_here>",
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }

如果有帮助的话请告诉我。

相关内容