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