kubernetes 查询容器的 network namespace
简介命名空间是容器使用的主要方面之一(请参见下图)。 它们提供了一种隔离形式,允许容器保持可移植性并与主机系统分离。尽管 Linux 内核提供了各种类型的名称空间,在本文中,我们将研究如何查看 Kubernetes 集群中容器的 network namespace,这对于故障排除和学习非常有用。普通方式查询一般情况下,可以通过 ip netnd list命令查看主机的 network namesp
简介
命名空间是容器使用的主要方面之一(请参见下图)。 它们提供了一种隔离形式,允许容器保持可移植性并与主机系统分离。
尽管 Linux 内核提供了各种类型的名称空间,在本文中,我们将研究如何查看 Kubernetes 集群中容器的 network namespace,这对于故障排除和学习非常有用。
普通方式查询
一般情况下,可以通过 ip netnd list 命令查看主机的 network namespace,但是,在 kubernetes 集群的主机上,不会返回 network namespace 信息。
对 docker 而言,默认情况下,docker 不会将容器 network namespace 添加到 linux 运行时数据中(从 /run 挂载到 /var/run)
那么,如何查询呢?答案是:nsenter
查询 network namespace
1. 首先,查看主机上运行的容器:
docker ps
2. 获取 container PID
执行如下命令获取容器的进程 ID
docker inspect --format '{{ .State.Pid }}' <CONTAINER_ID>
比如:
docker inspect --format '{{ .State.Pid }}' 5340e444a658
55455
3. 进入 network namespace
上述已经获取到 container PID,通过 nsenter 进入容器,并执行 ip addr。
nsenter -t <CONTAINER_PID> -n ip addr
sudo nsenter -t 55455 -n 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
3: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether 7a:d1:29:54:e9:91 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.2.150/28 brd 11.1.2.159 scope global eth0
valid_lft forever preferred_lft forever
4. 查看 veth pair
实际上,容器中的网卡 eth0@if19 与主机端的 veth 网卡是映射的
5. 获取主机 veth 网卡的信息
在主机端通过 ip link 命令获取
$ ip link | grep -A1 ^19
19: veth5742a500@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master cni0 state UP mode DEFAULT group default
link/ether 6a:94:b5:49:2d:e5 brd ff:ff:ff:ff:ff:ff link-netnsid 2
如此,可以看到网卡 veth5742a500@if3 与 network namespace 中的网卡 eth0@if19 是映射的,以保证通信
更多推荐
所有评论(0)