1. CNM模型
DOCKER公司提出,主要通过如下三个组件实现:
1.1 Network Sandbox
- 作用: 容器内部网络栈,包括网络接口、路由表、DNS等配置的管理。
- 实现:可用 linux网络命名空间、FreeBSD Jail等机制实现
- 说明:一个Sandbox可以包含多个Endpoint。
1.2 Endpoint
- 作用:用于将容器内部Sandbox与外部网络相连的网络接口。
- 实现:可用veth对、Open vSwitch内部port等技术实现。
- 说明:一个Endpoint仅可加入一个Network
1.3 Network
- 作用:可以直接相互连接的Endpoint的集合。
- 实现:可用linux网桥、VLAN等技术实现。
- 说明:一个Network包含多个Endpoint
2. CNI模型
由CoreOS公司提出的一种容器网络规范。被kubernetes等项目采纳。
其对容器网络的设置和操作都通过插件完成,有如下两种类型:
2.1 CNI Plugin
作用:负责为容器配置网络资源。
包括如下3个基本接口的定义:
- ADD:将容器添加到某个网络
- DELETE:容器销毁时将容器从某个网络中删除
- CHECK:检查容器网络是否正确
- VERSION:查询网络插件支持的CNI规范版本号
2.2 IPAM Plugin
作用:负责对容器的IP地址进行分配和管理。如:为容器分配IP、网关、路由、DNS。
下边介绍集中常用的网络组件
3. Flannel
3.1 实现原理
1) 协助kubernetes,给每个node上的容器分配互不冲突的IP地址
2)建立一个覆盖网络(Overlay Network),通过该网络将数据原封不动的传给目标容器。
3.2 网络架构
flannel0的网桥一端谅解docker0,一端连接flanneld 服务进程
flanneld进程连接etcd
利用etcd管理可分配的IP地址网段资源
监控etcd中每个Pod的实际地址,并在内存中建立一个Pod节点的路由表flanneld进程下连docker0和物理网络
使用内存中的Pod路由表,将docker0发来的数据包包装起来,利用物理网络投递到目标flanneld上。
目标flanneld解包,发送给docker0(因此daocker0得到的是原始数据)
4. calico-BGP模式
4.1 实现原理
一个基于BGP的纯三层网络方案
在每个计算节点上由一个vRouter 来负责转发,每个vRouter通过BGP1协议把本节点上运行的容器路由信息向整个Calico网络广播,并自动设置到达其他节点的路由转发规则
4.2网络架构
4.3 calico 组件
Felix:
是一个Calico Agent,运行在每个node上,负责为容器设置网络资源(如IP地址、路由规则、iptables规则等),保证跨主机容器网络互通etcd:后端存储
BGP Client
负责把Felix在各Node上设置的路由信息通过BGP协议广播到Calico网络Route Reflector:
通过一个或多个BGP Reflector 来完成大规模集群的分级路由分发CalicoCtl
Calico的命令行管理工具。
4.4 IP Pool 的两种模式
-
IPIP模式
将各Node的路由之间做一个tunnel,再把两个网络连接起来。如图所示:
BGP模式
直接使用物理机作为虚拟路由器(vRouter),不再创建额外的tunnel设置方法
calico-node的容器中变量设置为:
ipip模式:CALICO_IPV4POOL_IPIP="always"
BGP模式:CALICO_IPV4POOL_IPIP="off"