命名空间内排查
网络命名空间是一套独立的网络栈视图:接口、地址、路由表、连接跟踪表与监听端口都各自一份。容器正是靠它做隔离。这意味着在宿主机上看到的结果与容器内部可能完全不同,网络问题必须先在目标命名空间内确认事实,再与宿主对照,否则容易得出相反结论。
基本信息
| 适用平台 | Linux(容器与手工创建的命名空间) |
|---|---|
| 常用命令 | 列出、切换到指定命名空间执行命令 |
| 权限要求 | root 或具备相应能力 |
| 排查顺序 | 先确认在哪个命名空间,再看监听与路由 |
| 对照对象 | 宿主侧接口与容器侧接口的配对关系 |
典型使用场景
- 容器内服务访问不通,先确认服务在容器内是否真的在监听。
- 宿主端口映射看起来正常,容器内监听地址却只绑了回环。
- 对比两侧接口统计,判断丢包发生在容器内部还是宿主侧。
- 排查连接跟踪表在哪个命名空间被占满。
- 手工搭建隔离环境验证路由与转发规则。
进入与对比
进入与对比
ip netns list # 列出已创建的命名空间
ip netns exec ns1 ip addr show # 在指定命名空间内看地址
ip netns exec ns1 ip route show # 看命名空间内的路由表
nsenter -t $(pidof nginx) -n ss -lntp | head # 进入某进程所在的网络命名空间查看监听
nsenter -t $(pidof nginx) -n ip -br addr # 对照该命名空间内的接口与地址
ip -s link show veth1234 # 宿主侧接口统计,与容器内一侧对照两侧对比检查项
| 检查项 | 宿主视角 | 命名空间视角 |
|---|---|---|
| 监听端口 | 看到的是宿主进程 | 容器内服务才可见 |
| 接口地址 | veth 宿主端地址 | 容器侧地址与回环 |
| 路由 | 宿主主路由表 | 容器内独立路由与默认网关 |
| 连接跟踪 | 宿主表容量 | 容器内独立表 |
进入命名空间前先确认进程与容器的对应关系:命名空间编号与容器名不是一回事,进错地方得到的结论会误导整个排查方向。
在宿主命名空间里查容器监听是常见误区:宿主上「没有监听」不代表容器内没起服务,反之也一样,先确认视角再下结论。