白話Kubernetes網絡
1 Kubernetes 網絡介紹
Kubernetes 網絡是一個系統,能夠使不同集群內外的組件相互通信。這個系統會處理許多情況,其中重要的情況包括 Pod 之間的通信、Service 的通信以及集群如何處理來自外部的流量。
由于 Kubernetes 是分布式系統,因此它的網絡平面跨越了集群的所有物理節點。Kubernetes 使用一個虛擬重疊網絡,為集群資源提供平面的連接結構。這個虛擬重疊網絡使得集群內部的資源能夠相互連接,不需要考慮它們所處的物理節點。
以下是一個 Kubernetes 網絡示意圖:
圖片
Kubernetes 網絡會自動分配 IP 地址、設置 DNS 名稱和連接端口到開發者的 Pod 和 Service。通常情況下,在使用 Kubernetes 時,開發人員無需在網絡或節點主機上手動處理這些任務。
Kubernetes 網絡模型會為每個 Pod 分配一個在集群內唯一的 IP 地址。這樣,Pod 可以使用它們的 IP 地址相互通信,不用進行額外的設置,例如網絡地址轉換(NAT)。
這個基本設置通過 Kubernetes 的 Service 模型得到了改進。Service 模型允許將流量導向一組 Pod 中的任意一個,并且還包括網絡控制方式,例如網絡策略。網絡策略可以防止 Pod 之間的不必要的通信,從而提高網絡的安全性和可靠性。
2 傳統虛擬機與 Kubernetes 網絡的區別
Kubernetes 網絡使用了已知的網絡概念,并將其應用到 Kubernetes 集群環境中。與傳統的物理設備和虛擬機(VM)網絡模型相比,Kubernetes 網絡更簡單、更均勻、自動化程度更高。
在過去,開發人員需要手動設置新端點,包括配置 IP 地址、在防火墻中打開端口以及設置 DNS 路由。但是,在使用 Kubernetes 時,開發者不再需要執行這些操作,Kubernetes 會自動為開發者的集群任務執行所有這些操作。
開發人員和運營人員不需要了解網絡設置的細節,即可部署資源并使其對他人可用。這使得設置、維護和保持安全要求的最新狀態變得更加容易,因為所有管理都可以在 Kubernetes 本身中執行。
3 Docker 與 Kubernetes 網絡的區別
由于已解釋了虛擬機網絡和 Kubernetes 網絡之間的區別,這里需要提到 Docker 網絡。
Kubernetes 的網絡設計非常簡單、平面,很適合分布式系統。在這個設計中,每個 Pod 都可以與其他任何 Pod 通信,即使它們位于不同的物理機器(節點)上。
Docker 主要用于在單個機器上運行容器,因此對網絡的處理方式有所不同。默認情況下,Docker 將所有容器連接到一個稱為橋接的網絡中,該網絡將它們連接到開發者的計算機。但是,開發者也可以為自己的容器設置各種類型的網絡。這些網絡包括一個橋接網絡(連接相同計算機上的容器)、一個主機網絡(允許容器直接使用您計算機的網絡)以及一個重疊網絡(創建多臺機器上的網絡,這對于 Docker Swarm,用于管理多個容器的工具,是必需的)。
Docker 容器在同一個網絡中時,它們可以相互通信。每個容器都有自己的 IP 地址和 DNS 名稱,僅在網絡內部使用。這樣其他網絡中的容器就可以連接到它們。但是,Docker 不會自動設置從開發者的計算機到容器的連接(端口映射),開發者需要在啟動容器時手動設置這些連接。
Docker 和 Kubernetes 在網絡方面都有一些相似之處,但它們各自有自己的使用場景和網絡設計。Docker 主要用于在單臺機器上運行容器,因此它的網絡設計更簡單,使用橋接模式來連接容器。而 Kubernetes 則是為分布式系統設計的,因此它需要一個更復雜的網絡設計來連接系統的不同部分,即使它們不在同一臺機器上,也能夠相互通信。因此,Kubernetes 使用了重疊網絡來實現這一點。
Docker 和 Kubernetes 在容器隔離方面有所不同。在 Docker 中,可以通過將容器放在不同的網絡中來阻止它們相互通信。而在 Kubernetes 中,所有 Pod 都會自動加入到同一個重疊網絡中。因此,為了控制哪些 Pod 可以相互通信,Kubernetes 使用網絡策略來管理網絡中的流量。這種方式可以更細致地控制 Pod 之間的通信,提高了網絡的安全性和可控性。
4 Kubernetes 網絡架構
Kubernetes 網絡構建于一個簡單、平面的結構之上,其主要特點如下:
- 每個 Pod 都會獲得自己的 IP 地址。
- 節點具有一個主網絡空間(根網絡命名空間),它連接 Pod 的網絡接口。這意味著無論哪個節點上的 Pod,都可以使用 IP 地址相互通信。
- 不需要進行網絡地址轉換(NAT)。
- 每個 Pod 都有自己的網絡空間和接口。與 Pod 的所有通信都通過其特定的網絡接口進行。
- 整個集群的網絡層在節點級別連接網絡空間。這確保在不同節點之間正確移動流量。
- 通常,不需要手動鏈接 Pod 端口到節點。但是,如果有必要,可以通過為 Pod 分配特定端口(hostPort)來實現此目的。
這些原則使 Kubernetes 網絡具有可預測和一致的特性,無論是對使用集群的用戶還是對管理員都是如此。Kubernetes 設置的系統確保所有 Pod 都可以可靠連接到網絡,無需手動設置。
5 分配 IP 地址給 Pod
Kubernetes 使用一種稱為無類域間路由(CIDR)的方法為 Pod 分配 IP 地址。這個系統決定了 pod 可以使用的 IP 地址范圍。每個 pod 都會從該范圍內獲得一個唯一的 IP 地址,這個 IP 地址是特定于開發者的集群的。當設置新的集群網絡時,開發者需要選擇一個可用的 IP 地址范圍(CIDR 范圍)。
此外,許多向 Kubernetes 添加網絡功能的工具(網絡插件)可以讓開發人員更細致地管理 IP 地址。使用這些工具,可以選擇特定的 IP 地址、IP 地址的一部分或它們的組。這在處理更復雜的網絡設置時非常有用。
6 Kubernetes 集群中的 DNS
Kubernetes 集群包括內置的 DNS 支持。CoreDNS 是最受歡迎的 Kubernetes DNS 提供商之一,并且在許多 Kubernetes 分發版中默認啟用。
Kubernetes 會為 Pod 和 Service 自動分配 DNS 名稱,格式如下:
- Pod — pod-ip-address.pod-namespace-name.pod.cluster-domain.example(例如 10.244.0.1.my-app.svc.cluster.local)
- Service — service-name.service-namespace-name.svc.cluster-domain.example(例如 database.my-app.svc.cluster.local)
運行在 Pod 中的應用程序通常應該使用它們的 DNS 名稱配置與 Service 通信。名稱是可預測的,而 Service 的 IP 地址會隨著 Service 被刪除和替換而改變。
7 使用網絡策略的 Kubernetes 網絡隔離
在 Kubernetes 中,默認情況下所有的 Pod 都可以相互通信。這在某些情況下可能會帶來安全風險,尤其是在用于多個分離應用程序、環境、團隊或客戶的集群中。需要采取適當的措施來控制 Pod 之間的網絡通信以保護集群的安全性,。
為了管理這一點,Kubernetes 有個稱為網絡策略的東西。這些是開發人員可以設置的規則,用于控制 Pod 如何發送和接收流量(入口和出口)。例如,可以創建一個策略,該策略會停止所有流量到標記為 app-component:database 的 Pod,除非流量來自標記為 app-component:api 的 Pod。這是控制哪些 Pod 可以相互通信的方式,以提高安全性。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: database-network-policy
namespace: default
spec:
podSelector:
matchLabels:
app-component: database
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app-component: api
在 Kubernetes 中,最好為所有 Pod 創建網絡策略。這些策略有助于保護集群,防止可能受損的 Pod 向其他附近的 Pod 發送有害流量。這為開發人員的 Kubernetes 環境增加了一層額外的安全性。