Kubernetes是否使用netns?v1.8集群主机为何无法列出相关netns?
嘿,这个问题我太熟了!你用Weave Net的时候,直接跑ip netns list看不到Pod的网络命名空间完全是正常情况,因为Weave的网络实现逻辑和你默认认知的不太一样。
Kubernetes确实靠NetNS实现Pod网络隔离,但Weave Net并没有使用Linux内核ip netns工具默认依赖的/var/run/netns/目录来管理Pod的网络命名空间。它是直接挂载容器的NetNS到自身组件中进行管理,不会在主机的netns目录下创建对应的链接文件,所以ip netns list自然扫不到这些命名空间。
给你几个实用的验证方法:
通过Docker定位Pod的NetNS路径
先找到Pod对应的容器ID:# 先在集群内找到Pod所在节点 kubectl get pods -o wide # 登录到对应节点后,筛选目标Pod的容器 docker ps | grep <你的Pod名称>拿到容器ID后,执行
docker inspect查看NetNS路径:docker inspect <容器ID> | grep -i netns你会看到类似
"NetNS": "/var/run/docker/netns/abc123xyz"的输出,这就是该Pod的网络命名空间实际所在位置。用Weave自带工具查看网络状态
在节点上直接执行Weave的状态命令,就能看到所有由它管理的Pod网络信息:weave status输出里会包含Pod的IP、网络关联状态等细节,能直接证明NetNS是存在且正常工作的。
手动关联后用
ip netns查看
如果你确实想用ip netns命令操作这个命名空间,可以手动创建软链接:# 把下面的路径替换成你从docker inspect拿到的NetNS路径 ln -s /var/run/docker/netns/abc123xyz /var/run/netns/my-pod-netns # 现在再执行就能看到了 ip netns list # 操作完记得清理链接 rm /var/run/netns/my-pod-netns
不同CNI插件的NetNS实现差异很大,Weave Net走的是自己独立的网络栈(包括自定义虚拟网桥、封装协议等),所以不依赖主机默认的NetNS管理机制。你用的是Kubernetes v1.8,这个版本的Weave还保持着这种实现逻辑,所以才会出现你看到的现象。
内容的提问来源于stack exchange,提问作者Silk0vsky

