浅谈Calico
浅谈Calico
简介
What is Calico?
- Calico 是一个开源的网络和网络安全解决方案,适用于容器、虚拟机和物理机等场景。Calico 支持广泛的平台,包括 Kubernetes、OpenShift、Mirantis Kubernetes Engine (MKE)、OpenStack 和裸机服务。
- Calico是一个纯三层的协议,为OpenStack虚机和Docker容器提供多主机间通信。Calico不使用重叠网络(即隧道和MAC-in-IP封装),它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。
- Calico使用Linux内核内置的高度优化的转发和访问控制功能来提供本地Linux网络数据平面性能。
- Calico在kubernetes集群中创建和管理一个三层的网络,该网络提供了Pod间的通信。 它为Pods提供了可路由的IP地址,从而使互操作性更加容易。Calico使用iptables实现网络安全策略,提供对pod之间通信的细粒度控制。
结构
- Felix:Calico 守护程序,在每个workload节点上运行,主要负责配置路由及ACLs等信息,确保endpoint的连通状态;
- confd:一个守护程序,用于监视ETCD数据存储以进行配置更改,并更新BIRD的配置文件。
- BIRD:BGP Client,主要负责把Felix写入kernel的路由信息分发到当前Calico网络,确保workload间的通信有效性;
- ETCD:分布式键值存储数据库,主要负责网络元数据的一致性,确保 Calico 网络状态的准确性;
网络模式
在开始说Calico的网络模式前,先了解一些Calico启动时的配置参数。[参考]
# POD使用的网络,不能和本地网络冲突
- name: CALICO_IPV4POOL_CIDR
value: "192.168.0.0/16"
# 每个workload节点分配的子网大小,目的是为了缩减路由表规模
- name: CALICO_IPV4POOL_BLOCK_SIZE
value: 26
# Always:default参数,表示全部使用IPIP模式;
# CrossSubnet:同子网内通信使用BGP模式,跨子网通信时使用IPIP模式;
# Never:禁用IPIP模式,使用BGP模式;
- name: CALICO_IPV4POOL_IPIP
value: "Always"
# Never:default参数,表示禁用VXLAN模式;
# Always:Calico v3.7版本后支持,表示使用VXLAN模式,要启用时,需配置CALICO_IPV4POOL_IPIP的value=Never;
- name: CALICO_IPV4POOL_VXLAN
value: "Never"
IPIP
- Node内POD-POD之间通信
- 不同Node内POD-POD之间通信
- IPIP封装头
VXLAN
- 不同Node内POD-POD之间通信
BGP
- 不同Node内POD-POD之间通信
优缺点总结
BGP模式
- 缺点
- BGP模式是需要通过路由广播容器网络的路由信息,而路由广播只能在局域网中进行,如果kubernetes集群中的工作节点不在同一个子网,则跨子网workload节点上的POD无法正常通信,除非使用其他网络设备打通BGP路由。
- 没有Route Reflector的集群,节点数量不建议超过100个。
- 优点
- Underlay网络,结构简单。
- 同子网内通信因为没有任何封装,所以同子网内通信的网络性能高。
- 数据包转发依托于Kernel,没有性能损耗。
IPIP模式
- 缺点
- 封装简单,所以安全性低。
- 和纯BGP模式下的性能相比,略有降低。
- 优点
- Overlay网络,可以让POD、NODE跨子网通信。
- IPIP的包头非常小,因此它的速度理论上要比VXLAN快。
- 总结
使用CrossSubnet模式可以结合BGP和IPIP的所有优点,同子网内不需要封装IPIP,只有在跨子网的NODE间通信才需要封装IPIP。