calico 跨网段问题

部署运行你感兴趣的模型镜像

Calico 简介

Calico 是一个基于BGP协议的网络互联解决方案。它是一个纯3层的方法,使用路由来实现报文寻址和传输。
相比 flannel, ovs等SDN解决方案,Calico 避免了层叠网络带来的性能损耗。将节点当做 router ,位于节点上的 container 被当做 router 的直连设备。利用 Kernel 来实现高效的路由转发。 节点间的路由信息通过 BGP 协议在整个 Calico 网络中传播。 具有以下特点:
1. 在 calico 中的数据包不需要进行封包和解封。
2. 基于三层网络通信,troubleshoot 会更方便。
3. 网络安全策略使用 ACL 定义,基于 iptables 实现,比起 overlay 方案中的复杂机制更只管和容易操作。

Environment

img

serveripmacgw mac
walker-1172.16.6.47fa:16:3e:02:8b:1700:23:89:8C:E8:31
walker-2172.16.6.249fa:16:3e:8c:21:1300:23:89:8C:E8:31
demi-1172.16.199.114fa:16:3e:d9:a0:5e00:23:89:8C:E8:31
busybox-1192.168.187.2113a:1d:1e:91:f5:9e66:39:fa:e7:9f:a9
busybox-2192.168.135.74de:16:fc:1c:44:355a:4a:df:5e:c9:6c
busybox-3192.168.121.2de:16:fc:1c:44:358e:6b:fa:f7:5d:3b

node2 单独位于vlan 199 中,和master以及node1间的通信需要经过网关(Router)转发。

使用 IP-in-IP

ipip enable=false

$ calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
  cidr: 192.168.0.0/16
spec:
  nat-outgoing: true
EOF

ipip 模式禁用时,busybox-3busybox-{1,2} 之间无法通信。

分析如下:

主机路由:

[root@walker-1 manifests]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.6.254    0.0.0.0         UG    0      0        0 eth0
169.254.169.254 172.16.6.87     255.255.255.255 UGH   0      0        0 eth0
172.16.6.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.121.0   172.16.199.114  255.255.255.192 UG    0      0        0 eth0
192.168.135.64  172.16.6.249    255.255.255.192 UG    0      0        0 eth0
192.168.187.192 0.0.0.0         255.255.255.192 U     0      0        0 *
192.168.187.209 0.0.0.0         255.255.255.255 UH    0      0        0 calic6611247c43
192.168.187.211 0.0.0.0         255.255.255.255 UH    0      0        0 calie50081a277c

busybox-1 发往 busybox-3 的报文头部如下所示:

src max | dst mac | src ip | dst ip 
---     | ---     | ---    | ---    
3a:1d:1e:91:f5:9e | 66:39:fa:e7:9f:a9  | 192.168.187.211 | 192.168.121.2

根据宿主机路由,报文会从eth0 发往 172.16.199.114。

由于二者位于不通广播域,需要通过网关转发。因此报文的 dst mac 会被修改为 172.16.6.254(gw) 对应的mac。

src max | dst mac | src ip | dst ip | enc src IP | enc dst IP 
---     | ---     | ---    | ---    | --- | ---
fa:16:3e:02:8b:17 | 00:23:89:8C:E8:31  | 192.168.187.211 | 192.168.121.2

gw 收到该报文后,会比对本地路由条目。由于 router 中并没有到 192.168.121.0\26 网段的路由,因此报文被丢弃。

ipip enable=true

$ calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
  cidr: 192.168.0.0/16
spec:
  ipip:
    enabled: true
    mode: always
  nat-outgoing: true
EOF

这种模式下,可实现跨网段节点上容器的互通。

[root@walker-1 manifests]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.6.254    0.0.0.0         UG    0      0        0 eth0
169.254.169.254 172.16.6.87     255.255.255.255 UGH   0      0        0 eth0
172.16.6.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.121.0   172.16.199.114  255.255.255.192 UG    0      0        0 tunl0
192.168.135.64  172.16.6.249    255.255.255.192 UG    0      0        0 tunl0
192.168.187.192 0.0.0.0         255.255.255.192 U     0      0        0 *
192.168.187.209 0.0.0.0         255.255.255.255 UH    0      0        0 calic6611247c43
192.168.187.211 0.0.0.0         255.255.255.255 UH    0      0        0 calie50081a277c

busybox-1 发送报文至 busybox-3 时,根据 master 上路由,会经过 tunl0 设备。tunl0 会为原来的IP报文在封装一层IP协议头。过程如下:

  1. busybox-1 向 busybox-3 发送 icmp 报文(略去容器至 calico 网卡步骤)。

    src maxdst macsrc ipdst ip
    3a:1d:1e:91:f5:9e66:39:fa:e7:9f:a9192.168.187.211192.168.121.2
  2. 报文被node 截获,查询本机路由后由 tunl0 设备将报文发出。

    src maxdst macsrc ipdst ipenc src IPenc dst IP
    fa:16:3e:02:8b:1700:23:89:8C:E8:31192.168.187.211192.168.121.2172.16.6.47172.16.199.114
  3. 报文发送至网关(router), 根据目的IP将报文路由至 172.16.199.114(略去ARP等步骤)。

    src maxdst macsrc ipdst ipenc src IPenc dst IP
    00:23:89:8C:E8:31fa:16:3e:d9:a0:5e192.168.187.211192.168.121.2172.16.6.47172.16.199.114
  4. 到达 demi-1 后,根据 demi-1 上的路由策略,将报文发送至 busybox-3(略去容器至 calico 网卡步骤) 。

    src maxdst macsrc ipdst ip
    8e:6b:fa:f7:5d:3bde:16:fc:1c:44:35192.168.187.211192.168.121.2

Note: ==容器的 gw 为和该容器对应的 calico 网卡。==

虽然实现了 calico 跨网段通信,但对于 busybox-{1,2} 间的通信来说,IP-in-IP 就有点多余了,因为2者宿主机处于同一广播域,2层互通,直接走主机路由即可。

calico cross-subnet

$ calicoctl apply -f - << EOF
apiVersion: v1
kind: ipPool
metadata:
  cidr: 192.168.0.0/16
spec:
  ipip:
    enabled: true
    mode: cross-subnet
  nat-outgoing: true
EOF

为了解决IP-in-IP 模式下,同网段封装报文的问题,calico 提供了 cross-subnet 的配置选项

[root@walker-1 k8s]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.6.254    0.0.0.0         UG    0      0        0 eth0
169.254.169.254 172.16.6.87     255.255.255.255 UGH   0      0        0 eth0
172.16.6.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.121.0   172.16.199.114  255.255.255.192 UG    0      0        0 tunl0
192.168.135.64  172.16.6.249    255.255.255.192 UG    0      0        0 eth0
192.168.187.192 0.0.0.0         255.255.255.192 U     0      0        0 *
192.168.187.209 0.0.0.0         255.255.255.255 UH    0      0        0 calic6611247c43
192.168.187.211 0.0.0.0         255.255.255.255 UH    0      0        0 calie50081a277c

从主机路由可看出,对于同一网段中的路由,直接走 eth0 网卡。

默认情况下,calico 在启动时会自动选择一块网卡。当主机上有多块网卡时,为了保证路由的正确性,需要手动指定 calico 使用哪块物理网卡。参考一下链接:

http://docs.projectcalico.org/v2.3/usage/configuration/node

Note

The cross-subnet mode option requires each Calico node to be configured with the IP address and subnet of the host. However, the subnet configuration was only introduced in Calico v2.1. If any nodes in your deployment were originally created with an older version of Calico, or if you if you are unsure whether your deployment is configured correctly, follow the steps in Upgrading from pre-v2.1 before enabling cross-subnet IPIP.

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

<think>嗯,用户正在排查Kubernetes集群中Calico网络的跨节点Pod通信故障。从引用内容看,用户已经收集了部分故障现象:节点间Pod互ping不通,但同节点Pod通信正常。这类问题Calico部署中很常见,通常涉及网络配置、路由或策略问题。 用户提供的引用材料很有价值: - 引用[1]展示了抓包排查的方法,这是验证数据包走向的关键手段 - 引用[2]提到Calico的BGP协议对节点规模有限制,但用户未说明集群规模,暂时可排除 - 引用[3]描述的故障现象与用户完全一致,特别注意到节点间双向不通的特征 - 引用[4]涉及镜像拉取问题,与当前故障关联度不高 需要引导用户从三个维度排查: 首先是网络连通性基础层,包括物理网络MTU值(Calico默认1500但云环境常需调低)、节点防火墙(特别是UDP 4789端口)。曾遇到某客户因未关闭firewalld导致VXLAN封装包被丢弃的案例。 其次是BGP路由层面,Calico依赖BGP同步节点路由。若calico-node日志出现"bird: BGP session failed"提示,需检查节点IP可达性和端口179。有趣的是,树莓派集群常因ARM架构的BGPD容器镜像兼容性问题导致路由表更新失败。 最后是IP地址池配置,引用[1]提到的IPAM区块校验很重要。曾有用例因ippool的CIDR配置错误,导致跨子网节点分配了不同网段IP却未开启NAT而出错。需要特别检查calicoctl get ippool -o yaml中的natOutgoing字段。 用户未提及集群环境细节,补充建议里需要包含云厂商特殊说明。比如AWS的源目标检查禁用要求,以及阿里云VPC路由表100条的限制可能影响大规模Calico集群。 故障树工具可能对用户更友好,将文字步骤转化为决策树能减少排查盲区。最后保留的"抓包分析"作为终极手段,因为tcpdump在Calico的veth-pair和calixxx接口抓包需要特定技巧。 </think> 以下是针对Kubernetes中使用Calico时跨节点Pod无法访问问题的系统化排查解决方案,结合引用内容和常见故障场景整理: --- ### **一、核心排查步骤** 1. **验证网络基础连通性** - 检查节点间网络:在Node1执行 `ping <Node2_IP>`,确保物理网络互通 - 验证防火墙规则:关闭防火墙或放行关键端口 ```bash # Calico所需端口(BGP模式) TCP 179, 5473 UDP 4789(IPIP模式) ``` *引用[2]提到BGP协议依赖节点间通信[^2]* 2. **检查Calico组件状态** ```bash kubectl get pods -n kube-system | grep calico # 确认所有calico-node-xxx和calico-kube-controllers状态为Running ``` 若容器异常,检查日志: ```bash kubectl logs -n kube-system <calico-node-pod> --tail 100 ``` *引用[4]显示Calico正常运行时组件状态[^4]* 3. **验证IP地址分配** ```bash calicoctl get ipamblocks -A # 检查IP池分配状态 kubectl get pods -o wide | grep <问题Pod> # 确认Pod分配到合法IP ``` *引用[1]强调通过ipamblocks验证地址段[^1]* 4. **检查路由表** - 在**源节点**执行: ```bash ip route | grep calico route -n | grep <目标Pod网段> ``` - 若缺失目标Pod网段路由,检查BGP邻居状态: ```bash calicoctl node status ``` 正常应显示`Established`(如显示`Active`或`Connect`需排查) 5. **跨节点抓包分析** - 在**源节点**的cali接口抓包: ```bash tcpdump -i cali<ID> -nn host <目标PodIP> ``` - 在**目标节点**的eth0接口抓包: ```bash tcpdump -i eth0 -nn host <源PodIP> and udp port 4789 # IPIP模式 ``` *引用[1]通过抓包定位跨节点通信失败* --- ### **二、常见问题解决方案** | **故障类型** | **解决措施** | |----------------------|---------------------------------------------------------------------------------------------------------------------------------------------| | **BGP邻居未建立** | 1. 确认节点IP可互通且防火墙放行TCP 179<br>2. 检查`calico-node`容器的`IP_AUTODETECTION_METHOD`配置是否正确绑定物理网卡 | | **IPIP模式封装失败** | 1. 验证内核加载IPIP模块:`lsmod \| grep ipip`<br>2. 检查IPPool配置:`calicoctl get ippool -o yaml` 确认`ipipMode: Always`或`CrossSubnet`[^2] | | **IP地址冲突** | 1. 检查是否存在重复分配的Pod IP<br>2. 确认不同节点Pod网段无重叠(`calicoctl get ippool`查看CIDR) | | **网络策略拦截** | 临时禁用所有NetworkPolicy:`calicoctl delete -f default-deny.yaml`(测试后恢复) | | **MTU不匹配** | 1. 在IPPool中调整`vxlanMode`或`ipipMode`的MTU值(通常调低)<br>2. 使用`calicoctl patch ippool default-ipv4-ippool -p '{"spec":{"mtu":1440}}'` | --- ### **三、高级诊断工具** 1. **Calico诊断包收集** ```bash calicoctl diags --log-dir ./calico-diag ``` 包含节点状态、BGP路由表、组件日志等 2. **路由追踪** - 从Pod内部执行跨节点追踪: ```bash kubectl exec -it <Pod名> -- traceroute <目标PodIP> ``` - 观察路由中断位置(常见于节点网关或Underlay网络) --- ### **四、配置优化建议** 1. **大规模集群**:关闭全互联模式(node-to-node mesh),启用[Route Reflector](https://docs.tigera.io/calico/latest/networking/bgp#large-scale-deployment-considerations) ```yaml apiVersion: projectcalico.org/v3 kind: BGPConfiguration metadata: {name: default} spec: {nodeToNodeMeshEnabled: false} ``` *引用[2]指出全互联模式在100+节点时存在瓶颈[^2]* 2. **混合云环境**:使用`ipipMode: CrossSubnet`(同子网直连,跨子网封装) ```yaml spec: ipipMode: CrossSubnet natOutgoing: true ``` --- ### **故障树** ```mermaid graph TD A[跨节点Pod不通] --> B{节点间网络通?} B -->|否| C[检查防火墙/交换机配置] B -->|是| D{Calico组件正常?} D -->|否| E[查看calico-node日志] D -->|是| F{路由表存在目标网段?} F -->|否| G[检查BGP邻居状态] F -->|是| H[抓包分析数据包丢失点] H -->|到达目标节点| I[检查目标Pod防火墙] H -->|未到达目标节点| J[检查Underlay网络设备] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值