calico-node pod CrashLoopBackOff 显示 “BGP not established”

11次阅读

Calico-node 进入 CrashLoopBackOff 且日志显示 “BGP not established”,说明 BGP 网络连接失败,需排查对等体状态、TCP 179 端口连通性、IP 自动发现配置及 BIRD 日志。

calico-node pod CrashLoopBackOff 显示 “BGP not established”node 进入 CrashLoopBackOff 且日志显示 “BGP not established”,说明 Calico 的 BGP 网络连接失败,节点无法加入集群网络拓扑。这不是单纯重启能解决的问题,需系统排查 BGP 配置与底层连通性。

检查 calico-node 是否能与其他节点建立 BGP 对等体

Calico 默认使用 Node-to-Node Mesh 模式,每个节点应与集群内其他所有节点建立 BGP 连接。执行以下命令确认对等体状态:

  • 进入任一正常运行的 calico-node 容器:kubectl exec -it -n kube-system calico-node-xxxxx -- sh
  • 运行:calicoctl node status(需容器内有 calicoctl)或更通用的:birdc show protocols
  • 观察输出中各 peer 的状态是否为 Established;若大量显示 ConnectActiveIdle,说明 BGP 握手卡在 TCP 连接或 OPEN 协商阶段

验证节点间 TCP 179 端口是否可达

BGP 依赖 TCP 179 端口通信。常见原因包括防火墙拦截、安全组限制、云厂商网络策略或主机 iptables 规则屏蔽。

  • 在问题节点上执行:nc -vz 179,测试能否连通任意一个正常节点
  • 如不通,检查:
    云服务器安全组是否放行 179 端口(入+出)
    • 主机 firewalld/iptables/nftables 是否 DROP 了 179 端口
    • 内核参数 net.ipv4.ip_forward=1 是否启用(部分环境必须)

确认 calico 配置中的 IP 地址是否正确

Calico 使用 IP_AUTODETECTION_METHOD 自动发现本机 IP。若选错网卡(比如选到 docker0、lo 或内网管理网卡),会导致 BGP 对端地址错误,连接失败。

  • 查看当前配置:kubectl get pod -n kube-system calico-node-xxxx -o yaml | grep -A5 "IP_AUTODETECTION_METHOD|IP"
  • 推荐显式指定:在 calico-node DaemonSet 的 env 中设置
    - name: IP
    value: "autodetect"
    - name: IP_AUTODETECTION_METHOD
    value: "Interface=eth0"

    (替换 eth0 为实际业务网卡名)

  • 也可用 CIDR 匹配:value: "can-reach=8.8.8.8""first-found",但不如 interface 明确

检查 BIRD 日志定位具体失败原因

calico-node 底层使用 BIRD 路由守护进程。直接看其日志比只看 kubernetes 事件更精准:

  • 获取实时 BIRD 日志:kubectl logs -n kube-system calico-node-xxxxx | grep -i "bird|bgp|179"
  • 典型错误示例:
    “Can’t bind socket to 0.0.0.0:179: Address already in use” → 其他进程占用了 179 端口
    “Network is unreachable” → 本地路由缺失,无法到达对端 IP
    “Peer x.x.x.x:179, state Idle, reason: No route to host” → 网络层不通或 ARP 失败

text=ZqhQzanResources