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