nsenter 容器空间排查利器

106 阅读1分钟

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