序言
了解容器网络的同学都知道容器之间是通过VEth设备来进行容器间的网络通信的, 即通过将VEth设备的一端接在宿主机上, 另一端接在容器里面来实现宿主机network namespace和容器network namespace的连接, 在这里VEth设备充当了连接两个network namespace的一根虚拟网线的作用.
处在宿主机上的这一端的“网线接口”体现为一个宿主机上的网络接口, 直接在宿主机上通过ip a
即可以看到, 一般形式为vethXXX (我们也可以通过ip -d link show <interface name>
的命令来查看设备的类型), 但是当我们看到一串串以veth开头加上一串随机字符串的接口时是不是一下子就蒙了? 到底这些接口跟另一端在容器里面的接口是如何对应的? 这跟虚拟网线的另一端到底连接的是哪个容器?
下面就来分享两种方法我总结的方法, 第一种也是官方推荐的做法, 第二种是自己突然灵感乍现想到的?, 所以赶紧记录下来, 不知道有没有跟我有同感的同学哈 : )
实验环境
两个运行在同一个节点上的Pod容器, 也可以自己通过docker run
随意创建两个容器, 这里就不纠结了.
[root@10-10-40-84 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 0 47m 10.222.1.3 10-10-40-93 <none> <none>
busybox2 1/1 Running 0 45m 10.222.1.4 10-10-40-93 <none> <none>
[root@10-10-40-84 ~]#
复制代码
docker ps
的输出
[root@10-10-40-93 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
70eebe80845b af2f74c517aa "sleep 3600" 31 minutes ago Up 31 minutes k8s_busybox_busybox2_default_247b9265-59f5-11e9-9c05-faf63cb42000_1
2060ba52f6ed af2f74c517aa "sleep 3600" 34 minutes ago Up 34 minutes k8s_busybox_busybox_default_c7bf5185-59f4-11e9-9c05-faf63cb42000_1
bcb7f08f8707 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_busybox2_default_247b9265-59f5-11e9-9c05-faf63cb42000_0
9a23d437bf97 registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_busybox_default_c7bf5185-59f4-11e9-9c05-faf63cb42000_0
[root@10-10-40-93 ~]#
复制代码
先来看下两个容器所在的宿主机上ip a
输出的情况
[root@10-10-40-93 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
v