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