Calico 是一个基于 BGP 的纯三层的网络方案,与 OpenStack 、Kubernetes 、AWS 、GCE
等云平台都能够良好地集成 。 Calico 在每个计算节点都利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发 。每个 vRouter 都通过 BGP 协议把在本节点上运行的容器的路由信息向整个 Calico 网络广播,并自动设置到达其他节点的路由转发规则 。 Calico 保证所有容器之间的数据流量都是通过 IP 路由的方式完成互联互通的 。 Calico 节点组网时可以直接利用数据中心的网络结构 (L2 或者 L3) ,不需要额外的 NAT 、隧道或者 Overlay Network, 没有额外的封包解包,能够节约 CPU 运算,提高网络效率。
Calico 在小规模集群中可以直接互联,在大规模集群中可以通过额外的 BGP route reflector 来完成,如下图所示。
此外, Calico 基于 iptables 还提供了丰富的网络策略,实现了 Kubemetes 的 Network
Policy 策略,提供容器间网络可达性限制的功能 。
Calico 的主要组件如下 。
© Felix: Calico Agent, 运行在每个 Node 上,负责为容器设置网络资源 (IP 地址、路由规则 、 iptables 规则等),保证跨主机容器网络互通 。
© etcd: Calico 使用的后端存储 。
© BGP Client: 负责把 Felix 在各 Node 上设置的路由信息通过 BGP 广播到 Calico 网络 。
© Route Reflector: 通过一个或者多个 BGP Route Reflector 完成大规模集群的分级路由分发。
© CalicoCtl: Calico 命令行管理工具 。
calico-node 应用的主要参数如下 。
© DATASTORE_TYPE:数据后端存储,默认为 "kubernetes" ,也可以使用 “etcd” 。
© CALICO_IPV4POOL_CIDR: Calico IPAM 的 IP 地址池,Pod 的 IP 地址将从该池中进行分配 。
© CALICO_IPV4POOL_IPIP: 是否启用 IPIP 模式 。启用 IPIP 模式时, Calico 将在 Node 上创建一个名为 tunl0 的虚拟隧道 。
© IP _AUTODETECTION_METHOD: 获取 Node IP 地址的方式 ,默认使用第 1 个网络接口的 IP 地址 ,对于安装了多块网卡的 Node, 建议使用正则表达式选择正确的网卡,例如 "interface=ens.*" 表示选择名称以 ens 开头的网卡的 IP 地址 。
© FELIX_IPV6SUPPORT: 是否启用 IPv6 。
© FELIX_LOGSEVERITYSCREEN: 日志级别 。
其中, IP Pool 可以使用两种模式 BGP 或 IPIP 。 使用 IPIP 模式时,设置CALICO_IPV4POOL_IPIP="always" ; 不使用 IPIP 模式时, 设置 CALICO_IPV4POOL_IPIP=
"off" ,此时将使用 BGP 模式 。
IPIP 是一种将各 Node 的路由之间做一个 tunnel, 再把两个网络连接起来的模式,如下图所示。 启用 IPIP 模式时 , Calico 将在各 Node 上创建一个名为 tunl0 的虚拟网络接口 。
BGP 模式则直接使用物理机作为虚拟路由器 (vRouter) ,不再创建额外的 tunnel 。