通过前面2节完成了calico node集群的二进制部署,并在集群各个节点上部署calico cni插件,测试了calico cni插件与containerd的集成。 本节将学习Calico网络的一些基本概念。

Calico Node的核心组件

Calico是一个纯三层的虚拟网络,Calico为每个容器分配一个ip,每个宿主机(Calico Node)都是一个虚拟路由器,将不同宿主机的容器连接起来,实现容器间跨主机通信。

下图给是Calico集群各组件的示意图,结合前面2节内容可以加深理解:

calico-struct.png

Calico在每个宿主机节点上利用linux kernel实现了一个高效的vRouter负责数据转发,每个vRouter通过BGP协议负责把本节点上运行的负责workload(如容器)的路由信息在整个Calico网络内部传播, 同时在本机设置到达其他节点的路由转发规则,确保所有workload之间的流量都是通过IP包的形式完成互联的。简单理解就是通过在主机上启动虚拟路由器(calico node),将每个主机作为路由器使用实现互联互通的网络拓扑。 Calico通过IPPool为每个宿主机配置独立的subnet。Calico提供了强大的网络策略(Policy)实现各种场景需求的访问控制。 在数据存储上Calico支持etcd和kubernetes两种datastore,使用etcd存储时calico将直接连接etcd集群,使用kubernetes存储时,calico将连接k8s的api server。

每个Calico Node上包含以下核心组件:

  • felix: 每个calico node上都要运行一个felix组件,该组件负责配置路由及ACL等信息,并确保该主机上endpoints(接入到calico网络中的网卡称为endpoint)的连通性。
  • bird: BGPClient, 每个calico node上都要运行一个bird,bird将felix写入kernel的路由信息分发给网络上其他的BGP peers。简单理解bird就是BGP守护进程负责将路由信息分发给其他节点。
  • confd: 每个calico node上都要运行一个confd,confd监听calico datastore中的配置变化并更新bird的配置文件。

Calico的网络模式

  • IPIP: 将一个IP包封装到另一个IP包中,把IP层封装到IP层的一个tunnel中,通过两端的路由做一个tunnel,把两个原来不通的网络通过点对点连接。ipip是linux内核模块,加载ipip模块后可以使用IP-in-IP Tunnel。An introduction to Linux virtual interfaces: Tunnels 这篇博文中有对linux内核ipip tunnel的介绍。calico以ipip模式运行时,每个主机上会出现一个tunl0的网卡设备用来进行ipip tunnel的封装。
  • BGP: Border Gateway Protocol边界网关协议是互联网上一个核心的去中心化自治路由协议。它通过维护IP路由表或“前缀”表来实现自治系统A(Autonomous System)S之间的可达性,属于矢量路由协议。BGP不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。每个AS都有一个AS号,64512到65535共1023个AS号码可用于私有网络,calico默认使用的AS是64512,AS内部的BGP Speaker通过BGP协议交换路由信息。BGP Speaker之间有bgp mesh(node to node mesh)和bgp route reflector(bgp rr)两种互联模式。
  • CrossSubnet: 表示(ipip-bgp混合模式),指“同子网内路由采用bgp,跨子网路由采用ipip

在使用场景上当主机节点处于不同网络分段,需要跨网段通信时,BGP模式将会失效,此时要使用IPIP模式。 Calico的BGP Mesh模式适合在小规模集群(节点数量小于100个)中直接互联,由于随着集群节点数量的增加,路由规则将成指数级增长会给集群网络带来很大压力。大规模集群需要使用BGP Route Reflector。

Calico的资源(Resource)

Calico的API定义了管理和使用Calico及Calico网络策略的所有资源,https://docs.projectcalico.org/reference/resources/文档中列出了Calico的API的全部资源。

  • BGPConfiguration: BGPConfiguration是针对集群或特定节点的BGP特定配置项
  • BGPPeer: 表示一个远端BGP Peer
  • FelixConfiguration: 表示集群的Felix配置选项。
  • GlobalNetworkPolicy: 表示应用于所有命名空间的匹配标签选择器的endpoints集合的有序网络策略规则集。
  • GlobalNetworkSet: 表示应用于所有命名空间一组任意的ip sunet/cidr,允许Calico策略匹配它。GlobalNetworkSet用于对来自(或前往)外部非calico网络的流量应用策略。
  • HostEndpoint: 在calico中IP被称为Endpoint, HostEndpoint即为宿主机IP
  • IPPool: IPPool表示一组IP地址,Calico从这些地址中分配workload endpoint IP。
  • NetworkPolicy: 表示应用于指定命名空间的匹配标签选择器的endpoints集合的有序网络策略规则集。
  • NetworkSet: 表示一组应用于指定命名空间的任意的ip sunet/cidr,允许Calico策略匹配它。NetworkSet用于对来自(或前往)外部非calico网络的流量应用策略。
  • Node: 表示运行Calico的节点。当将主机添加到Calico集群时,需要创建一个节点资源,其中包含运行在该主机上的Calico/node实例的配置。
  • WorkloadEndpoint: 在calico中IP被称为Endpoint, HostEndpoint即为工作负载IP(如容器IP)

可以通过calicoctl来管理这些资源。例如查看ippool:

1
2
3
calicoctl get ippool -o wide
NAME                  CIDR           NAT    IPIPMODE   VXLANMODE   DISABLED   SELECTOR
default-ipv4-ippool   10.50.0.0/16   true   Always     Never       false      all()

查看WorkloadEndpoint:

1
2
3
4
calicoctl get WorkloadEndpoint
WORKLOAD   NODE    NETWORKS          INTERFACE
           node4   10.50.3.65/32     calidefault-0a0
           node5   10.50.33.128/32   calidefault-eb7

参考