0、背景及calico简介
为了搞定 AI on k8s的网络环境,即夸节点容器通信的问题,在k8s多个网路解决方案中选择了延迟表现最好的-calico方案,本文主要介绍calico 架构、组件及网络通信原理,更多的细节在之后的文章中分享。
Calico是一个纯3层的数据中心网络方案,而且无缝集成像OpenStack这种IaaS云架构,能够提供可控的VM、容器、裸机之间的IP通信。
Calico的原理是通过修改每个主机节点上的iptables和路由表规则,实现容器间数据路由和访问控制,并通过Etcd协调节点配置信息的。因此Calico服务本身和许多分布式服务一样,需要运行在集群的每一个节点上。
一、calico on k8s 架构
主要组件:
- Felix:Calico Agent,跑在每台需要运行Workload的节点上,主要负责配置路由及ACLs等信息来确保Endpoint的连通状态;
- etcd:分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性;
- BGP Client(BIRD):主要负责把Felix写入Kernel的路由信息分发到当前Calico网络,确保Workload间的通信的有效性;
- BGP Route Reflector(BIRD):大规模部署时使用,摒弃所有节点互联的mesh模式,通过一个或者多个BGP Route Reflector来完成集中式的路由分发。
二、calico 夸节点容器通讯分析
calico 跨节点通信的模式: IPIP模式(默认)和BGP模式(需要交换机支持BGP协议)。
其中IPIP模式分为两种CrossSubnet (我们采用的模式)和 ALL; ALL:所有节点通信都通过ip隧道,CrossSubnet: 跨网段的使用ip 隧道,走三层,通过tunl0网口转发,同一网段的直接把宿主机作为路由,走二层,通过eth0网口转发。
CrossSubnet同一网段实例 (10.10.102.67 和 10.10.102.68 主机上容器通信)
CrossSubnet夸网段实例(10.39.14.92 和 10.39.66.182 主机上容器通信),使用ip隧道
从源容器经过源宿主机,经过数据中心的路由,然后到达目的宿主机最后分配到目的容器的过程,整个过程中始终都是根据iptables规则进行路由转发,并没有进行封包,解包的过程。
ip隧道协议栈
三、k8s 上部署 calico
在kube-system namespace上部署calico服务
kubectl create -f calico.yaml
calico.yaml下载地址 部署完成,pod 情况:
四、Reference
calico controller :https://docs.projectcalico.org/v3.3/reference/kube-controllers/configuration
calico cni : https://docs.projectcalico.org/v3.3/reference/cni-plugin/configuration
k8s 网络策略: http://docs.kubernetes.org.cn/777.html
k8s 网络模式原理:https://www.kubernetes.org.cn/2059.html
calico controller git https://github.com/projectcalico/kube-controllers
calico cni git https://github.com/projectcalico/cni-plugin
calico node https://github.com/projectcalico/node
calico felix https://github.com/projectcalico/felix
calico bird https://github.com/projectcalico/bird