聊聊 Calico BGP容器网络实践

前言G行全栈云容器大规模运行在信创服务器的虚拟机里,发现如跨NUMA访问CPU可能导致性能不均衡、容器网络和IaaS SDN耦合、虚拟层本身资源消耗等诸多问题 。为解决这些问题 , G行探索将容器运行在裸金属服务器上,推出裸金属容器平台方案,使用纯三层网络设计,其中东西向网络流量使用开源Calico容器组件,南北向网络流量使用自研ELB 。本文主要介绍Calico BGP相关技术原理、实践和思考 。
BGP介绍BGP(Border Gateway Protocol , 边界网关协议)为取代外部网关协议(EGP)协议而创建,属于经典网络路由协议 。BGP相关的开源项目有bird、goBGP 等,开源软件运行在云平台的宿主主机上,使主机与网络设备交换路由信息,实现云上网络和云下网络的通信 。
关键概念:

  • AS(Autonomous System): 一个自治系统是受控于一家组织机构的路由器集合 。在企业内部AS号是统一管理的,根据网络设备的AS号异同,可分为IBGP和EBGP 。
  • IBGP(Internal BGP):在相同AS路由器之间建立会话,一般认为IBGP运行在安全的网络环境 。特点是IBGP的路由信息只能传一跳,不会传递给其他IBGP路由节点 。否则,需要开启Router Reflect特性 。
  • EBPG(External BGP):在不同AS路由器之间建立会话 。特点是EBGP路由器之间会同步彼此的路由 。?

聊聊 Calico BGP容器网络实践

文章插图
图一 网络架构
在典型Spine-Leaf架构下,Spine与Leaf之间运行EBGP协议,Leaf与裸金属服务器之间运行IBGP协议 。
Calico网络Calico是基于CNI实现的纯三层网络开源项目,首个版本在2015年发布,截止当前版本为Calico 3.26.1 。该项目已被业界广泛接受,并拥有许多大规模的实际案例 。
聊聊 Calico BGP容器网络实践

文章插图
图二 Calico架构示意图
1. Calico关键组件
  • Felix
Felix负责管理容器网络,配置容器IP地址、路由、iptables、安全策略等功能 。在每个Worker节点运行代理程序,负责与容器管理平面通信,获取并配置网络和安全策略 。
  • Confd
【聊聊 Calico BGP容器网络实践】监控Calico相关数据(BGP配置、IPAM配置等),动态生成Bird配置文件,并使Brid重新加载配置文件 。
  • Brid
发布路由:从Felix获取路由 , 并把路由分发给BGP邻居 , 外部流量通过该路由找到POD所在Worker节点 。
路由反射 (Route Reflector): 收到IBGP邻居发布的BGP路由 , 并反射路由给其他IBGP邻居 。
路由过滤:物理网络设备的所有路由表项会同步到本机,配置路由过滤,可以大量减少本机的路由条目 。
  • Typha
Flex通过Tyhpa直接跟Etcd交互,不再经过容器管理平面,在百节点以上的规模,能够有效降低对容器管理平面的访问压力 。
2. Calico组网模式
  •  IPIP模式
Calico默认网络架构,IPIP可理解为IPinIP,属于overlay的网络架构 。不依赖于外部交换机设备 , 即可实现网络组网 。缺点是报文的封装和解封装对网络效率有影响,节点规模有限制 。
  •  BGP模式
Calico最佳实践推荐该模式,计算节点与网络设备建立BGP邻居,并对外宣告POD的路由信息,网络设备学习到路由信息后 , 外部用户就可通过路由直接访问POD的地址,期间不涉及到报文的封装,网络效率非常高 。在合理的网络架构设计下,节点规模灵活扩展且不影响网络效率 。缺点是一般硬件网络设备和云平台的计算节点是由不同团队管理,遇到网络故障时需联合处置 。
3. IPAM地址管理??Calico通过IPPool进行IPAM管理 , IPPool定义了地址池名字、地址段、blockSize等字段 。IPPool的配置样例如下:
apiVersion:crd.projectcalico.org/v1kind: IPPoolmetadata:name: ippool-test-0spec:blockSize: 32cidr: 1.1.1.0/24ipipMode: NevernatOutgoing: falsenodeSelector: “!all()”vxlanMode: NevernodeSelector: 该字段与Kube.NETes节点的Label进行映射 。默认为all(),表示所有节点均可使用 。设置为!all() , 表示所有node均不可自动使用,可通过设置命名空间或者POD的注解,实现IPPool的绑定 。


推荐阅读