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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM