Cilium网络故障排查:常见问题与解决方案大全

Cilium网络故障排查:常见问题与解决方案大全

【免费下载链接】cilium Cilium 是一个开源的网络和存储编排工具,用于容器网络、负载均衡和网络安全。 * 用于容器网络、负载均衡和网络安全、支持多种编程语言和框架、容器网络。 * 有什么特点:支持多种编程语言和框架 【免费下载链接】cilium 项目地址: https://gitcode.com/GitHub_Trending/ci/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

状态检查的关键组件:

组件状态说明
KVStoreOketcd连接状态
KubernetesOkKubernetes API连接
CiliumOkCilium代理状态
HubbleOk可观测性功能
Cluster health4/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未被管理的常见原因:

  1. Pod使用主机网络(hostNetwork: true
  2. Pod在Cilium部署前已存在
  3. 网络命名空间配置问题

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

策略分析要点:

mermaid

6.3 策略映射压力处理

# 检查策略选择器压力
cilium policy selectors

# 识别高压力选择器类型

选择器类型及影响:

选择器类型表现形式影响
CIDR&LabelSelector{MatchLabels:map[string]string{cidr.1.1.1.1/32: ,}中等
FQDNMatchName: , 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提供的丰富监控和调试工具。

关键排查流程总结:

  1. ✅ 验证基础组件状态
  2. ✅ 运行连通性测试
  3. ✅ 检查集群健康状态
  4. ✅ 监控数据平面丢弃
  5. ✅ 分析网络策略配置
  6. ✅ 使用Hubble观察流量
  7. ✅ 审查日志和指标

通过遵循这个系统化的排查流程,您将能够高效地解决Cilium网络环境中的各种连接问题。

【免费下载链接】cilium Cilium 是一个开源的网络和存储编排工具,用于容器网络、负载均衡和网络安全。 * 用于容器网络、负载均衡和网络安全、支持多种编程语言和框架、容器网络。 * 有什么特点:支持多种编程语言和框架 【免费下载链接】cilium 项目地址: https://gitcode.com/GitHub_Trending/ci/cilium

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值