Calico是什么

Calico 是一个用于容器、虚拟机和主机的开源网络和网络安全解决方案。它是一个纯三层(L3)解决方案,利用 BGP(Border Gateway Protocol)协议为容器或虚拟机提供 IP 地址,并提供网络安全功能,包括网络策略和加密。

Calico 通过将网络策略应用于标签和选择器,提供了一种简单而强大的方法来保护容器或虚拟机之间的通信,并限制容器或虚拟机可以访问的网络资源。它还支持基于 Kubernetes 和 OpenStack 等平台的网络自动化和集成。

Calico 的另一个重要特点是其可扩展性。它使用了基于 BGP 的路由技术,这使得它能够轻松地扩展到非常大规模的网络中,而不会降低性能。

由于Calico是一种纯三层的方案,因此可以避免与二层方案相关的数据包封装的操作,中间没有任何的NAT,没有任何的overlay,所以它的转发效率是所有方案中最高的,因为它的包直接走原生TCP/IP的协议栈,它的隔离也因为这个栈而变得好做。因为TCP/IP的协议栈提供了一整套的防火墙的规则,所以它可以通过IPTABLES的规则达到比较复杂的隔离逻辑。

Calico架构

Calico架构

各组件介绍:

  • Felix:Calico Agent,跑在K8S集群中的每台节点上,主要负责管理和维护该节点上的网络和安全策略,如 网络接口管理和监听、路由、ARP 管理、ACL 管理和同步、状态上报等;
  • Etcd:分布式键值存储,用来存储网络元数据、安全策略以及节点的状态信息,确保Calico网络状态的一致性和准确性,可以和K8S的etcd合用;
  • BGP Client(BIRD):跟Felix一样,每一个节点上都会部署BGP Client,主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保各节点间的通信的有效性;
  • BGP Route Reflector(BIRD): 在大型网络规模中,如果仅仅使用BGP Client 形成mesh全网互联的方案就会导致规模限制,因为所有节点之间俩俩互联,需要 N^2 个连接,为了解决这个规模问题,可以采用 BGP 的 Router Reflector 的方法,使所有BGP Client仅与特定RR节点互联并做路由同步,从而大大减少连接数大规模部署时使用。

关键点:

  • Felix会定期查询Etcd数据库,从而获取到IP变化信息,比如说用户在这台机器上创建了一个容器,增加了一个IP等。当它发现数据变更后,比如用户创建pod后,Felix负责将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。同样如果用户制定了隔离策略,Felix同样会将该策略创建到ACL中,以实现隔离。
  • BIRD是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

calico三种网络工作模式

模式 说明 特点
VXLAN 封包, 在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac。外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取 只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的“二层”互通, 三层即vxlan包封装在udp数据包中, 要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac。
IPIP 封包,在tunl0设备上将pod发来的数据包的mac层去掉,留下ip层封包。 外层数据包目的ip地址根据路由得到。相当于建立了隧道,把两个本来不通的节点网络通过点对点连接起来。 只要k8s节点间三层互通, 可以跨网段, 对主机网关路由没有特殊要求。解包、封包都会造成一定的资源损耗。 适用于互相访问的pod不在同一个网段中、跨网段访问的场景。外层封装的ip能够解决跨网段的路由问题。
BGP 边界网关协议(Border Gateway Protocol, BGP)是互联网上一个核心的去中心化自治路由协议。通俗的讲就是讲接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单IP 不用封包解包,通过bgp协议可实现pod网络在主机间的三层可达, k8s节点不跨网段时和flannel的host-gw相似,支持跨网段,跨网段时,需要主机网关路由也充当BGP Speaker能够学习到pod子网路由并实现pod子网路由的转发。总之bgp适用于大规模网络场景。

IPIP模式说明

1、默认网络模式即IPIP模式,在所有节点上查看网卡,会有tunl0网卡。

查看k8s-master01的tunl0网段,tunl0网段和Pod网段保持一致

$ ip -4 a
...
...
...
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 172.25.244.192/32 scope global tunl0
...
...
...

查看k8s-node01的tunl0网段,tunl0网段和Pod网段保持一致

...
...
...
3: tunl0@NONE: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 172.17.125.0/32 scope global tunl0
       valid_lft forever preferred_lft forever
...
...
...

2、查看路由

查看k8s-node01路由

$ ip route

default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
blackhole 172.17.125.0/26 proto bird
172.17.125.17 dev cali48699ae409f scope link
172.17.125.18 dev cali56ef95f5aac scope link
172.18.195.0/26 via 192.168.1.33 dev tunl0 proto bird onlink
172.25.92.64/26 via 192.168.1.32 dev tunl0 proto bird onlink
172.25.244.192/26 via 192.168.1.31 dev tunl0 proto bird onlink
172.27.14.192/26 via 192.168.1.35 dev tunl0 proto bird onlink
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.34

查看k8s-master01路由

$ ip route

default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
172.17.125.0/26 via 192.168.1.34 dev tunl0 proto bird onlink
172.18.195.0/26 via 192.168.1.33 dev tunl0 proto bird onlink
172.25.92.64/26 via 192.168.1.32 dev tunl0 proto bird onlink
blackhole 172.25.244.192/26 proto bird
172.25.244.218 dev cali4c6a037f519 scope link
172.25.244.219 dev calia2acd01c93c scope link
172.27.14.192/26 via 192.168.1.35 dev tunl0 proto bird onlink
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.31

3、查看Pod

$ k get po -n aming -owide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE           NOMINATED NODE   READINESS GATES
ng-deploy-5db56f48f4-qjvsh   1/1     Running   0          30s   172.17.125.18    k8s-node01     <none>           <none>
ng-deploy-5db56f48f4-w26l8   1/1     Running   0          30s   172.25.244.219   k8s-master01   <none>           <none>

4、分析

(1)ng-deploy-5db56f48f4-qjvsh在k8s-node01上,它的IP为172.17.125.18

(2)如果125.18 要访问另外一个pod ng-deploy-5db56f48f4-w26l8,其IP为172.25.244.219

(3)它会找路由 172.25.244.192/26 via 192.168.1.31 dev tunl0 proto bird onlink,这条路由对应着k8s-master01的节点IP 192.168.1.31,所以它通过这个IP就能找到172.25.244.219

以上可以说明,IPIP模式就是将节点与节点之间建立了一条隧道,并且建立了对应的路由信息,Pod之间通信时只需要知道目标IP所对应的路由就可以直接访问到对应的节点IP,从而达到对方的Pod。

calico网络插件-1

5、小结

(1)tunl0网段和Pod网段一致

(2)每个节点都包含去其他节点的路由

BGP模式说明

IPIP模式修改为BGP

1、在k8s-master01节点上更改calico-node配置

$ k edit ds calico-node -n kube-system -oyaml #会进入vim编辑模式
搜索下面两行
        - name: CALICO_IPV4POOL_IPIP
          value: Always

在它的下面增加:
        - name: CALICO_AUTODETECTION_METHOD
          value: interface=eth0

如果不是yaml格式,则通过以下格式在搜索内容后面进行添加

{"name":"CALICO_AUTODETECTION_METHOD","value":"interface=eth0"}

保存即可生效

2、在k8s-master01节点上更改ippool,搜索ipipMode,将ipipMode: Always 改为 ipipMode: Never保存即可生效

$ k edit ippool

3、查看ip,会发现所有机器的tunl0都没有IP地址了

$ ip -4 a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.1.31/24 brd 192.168.1.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.1.38/32 scope global ens33
       valid_lft forever preferred_lft forever
5: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
    inet 10.0.0.10/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.179.106/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.175.237/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.135.70/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.187.20/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.154.239/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever
    inet 10.0.0.1/32 scope global kube-ipvs0
       valid_lft forever preferred_lft forever

4、查看route,使用BGP模式不再显示tunl0

$ ip route

default via 192.168.1.1 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1002
172.17.125.0/26 via 192.168.1.34 dev ens33 proto bird
172.18.195.0/26 via 192.168.1.33 dev ens33 proto bird
172.25.92.64/26 via 192.168.1.32 dev ens33 proto bird
blackhole 172.25.244.192/26 proto bird
172.25.244.218 dev cali4c6a037f519 scope link
172.25.244.219 dev calia2acd01c93c scope link
172.27.14.192/26 via 192.168.1.35 dev ens33 proto bird
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.31

5、如果使用BGP模式,172.17.125.18访问172.25.244.219时,它的路由是172.25.244.219 dev calia2acd01c93c scope link,但此时并不需要借助tunl0了,而是直接通过ens33来。

BGP模式说明