k8s或docker 使用 nsenter 进入镜像,然后使用主机命令查看container中的情况

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。 用途 一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的...

nsenter命令是一个可以在指定进程的命令空间下运行指定程序的命令。它位于util-linux包中。

用途

一个最典型的用途就是进入容器的网络命令空间。相当多的容器为了轻量级,是不包含较为基础的命令的,比如说ip address,ping,telnet,ss,tcpdump等等命令,这就给调试容器网络带来相当大的困扰:只能通过docker inspect ContainerID命令获取到容器IP,以及无法测试和其他网络的连通性。这时就可以使用nsenter命令仅进入该容器的网络命名空间,使用宿主机的命令调试容器网络。

此外,nsenter也可以进入mnt, uts, ipc, pid, user命令空间,以及指定根目录和工作目录。

使用

首先看下nsenter命令的语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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。

示例:

运行一个nginx容器,查看该容器的pid:

1
2
[root@staight ~]# docker inspect -f {{.State.Pid}} nginx
5645

然后,使用nsenter命令进入该容器的网络命令空间:

1
2
3
4
5
6
7
8
9
10
[root@staight ~]# nsenter -n -t5645
[root@staight ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

进入成功~

在Kubernetes中,在得到容器pid之前还需获取容器的ID,可以使用如下命令获取:

1
2
[root@node1 test]# kubectl get pod test -oyaml|grep containerID
- containerID: docker://cf0873782d587dbca6aa32f49605229da3748600a9926e85b36916141597ec85

或者更为精确地获取containerID:


1
2
[root@node1 test]# kubectl get pod test -o template --template='{{range .status.containerStatuses}}{{.containerID}}{{end}}' -n dev-houchu-0-6
docker://cf0873782d587dbca6aa32f49605229da3748600a9926e85b36916141597ec85

示例:

我这里有个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的命令空间

然后可以使用主机命令操作容器。

attachments-2021-06-iQJ6yxmC60bf1bb867f15,png

  • 发表于 2021-06-08 15:05
  • 阅读 ( 49 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章