Kubernetes 上嵌套容器的 Calico IP-in-IP 连接问题

Calico IP-in-IP connectivity issues with nested containers on Kubernetes

我正在实施 cluster-api controller using Kubernetes as the infrastructure provider - 也就是说,我正在尝试 运行 Kubernetes 节点作为 Kubernetes Pods 并在集群中形成集群。

除了内部集群的 Pods 之间的网络连接(基础设施集群的 Pods 上的 运行ning)之外,我还有这个工作,但我不知道什么问题是。

我运行正在使用 GKE,使用他们的默认 CNI 实现。然后我尝试使用 Calico 进行内部集群的覆盖实现,使用 IP-in-IP 封装,因此基础设施集群的节点不需要知道如何路由内部集群 Pod IP。

我正在如下创建基础设施集群(Calico's IP-in-IP封装所需的ipip内核模块需要UBUNTU映像。

gcloud container clusters create management-cluster --image-type=UBUNTU

然后我将一些 nginx Pods 部署到内部集群。如果它们落在同一个内部集群节点上,它们就可以相互连接。如果它们落在单独的内部集群节点上,它们就不能,所以我认为这意味着 IP-in-IP 隧道无法正常工作,但我不确定为什么。即使内部集群节点(Pods)落在相同的基础设施(外部集群)节点上,这也会失败。两个集群的 Pod 和 Service CIDR 范围不重叠。

我知道这不是 Calico 支持的用例,但我看不出它不可能的原因,我想让它工作。外部集群节点是否需要支持转发IP-in-IP数据包?它们被配置为转发 IPv4 数据包,但我不确定这是否足够。

我想需要更多信息才能给出为什么这不起作用的具体原因,但我不太确定此时会是什么,如果有任何指示,我将不胜感激。

有必要在 GKE 节点上允许 ipencap 协议:

iptables -C FORWARD -p ipencap -j ACCEPT || iptables -A FORWARD -p ipencap -j ACCEPT