适用场景

eBPF 的价值在于「不用改业务代码就能看到内核态发生了什么」。排障时它能把「服务慢」拆成「内核协议栈慢、队列慢、还是对端慢」。但 eBPF 依赖内核版本和权限,落地前先确认内核版本与安全策略,别在生产上随便加载探针。

配置步骤(Cilium Hubble 观测 K8s 流量)

# 1) 安装(示例:helm)
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --namespace kube-system \
  --set hubble.relay.enabled=true --set hubble.ui.enabled=true

# 2) 命令行走访访问关系
hubble observe --namespace prod --last 50
hubble observe --namespace prod --to-service web --verdict DROPPED

# 3) 排障:谁在被拒
hubble observe --verdict DROPPED --namespace prod | head -20

# 4) 指标接入 Prometheus
kubectl port-forward -n kube-system svc/hubble-relay 4245:80

关键参数与建议

  • 内核版本:4.19 以上功能较完整,5.x 以上可用较新的 BTF 与 CO-RE 能力
  • 权限:加载探针需要 CAP_BPF/CAP_SYS_ADMIN,生产环境按需授权并记录
  • 观测点选择:TCP 重传、连接建立耗时、socket 队列、文件读写延迟最实用
  • 采样率:高流量场景必须采样或按条件过滤,否则开销明显
  • 数据落地:指标进 Prometheus,明细进日志或对象存储,避免内存爆
  • 安全边界:内核升级或容器运行时升级后要回归验证探针兼容性
  • 与现有工具配合:ebpf 看内核,应用 APM 看代码,两边对齐时间戳

容易踩的坑

  • 网络策略上线后没人看 dropped 流量,业务不通排查一小时
  • Hubble 数据不落盘,重启后历史全丢
  • relay 未做资源限制,节点内存被吃
  • 只看 allow 不看 verdict,忽略策略误伤
  • 用了 overlay 却没注意 MTU,出现碎片与重传
  • 观测面板开了但没接告警,出问题仍靠用户报障

验证与巡检

# 策略误伤定位
hubble observe --verdict DROPPED --namespace prod --last 200 | grep -c DROPPED
kubectl get networkpolicy -A

# MTU 与丢包
kubectl exec -n prod deploy/web -- ip link show eth0
kubectl exec -n prod deploy/web -- ping -M do -s 1400 -c 3 10.96.0.1
  • 巡检:dropped 流量有告警、策略变更留痕、MTU 一致、relay 资源水位正常

小结

eBPF 落地检验:能用一个命令说清某次慢请求的时间都花在哪一段(应用、内核队列、网络、对端),并且开销可控。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。