289 views
Calico-orienge === # 前言 另外一個也是非常知名的 CNI Plugin 就是 Calico, 相對於 Flannel 來說, Calico 提供的功能則相對的多,而這些功能與特色都能夠對應不同的網路環境。 Calico 專案的開發相對於 Flannel 來得更加活躍且也不停的有各種功能出現,畢竟相對於 Flannel 單純想提供Pod x Pod 連線功能來說, Calico 想提供的則是更多的功能,自然而然的發展就會比較廣且活躍。 # install * 安裝方便基本上可以很簡單,如同 Flannel 一樣透過一個 Yaml 就可以安裝基本的 CNI 資源到 Kubernetes 叢集中。此外也可以很複雜到需要安裝非常多的東西來提供更進階的功能。 這部分取決於你想要採用的功能。 * 舉例來說,如何建立存放 Calico 各節點溝通的資料就有兩種 * etcd * kubernetes API # Features * Calico 支援的平台非常多種,本身支援 CNI 介面使得支援 CNI 的平台都可以使用外,其也可以透過 Neutron Plugin 的方式安裝於 OpenStack 的環境中,算是我目前看到支援度非常豐富的網路功能解決方案 * 在其功能方面,基本上主要以 kubernetes 該平台能夠提供的功能來探討,可以分成兩個面向來看,分別是 Policy 以及 Network。 ## Policy * Network Policy * 實際上,Kubernetes 本身有定義 Network Policy 的介面,但是實際上卻沒有實現這種能夠用來限制 Pod 與 Pod 之間連線的功能。 官網明確的說明這部分的實現要依賴 CNI Plugin 來處理。 * 而 Calico 就有實現這種介面,因此可以直接使用 Kubernetes Network Policy 的規範去設定相對應的 Yaml 來實現基本的ACL (Access Control List) * Application Layer Policy * 相對於基本的 Kubernetes Network Policy 外, Calico 本身透過 Kubernetes CustomResourceDefinetion(CRD) 提供了另外一層新的 GlobalNetworkPolicy. * 該介面提供了基於 HTTP 方法或是路徑為基準的 ACL,本身的實現是透過 Service Mesh 的方式來進行 ACL 的處理,因此本身會依賴 lstio 的系統。在安裝上會需要更多的操作以及設定的細節來開啟此功能。 ## Network * Overlay Network. * Calico 對於網路連線方面也有提供類似 Flannel 的功能,透過 VXLAN 或是 IP in IP 這類型的協定來封裝連線封包已達到 Overlay Network 的需求 * Native Routing * 除了上述的 Overlay Network 之外, Calico 最主打的就是第二種網路,完完全全的 Underlay Network, 不依賴任何的封包封裝協定。 * Calico 的想法很簡單,雖然 Overlay Network 很方便,但是實際上每次的封包封裝都會增加整體封包的複雜度,同時也會增加封包的處理時間。 * 因此 Calico 透過 IPTables 以及 Routing Table 的方式來處理 Layer3路由的問題,讓不同節點之間的 Pod 可以透過 Routing Table 的方式直接互相連間而不需要再包覆一層額外的標頭檔來處理封包。 * Public IP Address Assignment * Calico 有額外自行開發一套 IPAM 來管理 IP 及分配,在此架構中所有的 IP 都會從 IP Pool 中去取得。 同時搭配 BGP 等動態路由協定的幫忙,所有的 Pod 都可以被賦予一個可被存取的 Public IP 地址,同時這些 Pod 在對外進行存取的時候也不需要進行 NAT 的轉換,可減少一次封包轉換所造成的效能耗損 ## 小結 Calico為每個容器或者虛擬機分配一個獨立的IP地址,然後在每台物理主機上定義包含這些IP地址的iptables規則,實現了防火牆功能。Calico在每個物理節點上跑一個高效的vRouter,由它對外廣播本機各容器的路由信息。它基於BGP協議,不僅適用於小規模部署,在route reflector的幫助下,更能應用於大型DataCenter。包的轉髮用是的Linux內核的轉發功能,高效而簡單。只要編排框架支持為每個服務分配一個IP地址,就可以集成使用Calico 。 ![](https://minio.mcl.math.ncu.edu.tw:443/hackmd/uploads/upload_d523b07be937def60aa78349fb460696.png) ![](https://minio.mcl.math.ncu.edu.tw:443/hackmd/uploads/upload_e5a142b8545e2936b810ffa33410019d.png) ![](https://minio.mcl.math.ncu.edu.tw:443/hackmd/uploads/upload_7d4a4faa12af5682d311ea5b969c4e36.png) could not retrieve mirrorlost http://mirror/centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14:curl#7 - "Failed to connect to 2001:1b48:203::4:10: Network is unreachable"