6

K8s | 容器网络基础

 2 years ago
source link: https://jiac3366.github.io/2021/11/17/Kubernetes/%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C%E5%9F%BA%E7%A1%80/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

+c编程手记

Guangzhou, China
  • 32丨浅谈容器网络

    • 每个容器(把每一个容器看做一台主机)都有“网络栈”,就包括了:网卡(Network Interface)、回环设备(LoopbackDevice)、路由表(Routing Table)和 iptables 规则。

    • 如何把这些容器“连接”到 docker0 网桥上?——叫Veth Pair的虚拟设备

      • 特点:被创建出来后,总是以两张虚拟网卡(Veth Peer)的形式成对出现的,从其中一个“网卡”发出的数据包,可以直接出现在与它对应的另一张“网卡”上,被用作连接不同 Network Namespace 的“网线”

      • 其2端可以分别在容器和宿主机输入ifconfig查看,宿主机的网卡名字叫作 veth9c02e56,容器网卡名字叫eth0。并且,通过 brctl show 的输出,你可以看到这张网卡被“插”在了 docker0 上

    • 容器A ping 容器B是通的,原理:

      把docker0看成交换机,容器的网卡就是docker0交换机的端口,被限制在 NetworkNamespace 里的容器进程,实际上是通过 Veth Pair 设备 + 宿主机网桥的方式,实现了跟同其他容器的数据交换.

      • 首先要查询容器A的路由表查询到容器B的IP的网段要转发的gateway(0.0.0.0),0.0.0.0意味着这是一条直连规则,凡是匹配到这条规则的 IP包,应该经过本机的 eth0 网卡,通过二层网络直接发往目的主机,前提是需要MAC地址

      • 容器A通过 eth0 网卡发送ARP广播查找容器B的MAC,docker0负责转发到其他插在它上面的虚拟网卡
        eth0 网卡,是一个 Veth Pair,它的一端在容器的Network Namespace 里,而另一端则位于宿主机上(Host Namespace),并且被“插”在了宿主机的 docker0 网桥上,从而eth0可以认为是docker0网桥的一个端口

      • 容器B因为网卡也插在docker0,回复ARP请求,容器A有了目的 MAC 地址,其 eth0 网卡就可以将数据包发出去

      • docker0处理转发,查询CAM 表(MAC地址表),转发到容器B的端口

      • 可以打开iptables的TRACE 验证上述流程img
        iptables - Wikipedia

    • 心得:当你遇到容器连不通“外网”的时候,应该先试试 docker0 网桥能不能ping 通,然后查看一下跟 docker0 和 Veth Pair 设备相关的 iptables 规则(容器里面也有路由表哦,用route命令查看)是不是有异常,往往就能够找到问题的答案了

    • 容器的“跨主通信”

      • 这个粉红色的Overlay Network有点像接在交换机上的路由器?
    • 课后:如果要在生产环境中使用容器的 HostNetwork 模式,需要做哪些额外的准备工作呢?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK