# Calico 兩種網路模式 ## IPIP 模式 * Calico 的 IPIP 模式是一種網路覆蓋(overlay)模式,它利用 IP in IP 封裝技術在不同節點上的 Pod 之間建立隧道。IPIP 模式是 Calico 的默認網路模式,它具有輕量化、簡單、易於部署等優點。 ![image](https://hackmd.io/_uploads/S10KcotfA.png) * 運作原理 - 在 IPIP 模式下,Calico 會在每個節點上創建一個虛擬網路接口(tunl0)。當一個 Pod 需要與另一個位於不同節點上的 Pod 通信時,Calico 會將源 Pod 發出的 IP 報文封装入一個新的 IP 報文,並將其發送到 tunl0 接口。tunl0 接口會將這個新的 IP 報文發送到目標節點的 tunl0 接口。目標節點的 Calico 會解開封裝的 IP 報文,並將其遞送到目標 Pod。 - Pod-1 -> calixxx -> tunl0 -> ens33 <----> ens33 -> calixxx -> tunl0 -> Pod-2 - 根據 c1 主機中的路由規則中,使用 tunl0 設備將 ip 封包傳送到 c2 的主機 - tunl0 是一種 ip 隧道設備,當 ip 包進入該設備後,會被 Linux 中的 ipip 驅動將該 ip 封包直接封裝在 host 主機網路的 ip 封包中,然後發送到 c2 的 host 主機 - 進入 c2 的 host 主機後,此 ip 封包會由 ipip 驅動解封裝,取得原始的 ip 封包,然後依 c2 host 主機中路由規則傳送至 calixxx。 ## BGP 模式 * BGP 是一種動態路由協議,能夠直接使用 IP 路由來實現網絡流量的轉發,而不是依賴於 overlay 網絡。它利用 BGP 協議在不同的節點(Node)之間交換網路路由訊息,建立 Pod 到 Pod 的連接。BGP 模式是一種高度可擴展、可定制的網路模式,適用於大型、複雜的 Kubernetes 集群。 * BGP 模式對於 IPIP 模式的優點也並不是簡單的描述為"可以跨節點通訊", IPIP 模式也是可以跨節點通訊的,只要兩個節點能互相連通就可以。而 BGP 的優點是可以透過指定 BGP 的對端 Peer,一般是交換機,那麼只要能接入這個交換機的 host 或者 PC 都能透過路由的方式連通 calico 的其他節點上的容器。也就是說 BGP 的可擴展的網路拓撲更靈活。 ![image](https://hackmd.io/_uploads/r1zRJ3YzR.png) * Felix:calico 的核心元件,運行在每個節點上。主要的功能有介面管理、路由規則、ACL 規則和狀態報告,Felix 會監聽 ECTD 中心的存儲,從它獲取事件,比如說用戶在這台機器上加了一個 IP,或者是創建了一個容器等。使用者建立 pod 後,Felix 負責將網路卡、IP、MAC 都設定好,然後在核心的路由表裡面寫一條,註明這個 IP 應該到這張網路卡。同樣如果使用者制定了隔離策略,Felix 同樣會將該策略創建到 ACL 中,以實現隔離。 * BGP Client(BIRD):Calico 為每一台 Host 部署一個 BGP Client,它的作用是將 Felix 的路由資訊讀入內核,並透過 BGP 協定在叢集中分發。當 Felix 將路由插入到 Linux 核心 FIB 中時,BGP 客戶端將取得這些路由並將它們分發到部署中的其他節點。這可以確保在部署時有效地路由流量 ### 和 IPIP 模式對比 * BGP 網路相比較 IPIP 網絡,最大的不同之處就是沒有隧道設備 tunl0,pod 之間的流量直接從 host 主機通過 arp 下一跳到目的地宿主機,減少了 tunl0 環節。 ## 安裝 cli ``` $ curl -L https://github.com/projectcalico/calico/releases/download/v3.28.2/calicoctl-linux-amd64 -o calicoctl $ chmod +x ./calicoctl $ mv calicoctl /usr/local/bin/ ``` * Rancher 部屬叢集預設的模式是 vxlan ``` $ calicoctl get ippool -o yaml --allow-version-mismatch apiVersion: projectcalico.org/v3 items: - apiVersion: projectcalico.org/v3 kind: IPPool metadata: creationTimestamp: "2024-09-25T01:11:28Z" name: default-ipv4-ippool resourceVersion: "1384" uid: 36a35c5b-dff9-495b-a734-111943200787 spec: allowedUses: - Workload - Tunnel blockSize: 26 cidr: 10.42.0.0/16 ipipMode: Never natOutgoing: true nodeSelector: all() vxlanMode: Always kind: IPPoolList metadata: resourceVersion: "382826" ``` ``` $ calicoctl patch kubecontrollersconfiguration default --patch='{"spec": {"controllers": {"node": {"hostEndpoint": {"autoCreate": "Enabled"}}}}}' --allow-version-mismatch ``` ``` $ calicoctl get heps -owide --allow-version-mismatch NAME NODE INTERFACE IPS PROFILES demo-1-auto-hep demo-1 * 192.168.11.103,10.42.94.192 projectcalico-default-allow demo-2-auto-hep demo-2 * 192.168.11.135,10.42.86.64 projectcalico-default-allow demo-3-auto-hep demo-3 * 192.168.11.136,10.42.29.0 projectcalico-default-allow ``` ``` $ kubectl get FelixConfiguration default -oyaml ```