Calico以其性能、灵活性和网络策略而闻名,不仅涉及在主机和Pod之间提供网络连接,而且还涉及网络安全性和策略管理。(还可以配置防火墙规则来隔离不同应用的网络)
对于同网段通信,基于第3层,Calico使用BGP路由协议在主机之间路由数据包,使用BGP路由协议也意味着数据包在主机之间移动时不需要包装在额外的封装层中。
对于跨网段通信,基于IPIP使用虚拟网卡设备tunl0,用一个IP数据包封装另一个IP数据包,外层IP数据包头的源地址为隧道入口设备的IP地址,目标地址为隧道出口设备的IP地址。
网络策略是Calico最受欢迎的功能之一,使用ACLs协议和kube-proxy来创建iptables过滤规则,从而实现隔离容器网络的目的。
此外,Calico还可以与服务网格Istio集成,在服务网格层和网络基础结构层上解释和实施集群中工作负载的策略。这意味着你可以配置功能强大的规则,以描述Pod应该如何发送和接收流量,提高安全性及加强对网络环境的控制。
Calico属于完全分布式的横向扩展结构,允许开发人员和管理员快速和平稳地扩展部署规模。对于性能和功能(如网络策略)要求高的环境,Calico是一个不错选择。
calico以demoset的方式运行,其实就是将CNI的这些二进制文件推送到每一个节点上面去。
对于calico来说它有几个重要的组件,第一个是felix,这个组件就是网路插件的agent,它要去做防火墙规则的配置。
第二个就是bird,它是互联网路由交换协议,bird其实也是开源软件,这个开源软件是用来做路由交换的,当在主机上运行bird daemo之后,那么这个主机可以模拟成路由器。如果每个主机上面都运行bird daemon,那么每一个主机之间,它们之间就变成了路由器的网络,它们会基于路由协议bgp,它们之间的协议会彼此交换路由信息,它们就会告知哪个网段应该跳转到我的主机上面来。
这样就相当于不通过tunnel的这种模式就能够将网络打通了。
confd是用来做配置推送的。
所以在每一个主机上面会去运行calico node的pod来完成主机网络的配置。
[root@k8s-master ~]# kubectl get daemonset -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 3 3 3 3 3 kubernetes.io/os=linux 277d
calico的volume的path,所有插件的二进制文件是opt/cni/bin下面的,配置文件是/etc/cni/net.d下面的,也就是主机上面的两个目录通过hostpath形式mount到calico的initcontainer里面来了。
其实也即是在initcontainer在启动的时候会将容器镜像里面的文件拷贝到上面的目录下面。
那么主机就有了这些配置和二进制文件了。
那么containerd在去调用的时候那么就可以调用到了。