Cilium网络故障排查:常见问题与解决方案大全
概述
Cilium作为云原生网络和安全解决方案,在生产环境中可能会遇到各种网络连接问题。本文提供全面的故障排查指南,涵盖从基础状态检查到高级网络策略问题的解决方案。
1. 基础状态检查
1.1 集群健康状态检查
首先检查Cilium组件运行状态:
# 检查所有Cilium Pod状态
kubectl -n kube-system get pods -l k8s-app=cilium
# 使用Cilium CLI获取详细状态
cilium status
预期输出应显示所有组件状态为"OK":
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble: OK
\__/¯¯\__/ ClusterMesh: disabled
\__/
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
Cluster Pods: 5/5 managed by Cilium
1.2 详细状态信息
获取更详细的状态信息:
# 在特定Cilium Pod中执行状态检查
kubectl -n kube-system exec cilium-2hq5z -- cilium-dbg status
# 详细模式显示
kubectl -n kube-system exec cilium-2hq5z -- cilium-dbg status --verbose
状态检查的关键组件:
| 组件 | 状态 | 说明 |
|---|---|---|
| KVStore | Ok | etcd连接状态 |
| Kubernetes | Ok | Kubernetes API连接 |
| Cilium | Ok | Cilium代理状态 |
| Hubble | Ok | 可观测性功能 |
| Cluster health | 4/4 reachable | 集群节点连通性 |
2. 连通性测试
2.1 运行标准连通性测试
Cilium提供了完整的连通性测试套件:
# 创建测试命名空间
kubectl create ns cilium-test
# 部署连通性检查
kubectl apply --namespace=cilium-test -f \
https://raw.githubusercontent.com/cilium/cilium/main/examples/kubernetes/connectivity-check/connectivity-check.yaml
测试覆盖的功能范围:
| 测试类型 | 验证功能 |
|---|---|
| Pod-to-pod (intra-host) | eBPF路由功能 |
| Pod-to-pod (inter-host) | 数据平面、路由、网络 |
| Pod-to-service (intra-host) | eBPF服务映射查找 |
| Pod-to-service (inter-host) | VXLAN overlay端口 |
| Pod-to-external resource | 出口策略、伪装 |
2.2 检查测试结果
# 查看测试Pod状态
kubectl get pods -n cilium-test
# 检查失败Pod的详细信息
kubectl describe pod pod-to-b-intra-node-hostport -n cilium-test
常见错误信息分析:
# 连接被拒绝错误
Warning Unhealthy 6s (x6 over 56s) kubelet Readiness probe failed:
curl: (7) Failed to connect to echo-b-host-headless port 40000: Connection refused
3. 集群连通性健康检查
3.1 使用cilium-health工具
# 检查集群连通性健康状态
kubectl -n kube-system exec -ti cilium-2hq5z -- cilium-health status --verbose
输出示例:
Probe time: 2024-01-15T09:51:58Z
Nodes:
node-1 (localhost):
Host connectivity to 172.0.52.116:
ICMP to stack: OK, RTT=315.254µs
HTTP to agent: OK, RTT=368.579µs
Endpoint connectivity to 10.2.0.183:
ICMP to stack: OK, RTT=190.658µs
HTTP to agent: OK, RTT=536.665µs
3.2 健康检查指标解读
| 检查项目 | 正常值 | 异常处理 |
|---|---|---|
| ICMP到栈 | OK | 检查网络配置 |
| HTTP到代理 | OK | 检查Cilium代理 |
| RTT值 | < 5ms | 高延迟需排查网络 |
4. 数据平面监控与排错
4.1 使用监控工具
# 监控数据包丢弃情况
kubectl -n kube-system exec -ti cilium-2hq5z -- cilium-dbg monitor --type drop
常见丢弃原因及解决方案:
# 策略拒绝丢弃
xx drop (Policy denied) to endpoint 25729, identity 261->264:
10.11.13.37 -> 10.11.101.61 EchoRequest
# 无效MAC地址丢弃
xx drop (Invalid destination mac) to endpoint 0, identity 0->0:
fe80::5c25:ddff:fe8e:78d8 -> ff02::2 RouterSolicitation
4.2 连接跟踪表问题处理
当出现drop (CT: Map insertion failed)错误时:
# 调整垃圾回收间隔
--conntrack-gc-interval=30s
# 增加连接跟踪表大小
--bpf-ct-global-any-max=1000000
--bpf-ct-global-tcp-max=1000000
监控相关指标:
# 跟踪连接跟踪垃圾回收
datapath_conntrack_gc_runs_total
datapath_conntrack_gc_entries
5. Hubble可观测性排错
5.1 检查Hubble状态
# 检查Hubble服务状态
kubectl -n kube-system exec cilium-2hq5z -- hubble status
# 检查Hubble在Cilium状态中的显示
cilium-dbg status | grep Hubble
5.2 使用Hubble观察流量
# 观察特定Pod的流量
kubectl exec -n kube-system cilium-77lk6 -- \
hubble observe --since 3m --pod default/tiefighter
# JSON格式输出详细信息
kubectl exec -n kube-system cilium-77lk6 -- \
hubble observe --since 3m --pod default/tiefighter -o json
5.3 Hubble Relay排查
# 检查Hubble Relay状态
hubble status -P
# 查看连接的节点
hubble list nodes -P
6. 网络策略问题排查
6.1 确认Pod由Cilium管理
# 检查未受Cilium管理的Pod
curl -sLO https://raw.githubusercontent.com/cilium/cilium/main/contrib/k8s/k8s-unmanaged.sh
chmod +x k8s-unmanaged.sh
./k8s-unmanaged.sh
导致Pod未被管理的常见原因:
- Pod使用主机网络(
hostNetwork: true) - Pod在Cilium部署前已存在
- 网络命名空间配置问题
6.2 策略渲染理解
# 列出所有端点
kubectl -n kube-system exec -ti cilium-q8wvt -- cilium-dbg endpoint list
# 获取特定端点的详细信息
kubectl -n kube-system exec -ti cilium-q8wvt -- cilium-dbg endpoint get 59084
策略分析要点:
6.3 策略映射压力处理
# 检查策略选择器压力
cilium policy selectors
# 识别高压力选择器类型
选择器类型及影响:
| 选择器类型 | 表现形式 | 影响 |
|---|---|---|
| CIDR | &LabelSelector{MatchLabels:map[string]string{cidr.1.1.1.1/32: ,} | 中等 |
| FQDN | MatchName: , MatchPattern: * | 高 |
| Label | &LabelSelector{MatchLabels:map[string]string{any.name: curl,...} | 低 |
7. 服务网格问题排查
7.1 Ingress控制器排查
# 检查Ingress相关资源
kubectl get ingress
kubectl get service cilium-ingress-basic-ingress
kubectl get cec cilium-ingress-default-basic-ingress
# 验证配置标志
kubectl -n kube-system get cm cilium-config -o json | \
egrep "enable-ingress-controller|enable-envoy-config"
7.2 服务网格连通性
# 启用调试模式
kubectl -n kube-system get cm cilium-config -o json | \
jq '.data | fromjson | .debug = "true" | .["debug-verbose"] = "flow"'
# 观察Envoy代理流量
kubectl logs -f -n kube-system ds/cilium --timestamps | \
egrep "envoy|proxy"
8. 常见问题解决方案汇总
8.1 连接问题排查表
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| Pod间无法通信 | 网络策略拒绝 | 检查CiliumNetworkPolicy |
| 服务无法访问 | 服务发现问题 | 验证kube-proxy替换 |
| 外部连接失败 | 出口策略限制 | 检查Egress策略 |
| 高延迟 | 网络路径问题 | 使用cilium-health检查 |
8.2 性能问题处理
# 监控BPF映射压力
cilium_bpf_map_pressure{map_name="cilium_policy_v2_*"}
# 调整性能参数
--bpf-map-dynamic-size-ratio=0.0025
--bpf-policy-map-max=16384
8.3 日志分析技巧
# 获取Cilium日志
kubectl -n kube-system logs --timestamps cilium-1234
# 获取之前重启的日志
kubectl -n kube-system logs --timestamps -p cilium-1234
# 关键日志信息筛选
kubectl -n kube-system logs cilium-1234 | \
grep -E "(error|drop|denied|failed)"
9. 高级排查工具
9.1 使用Cilium调试工具
# 端点调试
cilium-dbg endpoint list
cilium-dbg endpoint get <id>
# 身份调试
cilium-dbg identity list
# 策略调试
cilium-dbg policy get
9.2 性能分析
# BPF程序分析
cilium-dbg bpf prog list
# 映射统计
cilium-dbg bpf map list
# 性能剖析
cilium-dbg pprof
10. 预防性维护建议
10.1 监控指标配置
关键监控指标:
# Prometheus监控配置
- alert: CiliumAgentDown
expr: up{job="cilium"} == 0
for: 5m
- alert: CiliumErrorsHigh
expr: rate(cilium_agent_api_process_time_seconds_count{status="500"}[5m]) > 10
10.2 定期健康检查
建议定期执行的检查脚本:
#!/bin/bash
# Cilium健康检查脚本
echo "=== Cilium Cluster Health Check ==="
date
echo
# 基础状态检查
echo "1. Pod Status:"
kubectl -n kube-system get pods -l k8s-app=cilium
echo
echo "2. Cilium Status:"
cilium status 2>/dev/null || echo "Cilium CLI not available"
echo
echo "3. Connectivity Test:"
kubectl get pods -n cilium-test 2>/dev/null || \
echo "Connectivity test namespace not found"
echo
echo "=== Check Complete ==="
总结
Cilium网络故障排查需要系统性的方法和工具链。通过本文提供的全面指南,您可以快速定位和解决大多数常见的网络连接问题。记住排查的基本原则:从基础状态检查开始,逐步深入到数据平面和策略层面,充分利用Cilium提供的丰富监控和调试工具。
关键排查流程总结:
- ✅ 验证基础组件状态
- ✅ 运行连通性测试
- ✅ 检查集群健康状态
- ✅ 监控数据平面丢弃
- ✅ 分析网络策略配置
- ✅ 使用Hubble观察流量
- ✅ 审查日志和指标
通过遵循这个系统化的排查流程,您将能够高效地解决Cilium网络环境中的各种连接问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



