k8s网络主题系列:html
1、k8s网络之设计与实现node
Calico 是一种容器之间互通的网络方案。在虚拟化平台中,好比 OpenStack、Docker 等都须要实现 workloads 之间互连,但同时也须要对容器作隔离控制,就像在 Internet 中的服务仅开放80端口、公有云的多租户同样,提供隔离和管控机制。而在多数的虚拟化平台实现中,一般都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,好比须要依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求,随着网络规模的增大,总体会变得越加复杂。咱们尝试把 Host 看成 Internet 中的路由器,一样使用 BGP 同步路由,并使用 iptables 来作安全访问策略,最终设计出了 Calico 方案。网络
适用场景:k8s环境中的pod之间须要隔离架构
设计思想:Calico 不使用隧道或 NAT 来实现转发,而是巧妙的把全部二三层流量转换成三层流量,并经过 host 上路由配置完成跨 Host 转发。分布式
设计优点:工具
1.更优的资源利用性能
二层网络通信须要依赖广播消息机制,广播消息的开销与 host 的数量呈指数级增加,Calico 使用的三层路由方法,则彻底抑制了二层广播,减小了资源开销。测试
另外,二层网络使用 VLAN 隔离技术,天生有 4096 个规格限制,即使可使用 vxlan 解决,但 vxlan 又带来了隧道开销的新问题。而 Calico 不使用 vlan 或 vxlan 技术,使资源利用率更高。
2.可扩展性
Calico 使用与 Internet 相似的方案,Internet 的网络比任何数据中心都大,Calico 一样自然具备可扩展性。
3.简单而更容易 debug
由于没有隧道,意味着 workloads 之间路径更短更简单,配置更少,在 host 上更容易进行 debug 调试。
4.更少的依赖
Calico 仅依赖三层路由可达。
5.可适配性
Calico 较少的依赖性使它能适配全部 VM、Container、白盒或者混合环境场景。
架构图:
Calico网络模型主要工做组件:
1.Felix:运行在每一台 Host 的 agent 进程,主要负责网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等。
2.etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,能够与kubernetes共用;
3.BGP Client(BIRD):Calico 为每一台 Host 部署一个 BGP Client,使用 BIRD 实现,BIRD 是一个单独的持续发展的项目,实现了众多动态路由协议好比 BGP、OSPF、RIP 等。在 Calico 的角色是监听 Host 上由 Felix 注入的路由信息,而后经过 BGP 协议广播告诉剩余 Host 节点,从而实现网络互通。
4.BGP Route Reflector:在大型网络规模中,若是仅仅使用 BGP client 造成 mesh 全网互联的方案就会致使规模限制,由于全部节点之间俩俩互联,须要 N^2 个链接,为了解决这个规模问题,能够采用 BGP 的 Router Reflector 的方法,使全部 BGP Client 仅与特定 RR 节点互联并作路由同步,从而大大减小链接数。
Felix
Felix会监听ECTD中心的存储,从它获取事件,好比说用户在这台机器上加了一个IP,或者是建立了一个容器等。用户建立pod后,Felix负责将其网卡、IP、MAC都设置好,而后在内核的路由表里面写一条,注明这个IP应该到这张网卡。一样若是用户制定了隔离策略,Felix一样会将该策略建立到ACL中,以实现隔离。
BIRD
BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,而后经过标准BGP的路由协议扩散到整个其余的宿主机上,让外界都知道这个IP在这里,大家路由的时候获得这里来。
架构特色
因为Calico是一种纯三层的实现,所以能够避免与二层方案相关的数据包封装的操做,中间没有任何的NAT,没有任何的overlay,因此它的转发效率多是全部方案中最高的,由于它的包直接走原生TCP/IP的协议栈,它的隔离也由于这个栈而变得好作。由于TCP/IP的协议栈提供了一整套的防火墙的规则,因此它能够经过IPTABLES的规则达到比较复杂的隔离逻辑。
IPIP
从字面来理解,就是把一个IP数据包又套在一个IP包里,即把 IP 层封装到 IP 层的一个 tunnel。它的做用其实基本上就至关于一个基于IP层的网桥!通常来讲,普通的网桥是基于mac层的,根本不需 IP,而这个 ipip 则是经过两端的路由作一个 tunnel,把两个原本不通的网络经过点对点链接起来。
BGP
边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。它经过维护IP路由表或‘前缀’表来实现自治系统(AS)之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。所以,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP,BGP 机房的优势:服务器只须要设置一个IP地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其它技术指标来肯定的,不会占用服务器的任何系统。
一个msater节点,ip 172.171.5.95,一个node节点 ip 172.171.5.96
建立一个daemonset的应用,pod1落在master节点上 ip地址为192.168.236.3,pod2落在node节点上 ip地址为192.168.190.203
pod1 ping pod2
pod1上的路由信息
根据路由信息,ping 192.168.190.203,会匹配到第一条。第一条路由的意思是:去往任何网段的数据包都发往网管169.254.1.1,而后从eth0网卡发送出去。
路由表中Flags标志的含义:
U up表示当前为启动状态
H host表示该路由为一个主机,多为达到数据包的路由
G Gateway 表示该路由是一个网关,若是没有说明目的地是直连的
D Dynamicaly 表示该路由是重定向报文修改
M 表示该路由已被重定向报文修改
master节点上的路由信息
当ping包来到master节点上,会匹配到路由tunl0。该路由的意思是:去往192.169.190.192/26的网段的数据包都发往网关172.171.5.96。由于pod1在5.95,pod2在5.96。因此数据包就经过设备tunl0发往到node节点上。
node节点上路由信息
当node节点网卡收到数据包以后,发现发往的目的ip为192.168.190.203,因而匹配到红线的路由。该路由的意思是:192.168.190.203是本机直连设备,去往设备的数据包发往caliadce112d250。
那么该设备是什么呢?若是到这里你能猜出来是什么,那说明你的网络功底是不错的。这个设备就是veth pair的一端。在建立pod2时calico会给pod2建立一个veth pair设备。一端是pod2的网卡,另外一端就是咱们看到的caliadce112d250。下面咱们验证一下。在pod2中安装ethtool工具,而后使用ethtool -S eth0,查看veth pair另外一端的设备号。
pod2 网卡另外一端的设备好号是18,在node上查看编号为18的网络设备,能够发现该网络设备就是caliadce112d250。
因此,node上的路由,发送caliadce112d250的数据其实就是发送到pod2的网卡中。ping包的旅行到这里就到了目的地。
查看一下pod2中的路由信息,发现该路由信息和pod1中是同样的。
顾名思义,IPIP网络就是将IP网络封装在IP网络里。IPIP网络的特色是全部pod的数据流量都从隧道tunl0发送,而且在tunl0这增长了一层传输层的封包。
在master网卡上抓包分析该过程。
打开ICMP 285,pod1 ping pod2的数据包,可以看到该数据包一共5层,其中IP所在的网络层有两个,分别是pod之间的网络和主机之间的网络封装。
根据数据包的封装顺序,应该是在pod1 ping pod2的ICMP包外面多封装了一层主机之间的数据包。
之因此要这样作是由于tunl0是一个隧道端点设备,在数据到达时要加上一层封装,便于发送到对端隧道设备中。
两层IP封装的具体内容
IPIP的链接方式:
在安装calico网络时,默认安装是IPIP网络。calico.yaml文件中,将CALICO_IPV4POOL_IPIP的值修改为 "off",就可以替换成BGP网络。
BGP网络相比较IPIP网络,最大的不一样之处就是没有了隧道设备 tunl0。 前面介绍过IPIP网络pod之间的流量发送tunl0,而后tunl0发送对端设备。BGP网络中,pod之间的流量直接从网卡发送目的地,减小了tunl0这个环节。
master节点上路由信息。从路由信息来看,没有tunl0设备。
一样建立一个daemonset,pod1在master节点上,pod2在node节点上。
pod1 ping pod2。
根据pod1中的路由信息,ping包经过eth0网卡发送到master节点上。
master节点上路由信息。根据匹配到的 192.168.190.192 路由,该路由的意思是:去往网段192.168.190.192/26 的数据包,发送网段172.171.5.96。而5.96就是node节点。因此,该数据包直接发送了5.96节点。
node节点上的路由信息。根据匹配到的192.168.190.192的路由,数据将发送给 cali6fcd7d1702e设备,该设备和上面分析的是同样,为pod2的veth pair 的一端。数据就直接发送给pod2的网卡。
当pod2对ping包作出回应以后,数据到达node节点上,匹配到192.168.236.0的路由,该路由说的是:去往网段192.168.236.0/26 的数据,发送给网关 172.171.5.95。数据包就直接经过网卡ens160,发送到master节点上。
经过在master节点上抓包,查看通过的流量,筛选出ICMP,找到pod1 ping pod2的数据包。
能够看到BGP网络下,没有使用IPIP模式,数据包是正常的封装。
值得注意的是mac地址的封装。192.168.236.0是pod1的ip,192.168.190.198是pod2的ip。而源mac地址是 master节点网卡的mac,目的mac是node节点的网卡的mac。这说明,在 master节点的路由接收到数据,从新构建数据包时,使用arp请求,将node节点的mac拿到,而后封装到数据链路层。
BGP的链接方式:
IPIP网络:
流量:tunlo设备封装数据,造成隧道,承载流量。
适用网络类型:适用于互相访问的pod不在同一个网段中,跨网段访问的场景。外层封装的ip可以解决跨网段的路由问题。
效率:流量须要tunl0设备封装,效率略低
BGP网络:
流量:使用路由信息导向流量
适用网络类型:适用于互相访问的pod在同一个网段,适用于大型网络。
效率:原生hostGW,效率高
(1) 缺点租户隔离问题
Calico 的三层方案是直接在 host 上进行路由寻址,那么对于多租户若是使用同一个 CIDR 网络就面临着地址冲突的问题。
(2) 路由规模问题
经过路由规则能够看出,路由规模和 pod 分布有关,若是 pod离散分布在 host 集群中,势必会产生较多的路由项。
(3) iptables 规则规模问题
1台 Host 上可能虚拟化十几或几十个容器实例,过多的 iptables 规则形成复杂性和不可调试性,同时也存在性能损耗。
(4) 跨子网时的网关路由问题
当对端网络不为二层可达时,须要经过三层路由机时,须要网关支持自定义路由配置,即 pod 的目的地址为本网段的网关地址,再由网关进行跨三层转发。
部分数据或文字引用至 http://ju.outofmemory.cn/entry/367749