背景
近期在一套 Kubernetes 集群中,发现一个非常反常的现象:
- 在节点上执行
netstat / ss 命令异常缓慢,甚至需要几分钟才能返回结果 - 节点本身负载并不高,CPU、内存看起来都比较正常
由于 netstat/ss 本质上只是读取内核和 /proc 信息,这种“卡死级别”的慢速,往往意味着 系统层面存在异常规模的数据结构。
这篇文章记录了从一个看似普通的 netstat 慢问题,一步步定位到 Calico socket FD 泄漏 Bug,并最终通过升级版本彻底解决的完整过程。
从 netstat/ss 变慢开始
最初的直接表现是:
time netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:10010 0.0.0.0:* LISTEN 1530975/cri-dockerd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1165/sshd: /usr/sbi
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 164980/nginx: worke
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 127.0.0.1:9099 0.0.0.0:* LISTEN 1171111/calico-node
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 2503623/rpc.mountd
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:10256 0.0.0.0:* LISTEN 623016/kube-proxy
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 1531381/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 623016/kube-proxy
tcp 0 0 0.0.0.0:57325 0.0.0.0:* LISTEN 2500368/rpc.statd
tcp 0 0 0.0.0.0:46433 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN 1165/sshd: /usr/sbi
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::20048 :::* LISTEN 2503623/rpc.mountd
tcp6 0 0 :::2049 :::* LISTEN -
tcp6 0 0 :::2380 :::* LISTEN 619966/etcd
tcp6 0 0 :::2379 :::* LISTEN 619966/etcd
tcp6 0 0 :::40007 :::* LISTEN -
tcp6 0 0 :::6443 :::* LISTEN 621032/kube-apiserv
tcp6 0 0 :::9369 :::* LISTEN 2484838/pushprox-cl
tcp6 0 0 :::9796 :::* LISTEN 2485357/node_export
tcp6 0 0 :::10250 :::* LISTEN 1531381/kubelet
tcp6 0 0 :::10259 :::* LISTEN 621666/kube-schedul
tcp6 0 0 :::10257 :::* LISTEN 621333/kube-control
tcp6 0 0 :::48607 :::* LISTEN 2500368/rpc.statd
real 3m21.534s
user 3m9.634s
sys 0m11.357s
可见执行非常慢。
- 阅读剩余部分 -