IPIP Mesh全网互联
文字描述
APOD eth0 10.7.75.132 -----> APOD 网关 -----> A宿主机 cali76174826315网卡 -----> Atunl0 10.7.75.128 封装 ----> Aeth0 10.120.181.20 -----> 通过网关 10.120.181.254 -----> 下一跳 BNODE eth0 10.120.179.8 解封装 -----> Btunl0 10.5.34.192 -----> 路由 B宿主机 calie83684f4735 -----> BPOD eth0 10.5.34.192
APOD 10.7.75.132 ----> BPOD 10.5.34.192 |
ANODE 10.120.181.20 ----> BNODE 10.120.179.8 |
BGP TOR
APOD eth0 10.121.74.181 -----> APOD 网关 ARP -----> A宿主机 cali3e7996a24a7网卡 ----> 默认路由0.0.0.0 ----> Aeth0 10.120.129.9 -----> A Node 网关 10.120.129.254 -----> B Node 网关 10.120.128.254 -----> 达到 BNODE eth0 10.120.128.7 -----> 通过路由表 ip为 10.121.46.65 到达 B宿主机 cali558def1712b网卡 通过iptables 转发 -----> BPOD eth0 10.121.46.65
APOD 10.121.74.181 ----> BPOD 10.121.46.65 |
ANODE 10.120.129.9 ----> BNODE 10.120.128.7 |
Pod内网络数据包如何到达宿主机
Calico所有的veth-pair在主机空间的calixxx的MAC地址,无一例外都是ee:ee:ee:ee:ee:ee, 这样的配置简化了操作,使得容器会把报文交给169.254.1.1来处理,但是这个地址是本地保留的地址也可以说是个无效地址,但是通过veth-pair会传递到对端calixxx上,注意,因为calixxx网卡开启了proxy_arp,所以它会代答所有的ARP请求,让容器的报文都发到calixxx上.
这里注意,calico要响应arp请求还需要具备三个条件,否则容器内的ARP显示异常:
- 宿主机的arp代理得打开
- 宿主机需要有访问目的地址的明确路由,这里我理解为宿主机要有默认路由
- 发送arp request的接口与接收arp request的接口不能是相同,即容器中的默认网关不能是calico的虚拟网关
Calico利用了网卡的proxy_arp功能,具体的,是将/proc/sys/net/ipv4/conf/DEV/proxy_arp置为1,当设置这个标志之后,DEV设备就会看起来像一个网关,会响应所有的ARP请求,并将自己的MAC地址告诉客户端。
也就是说,当容器发送ARP请求时,主机DEV设备会告诉容器,我拥有169.254.1.1这个IP,我的MAC地址是XXX,这样,容器就可以顺利的将数据包发出来了,于是网络就通了。
在主机上通过开启代理 ARP 功能来实现 ARP 应答,使得 ARP 广播被抑制在主机上,抑制了广播风暴,也不会有 ARP 表膨胀的问题。