问题描述
容器内没有 ip、tcpdump 等命令,也无法安装。
问题原因
通常容器为了轻量级,大多都是不包含较为基础网络管理调试工具,比如:ip、ping、telnet、ss、tcpdump 等命令,给调试容器内网络带来相当大的困扰。此时可以通过nsenter命令进入到目标程序所在 Namespace 中运行命令。
解决方案
- 安装
# centos
$ yum install util-linux
# ubuntu
$ apt install util-linux
- nsenter用法
$ nsenter [options] [program [arguments]]
options:
-a, --all enter all namespaces of the target process by the default /proc/[pid]/ns/* namespace paths.
-m, --mount[=<file>]:进入 mount 命令空间。如果指定了 file,则进入 file 的命名空间
-u, --uts[=<file>]:进入 UTS 命名空间。如果指定了 file,则进入 file 的命名空间
-i, --ipc[=<file>]:进入 System V IPC 命名空间。如果指定了 file,则进入 file 的命名空间
-n, --net[=<file>]:进入 net 命名空间。如果指定了 file,则进入 file 的命名空间
-p, --pid[=<file>:进入 pid 命名空间。如果指定了 file,则进入 file 的命名空间
-U, --user[=<file>:进入 user 命名空间。如果指定了 file,则进入 file 的命名空间
-t, --target <pid> # 指定被进入命名空间的目标进程的 pid
-G, --setgid gid:设置运行程序的 GID
-S, --setuid uid:设置运行程序的 UID
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录
- nsenter使用示例
进入 containerd 容器的 namespace 中运行指定程序。
# 获取containerd容器相应PID
$ crictl ps | grep coredns
3d5b3c61f55dd a4ca41631cc7a 4 hours ago Running coredns 0 08de19dee62e3
$ crictl inspect 3d5b3c61f55dd|grep -2 network
},
{
"type": "network",
"path": "/proc/3913940/ns/net"
}
# 使用相应参数进入程序所在的network命名空间并执行ip a
$ nsenter -n -t 3913940 ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether ea:5c:d9:76:fa:33 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.233.31.164/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::e85c:d9ff:fe76:fa33/64 scope link
valid_lft forever preferred_lft forever
参考链接
http://manpages.ubuntu.com/manpages/xenial/man1/nsenter.1.html