网络通信机制

k8s中的网络主要涉及到pod的的各种访问需求,如同一pod的内部(单容器或者多容器)通信、pod A与pod B的通
信、从外部网络访问pod以及从pod访问外部网络。
k8s的网络基于第三方插件实现,该规范有CoreOS和Google联合定制,叫做CNI(Container Network Interface)。
目前常用的的CNI网络插件有calico和flannel:

* 一.calico简介:

calico是一个纯三层的网络解决方案,为容器提供多node间的访问通信,calico将每一个node节点都当做为一个路
由器(router),各节点通过BGP(Border Gateway Protocol) 边界网关协议学习并在node节点生成路由规则,从而
将不同node节点上的pod连接起来进行通信。

BGP是一个去中心化的协议,它通过自动学习和维护路由表实现网络的可用性,但是并不是所有的网络都支持
BGP,另外为了跨网络实现更大规模的网络管理,calico 还支持IP-in-IP的叠加模型,简称IPIP,IPIP可以实现跨不
同网段建立路由通信,但是会存在安全性问题,其在内核内置,可以通过Calico的配置文件设置是否启用IPIP,在
公司内部如果k8s的node节点没有跨越网段建议关闭IPIP。

k8s calico_第1张图片


二.环境介绍
本文记录一下calica跨主机pod之间如何通信,192.168.7.110/111是两台k8s的node结点

  1. calico自动生成路由表,如图基于BGP协议,生成了很多静态路由,图中cali开头的就是本机的虚拟网卡,连接本机pod的网络,tunl0为跨主机通信用网卡,calicao默认生成的网络子网划分为掩码26,图1是192.168.7.110上的路由表
    k8s calico_第2张图片
    图1

  2. 跨主机pod通信,从node结点192.168.7.110,ping node结点192.168.7.111中的pod172.31.13.139
    k8s calico_第3张图片
    图2

k8s calico_第4张图片
图3

k8s calico_第5张图片
图4

  1. 从111上的pod172.31.13.139,traceroute110上的pod172.31.58.98
    去往139的报文会经过tunl0转发,但最终都要经过eth0发出去
    calico完全基于静态路由实现报文转发,性能很高,否则还得找交换机找路由
    从139过来的路由也会经由tunl0转发,tunl0是开了ip-ip才有的,可以关掉

k8s calico_第6张图片
图5

k8s calico_第7张图片
图6

关了ipip之后,就没有tunl0那个网卡了,去往172.31.58.64,直接通过eth0过去了
这里关闭ipip之后,重新生成的测试pod,所以每个ip都变化了

k8s calico_第8张图片
图7

测试:从110node上的pod172.31.58.64,测试路由到111node上的pod172.31.13.129,结果就是,直接从eth0跳到了111的eth0,再到pod