1. 问题现象与初步判断
上周在部署Kubernetes集群时遇到了一个典型问题:Calico-Node Pod启动后一直卡在READY 0/1状态。这种状态通常意味着Pod内的主容器未能通过健康检查,导致Pod无法进入就绪状态。作为CNI插件的核心组件,Calico-Node的异常会直接导致集群网络功能瘫痪。
通过kubectl describe pod命令查看事件日志,发现容器反复重启,最关键的报错信息是:
code复制Readiness probe failed: calico/node is not ready: BIRD is not ready: BGP not established with 10.0.0.1
这个错误指向了Calico网络的核心组件BIRD(BIRD Internet Routing Daemon)未能与对等节点建立BGP连接。BGP协议在Calico中负责节点间的路由信息交换,它的异常会导致节点间网络不通。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 排查BGP连接问题
2.1 检查BIRD服务状态
首先进入问题Pod内部检查BIRD进程状态:
bash复制kubectl exec -it calico-node-xxxx -n kube-system -- /bin/bash
ps aux | grep bird
正常情况下应该看到bird和bird6两个进程运行。如果缺失,可能是:
- 容器启动时bird进程崩溃退出
- 配置文件错误导致服务无法启动
2.2 验证BGP配置
查看Calico的BGPPeer资源配置:
bash复制kubectl get bgppeer -o yaml
特别注意peerIP是否正确配置为对端节点IP(如物理路由器或集群其他节点)。常见的配置错误包括:
- 对端AS号(asNumber)与对端设备不匹配
- 对端IP地址配置错误
- 网络策略阻止了TCP 179端口通信
2.3 网络连通性测试
在Pod内测试到对端BGP端口的连通性:
bash复制nc -zv <peer_ip> 179
如果连接失败,需要检查:
- 节点间网络是否互通(跨节点ping测试)
- 防火墙是否放行BGP端口(默认TCP 179)
- 是否有NetworkPolicy阻止了通信
3. 检查Calico配置
3.1 IP池配置验证
错误的IP池配置会导致路由无法正确发布:
bash复制kubectl get ippool -o yaml
重点关注:
- cidr是否与集群节点网络重叠
- ipipMode是否与网络环境匹配(云环境通常需要开启)
- natOutgoing是否按需开启
3.2 节点资源分配
查看Calico-Node资源使用情况:
bash复制kubectl top pod -n kube-system | grep calico-node
资源不足可能导致进程异常。建议配置:
yaml复制resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
4. 深入日志分析
4.1 查看Calico-Node日志
获取详细错误信息:
bash复制kubectl logs -n kube-system calico-node-xxxx -c calico-node
常见关键错误:
Failed to connect to etcd:ETCD连接问题Felix is not ready:数据平面组件异常BGP peer not established:BGP对等连接失败
4.2 检查Felix组件
Felix负责Calico的数据平面规则编程:
bash复制kubectl exec -it calico-node-xxxx -n kube-system -- /bin/bash
cat /var/log/calico/felix.log
重点关注iptables/nftables相关错误,如:
- 内核模块缺失(ip_set, xt_set等)
- 权限不足导致规则写入失败
5. 环境特定问题排查
5.1 云服务商特殊配置
在AWS/Azure等云环境需要特别注意:
- 云供应商网络插件冲突(如aws-node)
- 安全组需要放行节点间所有流量
- 源目标检查需要关闭
5.2 内核兼容性问题
Calico对Linux内核版本有要求:
bash复制uname -r
推荐使用4.14+内核,并检查必需的内核模块:
bash复制lsmod | grep -E 'ip_tables|ip6_tables|iptable_nat|ip6table_nat|iptable_filter|ip6table_filter'
6. 恢复与验证步骤
6.1 临时恢复方案
如果急需恢复网络,可以:
- 删除并重建问题Pod(会触发调度到其他节点)
- 临时修改readinessProbe检查间隔:
yaml复制readinessProbe:
initialDelaySeconds: 30
periodSeconds: 20
6.2 根本解决方案
根据排查结果采取对应措施:
- 修正BGP对等配置
- 调整IP池CIDR范围
- 更新内核或加载缺失模块
- 解决资源竞争问题
6.3 验证网络恢复
确认Calico-Node状态:
bash复制kubectl get pod -n kube-system -l k8s-app=calico-node
测试跨节点Pod通信:
bash复制kubectl run test-nginx --image=nginx
kubectl run test-client --image=busybox --command -- sleep 3600
kubectl exec test-client -- ping <test-nginx_ip>
7. 预防措施与最佳实践
-
部署前检查清单:
- 确认节点满足内核要求
- 预加载必需内核模块
- 规划不重叠的IP池CIDR
-
监控配置:
yaml复制livenessProbe: exec: command: - /bin/calico-node - -felix-live - -bird-live initialDelaySeconds: 10 periodSeconds: 30 -
资源预留:
yaml复制resources: requests: cpu: 250m memory: 256Mi -
定期维护:
- 监控BGP会话状态
- 定期检查IP池利用率
- 升级Calico版本时先在小范围验证
在实际运维中,我发现Calico网络问题90%集中在BGP配置和IP池规划上。特别是在混合云环境中,不同网络环境的MTU设置差异经常导致隐蔽的传输问题。建议在部署前用calicoctl node status命令预先验证节点间连通性,这能提前发现大部分网络配置问题。
