Calico 基本架構介紹

Project-Calico-logo

Calico 是一個純 L3 的 Datacenter 網路方案,跟 Kubernetes, OpenStack 都有非常好的整合,也是 Kubernetes 常用的 CNI 之一。本篇文章將會介紹 Calico 基本元件以及架構。

基本元件

Calico 由下列獨立的元件組成:

  • Felix,跑在每一台 endpoint 的 Calico Agent
  • Orchestrator plugin,將 Calico 整合至不同 orchestrator 的 code
  • etcd,用來儲存資料
  • BIRD,發布 routing 資訊的 BGP Agent
  • BGP Route Reflector,在比較大的網路環境需要 RR

接下來會一一介紹這些元件。

Felix

Felix 是跑在每一台提供 endpoint 主機上面的 daemon,在多數情況下是指那些運行 VM 或是 container 的主機。Felix 負責設定路由跟 ACL 等功能,基本上負責任和需要在主機上以提供網路連線相關的設定。

根據不同的平台,Felix 負責以下任務:

網路介面管理

Felix 會在 kernel 中設定一些網路介面(interface)相關的資訊讓 kernel 能夠正確的處理各個端點的網路。主要是確定主機端能夠以其 MAC address 回應各種 ARP request,並且啟用 IP forwarding 給 Felix 管理的網路介面。

另外 Felix 也會 monitor 新生成跟消失的網路介面,已確定能即時設定相關資訊。

路由設定

Felix 負責設定主機 Linux kernel FIB 到 endpoints 的路由表,這使得要到 endpoints 的封包能夠正常被 forward。

ACL 設定

Felix 也負責 Linux kernel 中相關的 ACL 設定。ACL 設定用來保證只有有效的流量可以在 endpoints 之間傳遞,無法繞過 Calico 相關的一些安全性措施。

狀態回報

最後,Felix 負責提供網路狀況相關的資料,回報在設定主機的錯誤跟問題。這些資料將會被寫入 etcd,讓維運人員跟其他元件能夠知道目前狀態。

Orchestrator Plugin

Orchestrator plugin 並非只有一種,而是根據不同的平台(Orchestrator)有不同的 plugin,例如 Kubernetes 有 Calico CNI,OpenStack 有 Calico Neutron ML2 mechanism driver。這些 plugin 讓使用者去透過這些平台去管理跟操作 Calico 網路。

Orchestrator plugin 負責以下任務:

API Translation

每個平台都有自己網路相關的 API,orchestrator plugin 最主要的工作就是將這些 API 翻譯成 Calico 相關的資料模型然後儲存到其儲存空間中。

回報 (Feedback)

如果需要,orchestrator plugin 會回報 Calico 網路的相關狀態給平台,例如 Felix 是否正常運行。

etcd

etcd 是一個分散式的 key-value store,Calico 使用其來進行元件的溝通和儲存空間 (datastore)。取決於平台的不同,etcd 可能作為主要的儲存空間或是一個獨立的輕量 mirror。

etcd 負責以下任務:

資料儲存 (Data storage)

etcd 能夠提供 Calico 一個分散式,具有一致性跟良好容錯的儲存空間。這能夠確保 Calico 網路能夠在一個 "known good" 的狀態下運作,並且能夠有允許部分主機異常。

溝通 (Communication)

etcd 也是各個元件溝通的橋樑。不同的元件會去持續關注 etcd 中的 keyspace 去確保能夠獲得所有更改的資訊,並且使元件在資料更改時能夠快速地去設定變更後的網路。

BGP Client (BIRD)

Calico 會在所有跑 Felix 的節點上部屬一個 BGP Client。BGP client 會讀取 Felix 在 kernel 中的設定並且將其 distribute 到整個資料中心中。

BGP Client 負責下列任務:

Route Distribution

當 Felix 把路由寫進 FIB 後,BGP client 會將這些資料 advertise 出去到跟期建立 BGP connection 的節點。這確保所有流量都能有效率的在部屬中被路由。

BGP route reflector (BIRD)

在比較大的部屬中,BGP 可能會因為需要維持一個 mesh topology 造成部屬的困難,因此在比較大的部屬中,Calico 會額外部屬 Route Reflector。

BGP Route Reflector 提供了一個集中的點讓所有 BGP client 連結,以避免其需要直接與所有其他節點對接。而在 Calico 中,BGP Route Reflector 通常也是使用 BIRD。

BGP Route Reflector 負責以下任務:

中心化的 Route Distribution

當 Calico 節點的 BGP client advertise FIB 中的路由到 Route Reflector,Route Reflector 會將其 advertise 到其他部屬中的節點。

總結

這篇當中介紹了各個 Calico 相關的元件以及其負責的任務。在下一篇會介紹一下 Calico 在 IP Interconnect Fabric 中的幾種架構。

Reference

https://docs.projectcalico.org/v3.7/reference/architecture/


Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.