容器网络规范CNI

CNI,Container Network Interface标准,连接了两个组件:容器管理和网络插件。CNI的设计思想是容器runtime在创建容器的时候,提前创建好玩过协议栈空间,然后调用CNI插件为这个网络协议栈空格键配置网络,而后启动容器内的进程。

云计算-网络插件calico学习以及使用_ico

CNI插件类型:

  • Main插件,用来创建具体网络设备的二进制文件,比如网桥bridge,ipvlan,loopback,macvlan,ptp以及vlan
  • IPAM插件(ip addres managerment)插件,负责分配IP地址的二进制文件。比如 dhc


k8s网络方案-l3路由

calico组网示意

云计算-网络插件calico学习以及使用_二进制文件_02

calico路由方案

云计算-网络插件calico学习以及使用_ico_03

组件

  • ETCD 分布式键值数据库,存储元数据和作为calico各个组件的通信枢纽
  • BGP Client 负责BGP协议,与外部的RR建立BGP邻居关系,通过RR 把本地POD的路由发布出去,同时学习其他节点上的POD路由
  • FELIX,运行在每个K8S的node上,负责将POD路由写入HOST路由表,并将ACL规则写入iptables
  • RR 大规模组网的时候,利用路由反射器实现全网的POD路由同步


转发说明

  • ETH0,calixxx是一对veth pair,它的两端分别在容器和宿主机的网络命名空间上
  • pod内只有一条默认的路由指向本地链路地址169.254.1.1,所有calixx接口mac地址都是ee:ee:ee:ee:ee:ee
  • pod发起访问请求时首先发ARP请求报文,请求169.254.1.1的mac地址
  • 宿主机上并没有169.254.1.1这个地址,而是开启了ARP代理,宿主机的ARP REPLY报文直接将veth pair另一端的MAC地址(全e)返回给pod
  • pod根据arp reply报文封装外层MAC发到宿主机,报文在宿主机上查路由表做三层转发

calico网络原理

Calico BGP

BGP模式:没有网桥,而是为容器创建veth pair设备,并配置路由规则,靠BGP维护的路由规则,该模式要求集群宿主机直之间是二层联通的,路由交换模式默认为node-to-node mesh模式

云计算-网络插件calico学习以及使用_IP_04

BGP:是一个linux内核原生就支持的,专门用在大规模数据中心里维护不同的自治系统之间的路由信息,无中心的路由协议

BGP IPIP

IPIP模式:原始的IP包进入tunl0设备,就会被linux内核的IPIP驱动接管,将这个IP包直接封装在一个宿主机网络的IP包中,目的地址为NODE2的IP

云计算-网络插件calico学习以及使用_ico_05


calico网络操作

cailoctl工具

查看版本

kubectl describe deployment calico-kube-controllers -n kube-system


云计算-网络插件calico学习以及使用_二进制文件_06


查看calico节点信息

calicoctl get node 

云计算-网络插件calico学习以及使用_IP_07

查看当前ip地址池

calicoctl get ippool

云计算-网络插件calico学习以及使用_ico_08

#查看当前玩过模式
calicoctl get ippool -o wide

#查看当前节点状态
calicoctl node status

#查看节点连接信息
netstat -anp | grep ESTABLISH |grep bird

#查看IP地址连接池详情
kubectl describe ippools