sudo ip netns list sudo lsns -t net sudo nsenter -t <pid> -n ss -lntp ss -lntp | head -20
启动服务报 bind address already in use,lsof 和 ss 在主机上都查不到占用者,换个端口能起,过一会儿老端口又会冲突,看着有点邪门。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:端口其实被另一个 network namespace 里的进程占着,主机默认命名空间看不到,容器退出后 netns 或者 veth 残留也会继续持有端口,用常规命令查不出来。
「network namespace 端口」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:列出所有网络命名空间以及各自对应的进程 先看数量对不对;进入可疑的 netns 再用 ss 带 p 参数定位 pid 主机上根本看不到 容器的 netns 用 nsenter 进;清理残留的 netns 或者直接重启对应容器 顺手把 ipvlan 也清掉。
确认没问题再收工,目标端口在所有 netns 里都没有监听 服务能正常绑定 重启后也不冲突。
