nsenter
nsenter是用来进入容器内部的一个命令,它的优势之处在于可以自己选择加载容器的那些namespaces,它位于util-linux包中。
nsenter [options] [program [arguments]]
options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录
如果没有给出program,则默认执行$SHELL
我们常常使用nsenter来排查kubernetes网络层面的问题。
# 查看该容器的pid
$ sudo docker ps |grep prometheus
b06f38e2cd1a ce7a0e6c5432 "/promethus-…" 19 minutes ago
$ sudo docker inspect b06f38e2cd1a |grep Pid
"Pid": 8441,
"PidMode": "",
"PidsLimit": 0,
$ sudo docker ps |grep net-test |grep pause |awk '{print $1}' |xargs -i sudo docker inspect -f {{.State.Pid}} {}
# 进入2747168的net空间,只执行ip link命令
$ sudo nsenter --target 2747168 --net ip link
# 进入2747168的net空间,执行shell
$ sudo nsenter -n -t 2747168