k8s 进入pod network namespace

6种namespace

Namespace弊端

最主要的问题就是隔离得不彻底。
首先,多个容器之间共享内核。
其次,有很多资源是不能被Namespace化的,例如时间。

Network Namespace

进入Docker的network namespace

docker把所有容器的Network Namespace放在/run/docker/netns目录下。

docker run --rm --name nginx-test -itd nginx sh

进入这些Network Namespace有2种方法:

方法一:nsenter

nsenter --net=或者nsenter -t -n

通过ns文件来进入:nsenter --net=/run/docker/netns/<uuid>(不是容器id) sh

通过进程号来进入ns(mount namespace是宿主机,pid也是):nsenter -t 2371 -n ip a

通过nsenter -t xxx -n进入进程的网络命名空间

方法二:ip netns

创建软链接或者绑定挂载

在宿主机上的/run/netns目录下创建软链接到/run/docker/netns目录下的netns文件

ln -s /run/docker/netns/337ccba74455 /run/netns/ns1
ip netns exec ns1 ip a

软链接在容器退出后残留,不会自动删除,无法通过软链接再次进入ns。

绑定挂载/run/docker/netns/xxx,删除容器后/run/netns文件也会残留。

依然可以进入test1这个ns且无法删除

解绑后可以删除。

绑定挂载/proc/进程号/ns/net,删除容器后/run/netns文件也会残留,且无法删除,必须先解绑。

容器内访问network namespace

挂载/proc目录或者/run/docker/netns目录,mount --bind和软链接都可以。

宿主机上/proc只读挂载到容器内/myproc下面。

docker run -u root --privileged=true -v /proc:/myproc:ro -itd centos bash
mkdir -p /run/netns
ln -s /myproc/4427/ns/net /run/netns/test

之后可以访问该net ns

posted on 2024-10-27 20:44  王景迁  阅读(11)  评论(0编辑  收藏  举报

导航