容器网络规范CNI
CNI,Container Network Interface标准,连接了两个组件:容器管理和网络插件。CNI的设计思想是容器runtime在创建容器的时候,提前创建好玩过协议栈空间,然后调用CNI插件为这个网络协议栈空格键配置网络,而后启动容器内的进程。
CNI插件类型:
- Main插件,用来创建具体网络设备的二进制文件,比如网桥bridge,ipvlan,loopback,macvlan,ptp以及vlan
- IPAM插件(ip addres managerment)插件,负责分配IP地址的二进制文件。比如 dhc
k8s网络方案-l3路由
calico组网示意
calico路由方案
组件
- 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模式
BGP:是一个linux内核原生就支持的,专门用在大规模数据中心里维护不同的自治系统之间的路由信息,无中心的路由协议
BGP IPIP
IPIP模式:原始的IP包进入tunl0设备,就会被linux内核的IPIP驱动接管,将这个IP包直接封装在一个宿主机网络的IP包中,目的地址为NODE2的IP
calico网络操作
cailoctl工具
查看版本
kubectl describe deployment calico-kube-controllers -n kube-system
查看calico节点信息
calicoctl get node
查看当前ip地址池
calicoctl get ippool
#查看当前玩过模式
calicoctl get ippool -o wide
#查看当前节点状态
calicoctl node status
#查看节点连接信息
netstat -anp | grep ESTABLISH |grep bird
#查看IP地址连接池详情
kubectl describe ippools