Kubernetes網絡插件詳解 - Calico篇 - 概述
1、容器網絡及策略
Kubernetes本身并沒有自己實現容器網絡,而是借助CNI標準,通過插件化的方式來集成各種網絡插件,實現集群內部網絡相互通信。任何人都可以編寫CNI插件,只要實現CNI標準中定義的核心接口操作(ADD,將容器添加到網絡;DEL,從網絡中刪除一個容器;CHECK,檢查容器的網絡是否符合預期等)。CNI插件通常聚焦在容器到容器的網絡通信,Kubernetes構造的Services網絡服務仍然是由kube-proxy處理,通過主機的IPtables確定Service后端的Pod服務,通過CNI插件將網絡報文轉發到目標Pod,如下圖所示:
CNI的接口并不是指HTTP,gRPC這種接口,CNI接口是指對可執行程序的調用(exec)可執行程序,Kubernetes節點默認的CNI插件路徑為/opt/cni/bin。
CNI通過JSON格式的配置文件來描述網絡配置,當需要設置容器網絡時,由容器運行時負責執行CNI插件,并通過CNI插件的標準輸入(stdin)來傳遞配置文件信息,通過標準輸出(stdout)接收插件的執行結果。從網絡插件功能可以分為五類:
(一)Main插件,創建具體網絡設備(bridge:網橋設備,連接container和host;ipvlan:為容器增加ipvlan網卡;loopback:IO設備;macvlan:為容器創建一個MAC地址;ptp:創建一對Veth Pair;vlan:分配一個vlan設備;host-device:將已存在的設備移入容器內)。
(二)IPAM插件:負責分配IP地址(dhcp:容器向DHCP服務器發起請求,給Pod發放或回收IP地址;host-local:使用預先配置的IP地址段來進行分配;static:為容器分配一個靜態IPv4/IPv6地址,主要用于debug)。
(三)META插件:其他功能的插件(tuning:通過sysctl調整網絡設備參數;portmap:通過iptables配置端口映射;bandwidth:使用Token Bucket Filter來限流;sbr:為網卡設置source based routing;firewall:通過iptables給容器網絡的進出流量進行限制)。
(四)Windows插件:專門用于Windows平臺的CNI插件(win-bridge與win-overlay網絡插件)。
(五)第三方網絡插件:第三方開源的網絡插件眾多,每個組件都有各自的優點及適應的場景,難以形成統一的標準組件,常用有Flannel、Calico、Cilium、OVN網絡插件。
大部分的CNI插件功能設計上遵守功能職責單一原則,比如Bridge插件負責網橋的相關配置,Firewall插件負責防火墻相關配置,Portmap插件負責端口映射相關配置。因此,當網絡設置比較復雜時,通常通過調用多個插件來完成。CNI通過鏈式調(NetworkConfigList)用多個插件,將多個插件組合起來按順序調用,比如前面文章提到的Flannel網絡插件CNI插件配置POD網絡時的鏈式調用。
Kubernetes底層是通過Linux的Cgroup與Namesapce來實現底層基礎資源隔離,每個命名空間(namespace)都有自己網絡堆棧,包括接口、路由表、套接字和 IPTABLE 規則等。一個接口只能屬于一個網絡命名空間,這樣多個容器就需要多個接口,一般情況是通過虛擬化技術來實現硬件資源共享,通過將虛擬化設備連接到真實的物理設備上,具體分為三種實現:
(一)虛擬網橋(Virtual bridge):創建一個虛擬網卡對(veth pair),一端在容器內一頭端宿主機的root namespace內,并且使用Linux bridge(網橋)或者OpenvSwitch(OVS)來連接兩個不同namespace內的網卡對。這樣一來,容器內發出的網絡數據包,可以通過網橋進入宿主機網絡棧,而發往容器的網絡數據包也可以經過網橋進入容器。
(二)多路復用(Multiplexing):使用一個中間網絡設備,暴露多個虛擬網卡接口,容器網卡都可以接入這個中間設備,并通過mac地址/IP地址來區分packet應該轉發給具體的容器設備。
(三)硬件交換(Hardware switching):為每個Pod分配一個虛擬網卡,這樣一來Pod與Pod之間的連接關系就會變的非常清晰,因為近乎物理機之間的通信基礎。如今大多數網卡都支持SR-IOV功能,該功能將單一的物理網卡虛擬成多個VF接口,每個VF接口都有單獨的虛擬PCIe通道,這些虛擬的PCIe通道共用物理網卡的PCIe通道。
對于Kubernetes網絡,網絡策略也是非常重要的能力;網絡策略能力比較依賴CNI插件的具體實現,比如Flannel插件,根本不執行策略;但大多數插件都會強制執行策略,為Pod的入口流量和Pod的出口流量設置策略,Kubernetes網絡策略是屬于命名空間范圍的。
2、Calico容器網絡插件
Calico是Tigera開源,基于Apache 2.0協議的網絡與網絡安全解決方案,適用于容器、虛擬機、以及物理機等場景。Calico支持包含Kubernetes、OpenShift以及OpenStack等主流平臺。在Kubernetes云原生容器網絡方面,Calico完全遵循CNI的標準,Flannel的簡單成為初始用戶的首選,Calico則是以性能及靈活性成為另一個不錯的選擇。當前Flannel與Calico兩大插件占據容器網絡插件90%以上的份額。相比Flannel插件,Calico的功能更為全面,不僅提供主機和Pod之間的網絡連接,還涉及網絡安全和管理。從Calico 3.x版本開始,Calico默認的模式從BGP調整為IPIP,一種更加高效的Overlay模式。Calico特點如下:
一、高效的可視化管理:Calico提供完善的可視化管理,包括原生Linux eBPF管理、標準Linux 網絡管理、以及Windows HNS管理。Calico通過將基礎網絡、網絡策略和IP地址等功能抽象統一,提供簡單易用且操作一致的管理平面。
二、網絡安全策略:Calico提供豐富的網絡策略模型,可以輕松的實現網絡流量治理,同時結合內置的Wireguard加密功能,可以快速實現Pod間的數據傳輸。還有Calico策略引擎可以在主機網絡及服務網絡執行相同的策略模型,實現基礎設施與上層服務的網絡數據風險隔離。
三、高性能及可擴展性:Calico采用前沿的eBPF技術,以及深度調優操作系統內核網絡管道,以此來提高網絡性能。Calico支持網絡配置較多,大部分場景可以不使用Overlay,避免數據包封裝/解封的大開銷操作。同時Calico遵守云原生設計模式,底層都是采用標準的網絡協議,具備出色可擴展性。
四、大規模生產運行實踐:Calico有大規模生產環境運行實踐,包括SaaS提供商、金融服務公司和制造商;在公有云方面,包含Amazon EKS、Azure AKS、Google GKE 和 IBM IKS,都有集成開箱即用的Calico網絡安全能力。
3、Calico核心組件
Calico靈活的網絡模塊化架構,包括CNI網絡插件,CNI IPAM插件,網絡模式,網絡策略四個方面:
(一)CNI網絡插件:Calico CNI網絡插件通過一對虛擬以太網設備(vethpair),將Pod連接到主機網絡命名空間的三層路由上,避免了許多其他Kubernetes網絡解決方案中的二層網橋的性能開銷。
(二)CNI IPAM插件:Calico CNI IPAM插件從一個或多個可配置的IP地址范圍內為Pod分配IP地址,并根據需要為每個節點動態分配小塊IP。與其他CNI IPAM插件相比,Calico CNI IPAM的IP地址空間使用效率更高。
(三)網絡模式:Calico支持的網絡模式分為Overlay與Non-overlay兩種:
Overlay模式,Calico提供VXLAN或IP-in-IP網絡模式,包括限制跨子網模式(cross-subnet)。
Non-overlay模式,Calico提供在L2網絡或L3網絡之上運行的Non-overlay網絡。
(四)網絡策略:Calico的網絡策略執行引擎實現了Kubernetes網絡策略的全部功能,并且增加額外的擴展功能。
Calico最優先的網絡設置是使用BGP與物理網絡對等的Non-overlay網絡模式,實現Pod IP可在集群外部路由。如果無法將BGP對等連接到物理網絡,但集群位于獨立的L2網絡中,也可以運行Non-overlay模式,只是在集群中的節點之間對等BGP,應用外部缺少Pod IP的路由,無法在集群外路由。或者設置為Overlay模式下的VXLAN或IP-in-IP,并使用跨子網Overlay模式來優化L2子網內的性能。
?上圖是一個完整Calico網絡及策略架構圖,包含了必選與可選的所有組件,包含Calico API server、Felix、BIRD、confd、Dikastes、CNI plugin、Datastore plugin、IPAM plugin、kube-controllers、Typha、calicoctl:
Calico API server:支持通過kubectl管理Calico資源。
Felix:以守護進程的方式運行在集群的每個節點上,主要提供四個關鍵能力:接口管理(Interface management)、編程式路由(Route programming),編程式權限(ACL programming),狀態報告(State reporting)。
BIRD:從Felix獲取路由并分發給網絡上的BGP對端,用于主機間路由。與Felix一樣都是運行在集群的每個節點。主要提供兩個關鍵能力:路由分發(Route distribution)、路由映射配置(BGP route reflector configuration)
Confd:開源、輕量級的配置管理工具,存儲BGP配置和全局默認值,監聽數據變化動態生成BIRD配置文件,會觸發BIRD重新加載配置信息。
CNI plugin:為 Kubernetes集群提供Calico網絡能力。
IPAM plugin:是Calico CNI插件之一,使用Calico的IP池資源,來控制IP地址分配給集群內的Pod。
kube-controllers:Kubernetes的控制器,包含Policy controller、Namespace controller、Serviceaccount controller、Workloadendpoint controller、Node controller。
calicoctl:創建、讀取、更新和刪除Calico對象的命令行界面。
Datastore plugin:通過減少每個節點對數據存儲的影響來增加規模,是Calico CNI插件之一。
Typha:通過減少每個節點對數據存儲的影響來擴大規模。在數據存儲和Felix實例之間作為守護進程運行。
Dikastes:增強Istio服務網格的網絡策略,作為Istio Envoy的sidecar代理方式運行。
4、總結
Kubernetes容器網絡比較復雜,需要與底層基礎設施及上層業務來確定容器網絡方案,同時很多網絡插件又支持多種模式,需要大量的網絡的基礎知識支撐才能了解清楚。選擇合適的CNI插件,需要綜合考慮底層網絡網絡拓撲,結合應用需要的網絡功能,以及網絡路由協議的需求。Calico是比較成熟的容器網絡插件,功能上比較豐富,性能上也在不斷優化。所以將Calico網絡插件規劃成一系列文章,從網絡網絡基礎,Calico架構原理,到Calico實戰操作總共八篇,抽絲剝繭,將Calico網絡插件做深入的理解,從而徹底掌握容器網絡相關知識。
本文轉載自微信公眾號「巨子嘉」,可以通過以下二維碼關注。轉載本文請聯系巨子嘉公眾號。