我们在pod的好处和坏处_量子学习法的博客-CSDN博客中初略讲过一个Pod内容器都是通过infra容器进行与外界通信的。那么具体如何通信呢?本篇文章将介绍一个节点内不同namespace容器通信。
就像多台主机之间通信需要网线将他们连在一台交换机上一样,为了实现宿主机上容器间的通信,宿主机上会建一个叫docker0的网桥。凡事连接在docker0网桥上的主机都可以通信。
那么我们需要如何将容器连接上呢?我们先上图。
我们需要Veth Pair的虚拟设备。Veth Pair通常是成对出现的,例如上图eth0 和veth9c02e56。所以Veth Pair就是连接不同network Namespace的网线。
这时候我们在 nginx-1 容器里 ping 一下 nginx-2 容器的 IP 地址(172.17.0.3),就 会发现同一宿主机上的两个容器默认就是相互连通的。
具体原理,我们来解释一下:
1,nginx-1访问nginx-2 容器的 IP 地址匹配到的是直连规则,则通过eth0进行ARP广播。
2,此时docker0 网桥就会扮演二层交换机的角色,将ARP转发到其他插到docker0端口上的网卡上。
3,同样连接在 docker0 上的 nginx-2 容器的网络协议栈就会收到这个 ARP 请求,从而将 172.17.0.3 所对应的 MAC 地 址回复给 nginx-1 容器。
4,有了这个目的 MAC 地址,nginx-1 容器的 eth0 网卡就可以将数据包发出去。nginx-1 容器的 eth0 网卡将包发往docker0网桥上,docker0根据数据包的mac地址,在它的CAM表中查到对应的端口后把数据包发向这个端口。
需要注意的是,在实际的数据传递时,上述数据的传递过程在网络协议栈的不同层次,都有 Linux 内核 Netfilter 参与其中。
总结
在默认情况下,被限制在 Network Namespace 里的容器进程,实际上是通过 Veth Pair 设备 + 宿主机网桥的方式,实现了跟同其他容器的数据交换。而宿主机网桥实际上充当我们二层网络交换机的角色,根据MAC地址继续转发。
那么,不同节点间的容器如何通信呢?
我们可以看看下一篇文章深入理解容器跨主机通信_量子学习法的博客-CSDN博客