k8s之Calico

之前接触过calico,但是kubernetes中的calico为什么是calico-kube-controllers、calico-node、calico-typha,为什么和想象的组件不一样。查资料后,知道了为什么,特总结下。

 

一、calico基本实现图

 

 

 

calico的基本组件有etcd、felix、BGP Client、BIDR(bgp route reflector).

Etcd:分布式键值存储,主要负责网络元数据一致性。

Felix:跑在每个节点上,主要负责配置路由及 ACLs(包过滤技术)等信息来确保 endpoint 的连通状态。

BIDR(bgp route reflector)主要负责把 Felix 写入 kernel 的路由信息分发到当前 Calico 网络

 

二、Calico的工作流程

对于控制平面,Felix会监听ECTD中心的存储,从中获取事件,比如说用户在这台机器上一个pod。接着会在这台机器上创建出一个pod,并将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。绿色部分是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

 

Pod的ip是由cni分配

Kube-controller-manager为每个节点分配一个podCIDR。从podCIDR中的子网值中为节点上的Pod分配IP地址。由于所有节点上的podCIDR是不相交的子网,因此它允许为每个pod分配唯一的IP地址。Kubernetes集群管理员可配置和安装kubelet,容器运行时,网络提供商代理,并在每个节点上分发CNI插件。网络提供商代理启动时,将生成CNI配置。在节点上调度Pod后,kubelet会调用CRI插件来创建Pod。如果是Containerd,则Containered CRI插件会调用CNI配置中指定的CNI插件来配置Pod网络。这些都会使Pod获得IP地址。

 

当容器通过calico进行跨主机通信时,其网络通信模型如下图所示:

 

 

 

 

三、Calico在kubernetes中的工作

 

 

 

calico包括如下重要组件:calico/node,Typha,Felix,etcd,BGP Client,BGP Route Reflector。

calico/node:把Felix,calico client,confd,Bird封装成统一的组件作为统一入口,同时负责给其他的组件做环境的初始化和条件准备。

Felix:主要负责路由配置以及ACLS规则的配置以及下发,它存在在每个node节点上。

etcd:存储各个节点分配的子网信息,可以与kubernetes共用;

BGPClient(BGPD), 主要负责把 Felix写入 kernel的路由信息分发到当前 Calico网络,确保 workload间的通信的有效性;

BGPRoute Reflector(BIRD), 大规模部署时使用,在各个节点之间不是mesh模式,通过一个或者多个 BGPRoute Reflector 来完成集中式的路由分发;当etcd中有新的规则加入时,Route Reflector 就会将新的记录同步。

Typha:在节点数比较多的情况下,Felix可通过Typha直接和Etcd进行数据交互,不

kube-apiserver,既降低其压力。生产环境中实例数建议在3~20之间,随着节点数的增加,按照每个Typha对应200节点计算。

 

calico-kube-controllers的Deployment,部署一个Calico Kubernetes控制器quay.io/calico/kube-controllers容器包含以下控制器:

l policy controller:监视网络策略和编程Calico策略,它会把Kubernetes的network policies同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听NetworkPolicy事件。 用户在k8s集群中设置了Pod的Network Policy之后,calico-kube-controllers就会自动通知各个Node上的calico-node服务,在宿主机上设置相应的iptables规则,完成Pod间网络访问策略的设置。

l namespace controller:监视命名空间和编程Calico配置文件,它会把Kubernetes的namespace label变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听Namespace事件。

l serviceaccount controller:监视服务帐户和编程Calico配置文件,它会把Kubernetes的service account变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听ServiceAccount事件。

l workloadendpoint controller:监视pod标签的更改并更新Calico工作负载中的endpoints配置,它会把Kubernetes的pod label变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听Pod事件。

l node controller:监视删除Kubernetes nodes节点的操作并从Calico中也删除相应的数据,该控制器需要有访问Kubernetes API的只读权限,以监听Node事件。

 

参考:https://www.jianshu.com/p/54ad345c5516

          https://www.kubernetes.org.cn/4960.html

   https://blog.csdn.net/ccy19910925/article/details/82423452

posted on 2021-02-26 10:52  星星眨着眼  阅读(5856)  评论(0编辑  收藏  举报

导航