以下内容由deepseek生成
以下是针对 Calico 网络问题的系统性排错思路,涵盖 基础检查、通信路径分析、BGP 控制平面排查、网络策略验证 等关键环节,结合常见场景和工具命令:
一、基础环境检查
1. 节点与组件状态
# 查看所有节点状态(确保所有节点 Ready)
kubectl get nodes
# 检查 Calico 组件运行状态(DaemonSet 必须所有节点运行)
kubectl get pods -n kube-system -l k8s-app=calico-node
kubectl get pods -n kube-system -l k8s-app=calico-typha # 如果启用了 Typha
# 查看 Felix 日志(关注错误或警告)
kubectl logs -n kube-system <calico-node-pod-name> -c calico-node
2. IP 地址分配
# 检查 Pod 是否分配到 IP
kubectl get pods -o wide | grep <pod-name>
# 查看 Calico IP 池使用情况
calicoctl ipam show --show-blocks
# 验证 IP 池是否耗尽(常见于频繁创建/删除 Pod 的场景)
calicoctl get ippool -o yaml
二、Pod 间通信问题
1. 同节点 Pod 通信失败
-
检查点:
- Pod 的 veth pair 是否正常(宿主机端的
caliXXXX
接口是否存在)。 - 宿主机 iptables/nftables 规则是否被篡改。
- 宿主机内核是否开启路由转发(
net.ipv4.ip_forward=1
)。 - 是否启用了 NetworkPolicy 默认拒绝规则。
- Pod 的 veth pair 是否正常(宿主机端的
-
命令示例:
# 检查 veth 接口 ip link show | grep cali # 确认路由转发已开启 sysctl net.ipv4.ip_forward # 查看 caliXXXX 接口 ARP 表 arp -n -i caliXXXX
2. 跨节点 Pod 通信失败
-
检查点:
- 节点间网络连通性(检查节点 IP 是否能互通)。
- 节点路由表是否包含目标 Pod 子网的路由。
- BGP 邻居是否建立成功(关键!)。
- 是否启用 IPIP/VXLAN 但配置错误(如 MTU 不匹配)。
-
命令示例:
# 查看宿主机路由表(关键!) ip route show | grep bird # 测试节点间网络连通性(ICMP/TCP) ping <目标节点IP> nc -zv <目标节点IP> 179 # BGP 端口 # 检查 BGP 邻居状态(必须 Established) calicoctl node status
三、BGP 控制平面排查
1. BGP 邻居未建立
-
常见原因:
- 防火墙阻止 TCP 179 端口。
- 节点 IP 配置错误(BGP 对端地址不匹配)。
- BGP 配置错误(AS 号冲突或认证失败)。
-
排查步骤:
# 查看 BIRD 配置 kubectl exec -n kube-system <calico-node-pod> -- cat /etc/calico/confd/config/bird.cfg # 检查 BIRD 日志(位于容器内 /var/log/calico/bird.log) kubectl exec -n kube-system <calico-node-pod> -- tail -f /var/log/calico/bird.log # 手动验证 BGP 端口可访问性 telnet <目标节点IP> 179
2. 路由未正确广播
-
检查点:
- 节点是否广播了其 Pod CIDR。
- 路由反射器(Route Reflector)配置是否正确(大规模集群)。
- 是否启用了
nodeToNodeMesh
(全互联模式)但集群规模过大。
-
命令示例:
# 查看节点宣告的路由(需安装 bird 工具) birdc show route # 在宿主机上执行(如果安装了 BIRD CLI) # 查看 Calico 节点配置 calicoctl get node <node-name> -o yaml
四、网络策略(NetworkPolicy)问题
1. 策略未生效
-
检查点:
- 策略是否正确定义了
podSelector
和namespaceSelector
。 - 策略是否被其他策略覆盖(规则优先级)。
- Felix 是否成功将策略转换为 iptables/eBPF 规则。
- 策略是否正确定义了
-
排查步骤:
# 查看已生效的策略(确认策略已同步到节点) calicoctl get networkpolicy -o yaml --all-namespaces # 检查 iptables 规则(策略链通常以 cali- 开头) iptables-save | grep cali- # 检查 eBPF 模式策略(如果启用) calicoctl bpf policy dump <node-name> <interface> # 例如 eth0
2. 策略日志追踪
-
启用策略日志:
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: log-demo spec: ingress: - action: Log # 记录匹配的流量 source: {} - action: Allow source: selector: app=trusted selector: app=critical
五、高级工具与技巧
1. 数据包捕获
# 在源 Pod 所在节点捕获 eth0 流量
tcpdump -i eth0 host <目标PodIP> -w capture.pcap
# 在 Pod 的 veth 接口捕获(需找到对应的 caliXXXX)
tcpdump -i caliXXXX -nn -vv
2. eBPF 深度分析(若启用 eBPF 模式)
# 查看 eBPF 程序加载状态
bpftool prog show
# 追踪策略执行过程
calicoctl bpf conntrack dump <node-name>
3. WireGuard 加密问题(若启用)
# 检查 WireGuard 接口状态
wg show
# 验证隧道两端公钥是否匹配
calicoctl get felixconfiguration -o yaml | grep wireguard
六、常见故障场景与解决
1. 跨子网通信失败(IPIP/VXLAN 模式)
- 症状:跨子网 Pod 无法互通,但同子网正常。
- 检查点:
- 确认启用 IPIP 或 VXLAN(
calicoctl get ippool -o yaml
查看配置)。 - MTU 设置是否合理(通常 Pod MTU = 物理 MTU - 20/50)。
- 节点防火墙是否放行 IPIP(协议号 4)或 VXLAN(UDP 4789)。
- 确认启用 IPIP 或 VXLAN(
2. BGP 路由震荡(Flapping)
- 症状:路由表频繁变化,导致部分流量中断。
- 排查方向:
- 检查节点网络接口是否不稳定(丢包/延迟)。
- BGP Keepalive 时间配置是否过短(默认 30 秒)。
- 路由反射器(Route Reflector)负载过高。
3. Pod 启动失败(IPAM 问题)
- 症状:Pod 停滞在
ContainerCreating
,事件提示 IP 分配失败。 - 解决步骤:
- 检查 Calico IP 池是否已满:
calicoctl ipam show
。 - 清理泄漏的 IP 地址:
calicoctl ipam release --ip=<IP>
。 - 确认 IP 池 CIDR 与集群规划匹配。
- 检查 Calico IP 池是否已满:
七、总结:排错流程图
- 定位问题范围:同节点/跨节点?是否涉及策略?
- 验证基础环境:Pod IP 分配、节点状态、组件日志。
- 检查路由与 BGP:
ip route
、calicoctl node status
。 - 分析网络策略:iptables/eBPF 规则、策略匹配逻辑。
- 高级工具辅助:tcpdump、eBPF 工具链、WireGuard 诊断。
- 参考文档:Calico 官方排错指南。
通过以上步骤,可覆盖 90% 的 Calico 网络问题。对于复杂场景(如多云混合网络),需结合具体底层网络拓扑分析。