組件分享之后端組件——基于Golang實(shí)現(xiàn)的用于在應(yīng)用程序容器或進(jìn)程等應(yīng)用程序工作負(fù)載之間提供并透明地確保網(wǎng)絡(luò)連接和負(fù)載平衡組件cilium
背景
近期正在探索前端、后端、系統(tǒng)端各類常用組件與工具,對(duì)其一些常見的組件進(jìn)行再次整理一下,形成標(biāo)準(zhǔn)化組件專題,后續(xù)該專題將包含各類語言中的一些常用組件。歡迎大家進(jìn)行持續(xù)關(guān)注。
組件基本信息
- 組件:cilium
- 開源協(xié)議:Apache-2.0 license
- 官網(wǎng):www.cilium.io
內(nèi)容
本節(jié)我們分享一個(gè)基于Golang實(shí)現(xiàn)的用于在應(yīng)用程序容器或進(jìn)程等應(yīng)用程序工作負(fù)載之間提供并透明地確保網(wǎng)絡(luò)連接和負(fù)載平衡組件cilium,Cilium 在第 3/4 層運(yùn)行以提供傳統(tǒng)的網(wǎng)絡(luò)和安全服務(wù),并在第 7 層運(yùn)行以保護(hù)和保護(hù)現(xiàn)代應(yīng)用程序協(xié)議(如 HTTP、gRPC 和 Kafka)的使用。Cilium 被集成到 Kubernetes 等常見的編排框架中。
Cilium 的基礎(chǔ)是基于ebpf的新 Linux 內(nèi)核技術(shù)實(shí)現(xiàn)。它支持在各種集成點(diǎn)(例如:網(wǎng)絡(luò) IO、應(yīng)用程序套接字和跟蹤點(diǎn))將 eBPF 字節(jié)碼動(dòng)態(tài)插入到 Linux 內(nèi)核中,以實(shí)現(xiàn)安全、網(wǎng)絡(luò)和可見性邏輯。eBPF 高效且靈活。要了解有關(guān) eBPF 的更多信息,請(qǐng)?jiān)L問eBPF.io。
功能概述
透明地保護(hù)和保護(hù) API
能夠保護(hù)現(xiàn)代應(yīng)用程序協(xié)議,例如 REST/HTTP、gRPC 和 Kafka。傳統(tǒng)防火墻在第 3 層和第 4 層運(yùn)行。在特定端口上運(yùn)行的協(xié)議要么完全受信任,要么完全被阻止。Cilium 提供了過濾單個(gè)應(yīng)用程序協(xié)議請(qǐng)求的能力,例如:
GET
允許所有帶有 method和 path的 HTTP 請(qǐng)求/public/.*
。拒絕所有其他請(qǐng)求。- 允許
service1
在 Kafka 主題上生產(chǎn)topic1
并service2
在topic1
. 拒絕所有其他 Kafka 消息。- 要求 HTTP 標(biāo)頭
X-Token: [0-9]+
出現(xiàn)在所有 REST 調(diào)用中。請(qǐng)參閱我們文檔中的第 7 層策略部分,以獲取支持的協(xié)議的最新列表以及有關(guān)如何使用它的示例。
基于身份的安全服務(wù)到服務(wù)通信
現(xiàn)代分布式應(yīng)用程序依賴于應(yīng)用程序容器等技術(shù)來促進(jìn)部署的敏捷性和按需擴(kuò)展。這導(dǎo)致在短時(shí)間內(nèi)啟動(dòng)大量應(yīng)用程序容器。典型的容器防火墻通過過濾源 IP 地址和目標(biāo)端口來保護(hù)工作負(fù)載。這個(gè)概念要求每當(dāng)容器在集群中的任何地方啟動(dòng)時(shí),所有服務(wù)器上的防火墻都可以被操作。
為了避免這種限制規(guī)模的情況,Cilium 將安全身份分配給共享相同安全策略的應(yīng)用程序容器組。然后,該身份與應(yīng)用程序容器發(fā)出的所有網(wǎng)絡(luò)數(shù)據(jù)包相關(guān)聯(lián),從而允許在接收節(jié)點(diǎn)驗(yàn)證身份。使用鍵值存儲(chǔ)執(zhí)行安全身份管理。
安全訪問外部服務(wù)
基于標(biāo)簽的安全性是集群內(nèi)部訪問控制的首選工具。為了保護(hù)對(duì)外部服務(wù)的訪問,支持傳統(tǒng)的基于 CIDR 的入口和出口安全策略。這允許限制對(duì)應(yīng)用程序容器的訪問和來自特定 IP 范圍的訪問。
簡單的網(wǎng)絡(luò)
一個(gè)能夠跨越多個(gè)集群的簡單平面第 3 層網(wǎng)絡(luò)連接所有應(yīng)用程序容器。通過使用主機(jī)范圍分配器,IP 分配保持簡單。這意味著每個(gè)主機(jī)都可以分配 IP,而無需主機(jī)之間的任何協(xié)調(diào)。
支持以下多節(jié)點(diǎn)網(wǎng)絡(luò)模型:
覆蓋:跨越所有主機(jī)的基于封裝的虛擬網(wǎng)絡(luò)。目前 VXLAN 和 Geneve 已內(nèi)置,但 Linux 支持的所有封裝格式都可以啟用。
何時(shí)使用此模式:此模式對(duì)基礎(chǔ)架構(gòu)和集成的要求最低。它幾乎適用于任何網(wǎng)絡(luò)基礎(chǔ)設(shè)施,因?yàn)槲ㄒ坏囊笫峭ǔR呀?jīng)給出的主機(jī)之間的 IP 連接。
本機(jī)路由:使用 Linux 主機(jī)的常規(guī)路由表。網(wǎng)絡(luò)需要能夠路由應(yīng)用程序容器的 IP 地址。
何時(shí)使用此模式:此模式適用于高級(jí)用戶,需要對(duì)底層網(wǎng)絡(luò)基礎(chǔ)設(shè)施有所了解。此模式適用于:
- 本機(jī) IPv6 網(wǎng)絡(luò)
- 與云網(wǎng)絡(luò)路由器結(jié)合使用
- 如果您已經(jīng)在運(yùn)行路由守護(hù)程序
負(fù)載均衡
Cilium 為應(yīng)用程序容器和外部服務(wù)之間的流量實(shí)現(xiàn)分布式負(fù)載平衡,并且能夠完全替換 kube-proxy 等組件。負(fù)載平衡是在 eBPF 中使用高效的哈希表實(shí)現(xiàn)的,允許幾乎無限的規(guī)模。
對(duì)于南北向類型的負(fù)載均衡,Cilium 的 eBPF 實(shí)現(xiàn)針對(duì)最大性能進(jìn)行了優(yōu)化,可以附加到 XDP(eXpress 數(shù)據(jù)路徑),并且支持直接服務(wù)器返回 (DSR) 以及在不執(zhí)行負(fù)載均衡操作的情況下支持 Maglev 一致性哈希在源主機(jī)上。
對(duì)于東西向類型的負(fù)載平衡,Cilium 在 Linux 內(nèi)核的套接字層(例如在 TCP 連接時(shí))執(zhí)行高效的服務(wù)到后端轉(zhuǎn)換,這樣可以避免較低層中的每個(gè)數(shù)據(jù)包 NAT 操作開銷。
帶寬管理
Cilium 通過高效的基于 EDT(最早出發(fā)時(shí)間)的速率限制和 eBPF 來實(shí)現(xiàn)帶寬管理,用于出口節(jié)點(diǎn)的容器流量。例如,與帶寬 CNI 插件中使用的 HTB(層次令牌桶)或 TBF(令牌桶過濾器)等傳統(tǒng)方法相比,這可以顯著減少應(yīng)用程序的傳輸尾延遲,并避免在多隊(duì)列 NIC 下鎖定。
監(jiān)控和故障排除
獲得可見性和解決問題的能力是任何分布式系統(tǒng)運(yùn)行的基礎(chǔ)。雖然我們學(xué)會(huì)了喜歡這樣的工具
tcpdump
,ping
并且雖然它們總能在我們心中找到一個(gè)特殊的位置,但我們努力為故障排除提供更好的工具。這包括提供以下工具的工具:
- 使用元數(shù)據(jù)進(jìn)行事件監(jiān)控:當(dāng)數(shù)據(jù)包被丟棄時(shí),該工具不僅會(huì)報(bào)告數(shù)據(jù)包的源 IP 和目標(biāo) IP,還會(huì)提供發(fā)送方和接收方的完整標(biāo)簽信息以及許多其他信息。
- 通過 Prometheus 導(dǎo)出指標(biāo):通過 Prometheus 導(dǎo)出關(guān)鍵指標(biāo),以便與您現(xiàn)有的儀表板集成。
- Hubble:專為 Cilium 編寫的可觀測(cè)平臺(tái)。它提供基于流日志的服務(wù)依賴關(guān)系圖、操作監(jiān)控和警報(bào)以及應(yīng)用程序和安全可見性。
更多詳細(xì)文檔可以參考官方提供的README
本文聲明:
知識(shí)共享許可協(xié)議
本作品由 cn華少 采用 知識(shí)共享署名-非商業(yè)性使用 4.0 國際許可協(xié)議 進(jìn)行許可。