容器云架構(gòu) | 了解 Kubernetes 網(wǎng)絡(luò)模型
Kubernetes 網(wǎng)絡(luò)使您能夠在 k8s 網(wǎng)絡(luò)內(nèi)配置通信。它基于扁平網(wǎng)絡(luò)結(jié)構(gòu),無需在主機和容器之間映射端口。
Kubernetes 網(wǎng)絡(luò)支持容器化組件之間的通信。這種網(wǎng)絡(luò)模型的主要優(yōu)點是不需要在主機和容器之間映射端口。然而,配置 Kubernetes 網(wǎng)絡(luò)模型并不是一件容易的事。在本文中,您將了解什么是 Kubernetes 網(wǎng)絡(luò),探索常見的實現(xiàn),并發(fā)現(xiàn)關(guān)鍵的 Kubernetes 網(wǎng)絡(luò)變化。
什么是 Kubernetes 網(wǎng)絡(luò)?
Kubernetes (k8s) 是一個開源容器編排平臺。您可以使用它來自動化本地或云中容器的部署、更新和操作。使用 k8s,您可以跨多個基礎(chǔ)架構(gòu)管理容器化工作負載,而無需擔心操作系統(tǒng)或環(huán)境。
Kubernetes 網(wǎng)絡(luò)是 k8s 用來實現(xiàn)其組件之間通信的模型。它基于扁平的網(wǎng)絡(luò)結(jié)構(gòu),不需要你在主機和容器之間映射端口。盡管 Kubernetes 網(wǎng)絡(luò)設(shè)置起來可能是一個挑戰(zhàn),但它是任何 k8s 操作的重要組成部分,并且您需要了解它才能成功部署。
常見的 Kubernetes 網(wǎng)絡(luò)實現(xiàn)
使用 Kubernetes 時,平臺會強制實施需要第三方工具來實現(xiàn)的網(wǎng)絡(luò)模型。您可以選擇許多第三方工具,但以下三個是流行的選項。
- Flannel——一種為 k8s 設(shè)計的開源網(wǎng)絡(luò)結(jié)構(gòu)。Flannel 通過每個主機上的二進制代理運行。該代理將子網(wǎng)租用分配給主機并使用 etcd 來存儲配置數(shù)據(jù)。
- Project Calico——一個開源網(wǎng)絡(luò)供應(yīng)商和政策引擎。Calico 使您能夠創(chuàng)建一個可擴展的網(wǎng)絡(luò)解決方案來連接 k8s pod。它還使您能夠在主機網(wǎng)絡(luò)或服務(wù)網(wǎng)格層上實施安全策略。
- Weave Net — 一種專有網(wǎng)絡(luò)工具包,可用于創(chuàng)建虛擬網(wǎng)絡(luò)。Weave Net 包括彈性、可擴展性、安全性、多播網(wǎng)絡(luò)和服務(wù)發(fā)現(xiàn)等功能。它基于去中心化架構(gòu),不需要任何外部配置服務(wù)或存儲。
Kubernetes 網(wǎng)絡(luò)變化
在標準的 Kubernetes 部署中,您應(yīng)該注意多種網(wǎng)絡(luò)變化。以下是需要了解的最常見的網(wǎng)絡(luò)情況。
容器到容器網(wǎng)絡(luò)
網(wǎng)絡(luò)的高級視圖描述了直接與以太網(wǎng)設(shè)備通信的設(shè)備或虛擬機。然而,實際上(至少對于 Linux),您機器上的每個進程都在網(wǎng)絡(luò)命名空間內(nèi)進行通信。
這個命名空間創(chuàng)建了一個邏輯網(wǎng)絡(luò)堆棧,它有自己的網(wǎng)絡(luò)設(shè)備、防火墻規(guī)則和路由。當您運行一個進程時,它默認分配給您的根網(wǎng)絡(luò)命名空間。這為進程提供了外部訪問。
在 Kubernetes 中,您的容器被分組為 pod,每個 pod 都有一個共享的命名空間。在這個 pod 中,所有容器都具有相同的端口和 IP 地址以及端口空間。為了通信,Pod 中的容器可以使用 localhost,因為它們都在同一個命名空間中運行。如果不同 Pod 中的容器需要通信,則您正在使用下面描述的 Pod 到 Pod 網(wǎng)絡(luò)過程。
Pod 到 Pod 網(wǎng)絡(luò)
Pod 到 Pod 網(wǎng)絡(luò)可以發(fā)生在同一節(jié)點內(nèi)或跨節(jié)點的 Pod 中。您的每個節(jié)點都有一個無類域間路由 (CIDR) 塊。該塊是分配給該節(jié)點內(nèi)的 Pod 的一組已定義的唯一 IP 地址。這確保了每個 pod 都被提供了一個唯一的 IP,而不管它在哪個節(jié)點。
當 Pod 需要通信時,會使用虛擬以太網(wǎng)設(shè)備 (VED) 或 veth 對來連接 Pod。Veth 對是分布在命名空間中的耦合網(wǎng)絡(luò)接口。一對中的一個分配給根命名空間,另一個分配給 pod 命名空間。然后,VED 用作兩個命名空間之間的中介連接。
Pod 到服務(wù)網(wǎng)絡(luò)
Kubernetes 旨在允許根據(jù)需要動態(tài)替換 pod。這意味著 pod IP 地址不是持久的,除非采取特殊的預(yù)防措施,例如有狀態(tài)的應(yīng)用程序。為了解決這個問題并確保保持與 Pod 之間的通信,Kubernetes 使用了服務(wù)。
Kubernetes 服務(wù)管理 pod 狀態(tài)并使您能夠隨時間跟蹤 pod IP 地址。這些服務(wù)通過將單個虛擬 IP(集群 IP)分配給一組 pod IP 來抽象 pod 地址。然后,發(fā)送到虛擬 IP 的任何流量都會分發(fā)到相關(guān)聯(lián)的 pod。
此服務(wù) IP 允許根據(jù)需要創(chuàng)建和銷毀 pod,而不會影響整體通信。它還使 Kubernetes 服務(wù)能夠充當集群內(nèi)負載均衡器,根據(jù)需要在關(guān)聯(lián)的 pod 之間分配流量。
互聯(lián)網(wǎng)到服務(wù)網(wǎng)絡(luò)
大多數(shù)部署所需的最終網(wǎng)絡(luò)情況是在 Internet 和服務(wù)之間。無論您是將 Kubernetes 用于內(nèi)部還是外部應(yīng)用程序,您通常都需要 Internet 連接。這種連接使用戶能夠訪問您的服務(wù)和分布式團隊進行協(xié)作。
在設(shè)置外部訪問時,您需要使用兩種技術(shù)——出口和入口。您可以使用白名單或黑名單來設(shè)置這些策略,以控制進出網(wǎng)絡(luò)的流量。
- Egress(出口):出口是將流量從您的節(jié)點路由到外部連接的過程。它通常通過連接到您的虛擬私有云 (VPC) 的 Internet 網(wǎng)關(guān)完成。此網(wǎng)關(guān)使用網(wǎng)絡(luò)地址轉(zhuǎn)換 (NAT) 在您的用戶和您的節(jié)點所在的機器之間映射 IP。但是,它無法映射到您節(jié)點上的各個 Pod。對于這一步,Kubernetes 使用 IP 表和集群 IP 來完成通信。
- Ingress:Ingress 是 Egress 的相反過程,涉及從外部客戶端到您的 Kubernetes 服務(wù)的通信。它作為一組規(guī)則運行,定義允許哪些連接以及阻止哪些連接與您的服務(wù)進行通信。
結(jié)論
Kubernetes 網(wǎng)絡(luò)使您能夠在 k8s 網(wǎng)絡(luò)內(nèi)配置通信。它基于扁平網(wǎng)絡(luò)結(jié)構(gòu),無需在主機和容器之間映射端口。但是,要強制實施此網(wǎng)絡(luò)模型,您需要使用第三方工具(開源或付費的),例如 Flannel、Project Calico 和 Weave Net。
此外,在配置 Kubernetes 網(wǎng)絡(luò)時,您需要考慮某些網(wǎng)絡(luò)方面,這在傳統(tǒng)網(wǎng)絡(luò)中是不會遇到的。其中包括容器到容器網(wǎng)絡(luò)、Pod 到 Pod 網(wǎng)絡(luò)、Pod 到服務(wù)網(wǎng)絡(luò)和 Internet 到服務(wù)網(wǎng)絡(luò)。請務(wù)必妥善規(guī)劃您的網(wǎng)絡(luò),因為錯誤配置可能會導(dǎo)致漏洞。