nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。
一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。
此外,nsenter也可以进入mnt, uts, ipc, pid, user命令空间,以及指定根目录和工作目录。
首先看下nsenter命令的语法:
1 | nsenter [options] [program [arguments]] |
示例:
运行一个nginx容器,查看该容器的pid:
1 | [root@staight ~]# docker inspect -f {{.State.Pid}} nginx |
然后,使用nsenter命令进入该容器的网络命令空间:
1 | [root@staight ~]# nsenter -n -t5645 |
进入成功~
在Kubernetes中,在得到容器pid之前还需获取容器的ID,可以使用如下命令获取:
1 | [root@node1 test]# kubectl get pod test -oyaml|grep containerID |
或者更为精确地获取containerID:
1 | [root@node1 test]# kubectl get pod test -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}' -n dev-houchu-0-6 |
示例:
我这里有个keycloak 的container 使用 release 8.3 (Ootpa) 基础镜像,为了简化,里面的ps,netstat,ip,curl ,vi 等命令都没有,此时我想进入docker 中查看,啥都干不了,
那现在nsenter可以帮到我们
1,使用
kubectl get pod -n dev-houchu-0-6 -o wide
获取镜像在那个节点上运行
2,获取该镜像的container Id
kubectl get pod/keycloak-0 -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}' -n dev-houchu-0-6
3,通过container ID 获取该容器的 pid
docker inspect -f {{.State.Pid}} container_id
4,通过pid ,使用nsenter 进入容器的对应的空间,比如网络空间,用户空间,pid空间等等
nsenter -t container_pid -p -n
其中 -t 指:-target pid:指定被进入命名空间的目标进程的pid
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
然后可以使用主机命令操作容器。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!