Kubernetes 容器的網路概念

已完成

Kubernetes 是可移植且可擴充的開放原始碼平台,用於將容器化工作負載的部署、調整及管理自動化。 作為協調流程平台,Kubernetes 提供了如平台即服務 (PaaS) 和基礎結構即服務 (IaaS) 供應項目的易使用性和彈性。

重要

您必須了解虛擬網路、負載平衡器、反向 Proxy 等概念,才能設定 Kubernetes 網路功能。

叢集和節點

Kubernetes 是以叢集為基礎。 它沒有使用單一虛擬機器,而是使用數個稱為節點的虛擬機器,以一個共同的方式運作。 Kubernetes 會使用由主要節點及一或多個背景工作角色節點組成的叢集結構。 主要節點會執行控制平面元件,例如 API 伺服器、排程器和控制器管理員。 背景工作角色節點會執行資料平面元件,例如 kubeletkube-proxy 和容器執行階段。

Diagram showing how Kubernetes uses a cluster architecture that consists of a primary node and one or more worker nodes.

Kube-proxy 元件負責本機叢集網路,且在每個節點上執行。 其確保每個節點都具備唯一的 IP 位址。 其也會實作規則,使用 IP 資料表與 IP 虛擬伺服器來處理流量的路由與負載平衡。 此 Proxy 本身不提供 DNS 服務。 建議使用以 CoreDNS 為基礎的 DNS 叢集附加元件,這是預設安裝的附加元件。

Pod

Kubernetes Pod 會將容器和應用程式分組成邏輯結構。 這些 Pod 沒有智慧,且由一或多個應用程式容器所組成。 其每一個都有一個 IP 位址、網路規則和公開的連接埠。

Diagram showing how a Kubernetes pod groups containers and applications into a logical structure.

Kubernetes 部署是 Pod 的演進。 部署會將 Pod 包裝成智慧型物件,以供其進行擴增。您可以輕鬆複製並調整應用程式以支援更多負載,而不需要設定複雜的網路規則。

抽象層資源

Kubernetes 提供虛擬網路抽象層,以允許存取應用程式或讓應用程式元件彼此通訊。 Kubernetes 節點會連線至虛擬網路,可提供 Pod 的輸入和輸出連線能力。 Kube-proxy 元件會在每個節點上執行,並提供這些網路功能。

在 Kubernetes 中:

  • 服務會以邏輯方式分組 Pod,以允許透過 IP 位址或 DNS 名稱,直接存取特定連接埠。
  • ServiceTypes 可讓您指定想要的服務類型。
  • 您可以使用負載平衡器散發流量。
  • 您也可以使用輸入控制器,獲得 第 7 層的應用程式流量路由。
  • 您可以控制叢集節點的傳出 (輸出) 流量。
  • Pod 網路流量的安全性和篩選可以透過網路原則達成。

Kubernetes 中的網路

Kubernetes 具有如何實作叢集網路的特定需求。 您的組態選擇會影響如何在叢集網路上公開應用程式的選項,以及如何儲存資料。 為了簡化通訊,Kubernetes 會預期您以符合下列條件的方式設定網路功能:

  • Pod 彼此之間不用網路位址轉譯 (NAT) 即可跨節點通訊。
  • 節點和 Pod 可以彼此通訊,而不需要 NAT。
  • 節點上的代理程式可與所有節點和 Pod 通訊。

容器的設定和容器內資料不會在執行之間持續。 在刪除容器之後,除非設定使用磁碟區,否則便會遺失所有資訊。 這同樣適用於容器的網路設定和任何指派給容器的 IP 位址。

部署是 Pod 的邏輯群組。 系統不會將其視為實體工作負載,也不會為其指派 IP 位址。 每個 Pod 都會自動指派 IP 位址,當 Pod 終結時,就會遺失此位址。 這種行為會讓手動網路設定策略變得相當複雜。

適用於 Windows 容器的 Kubernetes 網路選項

當您使用 Windows 容器部署 Kubernetes 時,您有兩個網路選項:服務輸入控制器。 若要使用這些選項,Windows 相依於容器網路介面 (CNI) 外掛程式。

為簡化應用程式工作負載的網路設定,Kubernetes 會使用服務以邏輯方式將 Pod 分為一組,並提供網路連線。 服務會作為 Pod 群組的進入點,並提供靜態 IP 位址。 流量會抵達群組的服務,並以迴圈配置資源模式散發至 Pod。 由於 Pod 的 IP 位址隨著時間變更,服務會追蹤變更以確保正確的網路流量流向 Pod。

在 Kubernetes 上執行的容器化應用程式必須透過網際網路傳送和接收資料。 Kubernetes 透過輸入和輸出元件支援此通訊。 輸入控制器會指定哪些流量和來源可以連線至您的服務。 輸出控制器可讓您透過網際網路閘道將應用程式連線至外部實體。

CNI 外掛程式可讓 Kubernetes 針對容器網路使用不同的網路介面。 外掛程式會將 Pod 連線至網路,並配置 Pod IP 位址。 它們會與 Windows 主機網路服務 (HNS) 和主機計算服務 (HCS) 進行互動,以建立和管理 Windows 容器的網路資源。 外掛程式的一些範例包括 Calico、Flannel 和 Azure CNI。

Kubernetes ServiceTypes

若要設定所需的服務,您可以指定下列其中一個 Kubernetes ServiceTypes

  • ClusterIP 會建立內部 IP 位址,以在叢集內使用。 這項服務非常適合支援叢集內其他工作負載的內部專用應用程式。 如果您未明確指定服務的類型,這便是所使用的預設值。

Diagram showing how ClusterIP creates an internal IP address for use within the cluster.

  • NodePort - 在基礎節點上建立連接埠對應,以便直接透過節點 IP 位址和連接埠存取應用程式。

Diagram showing how NodePort creates a port mapping on the underlying node that allows the application to be accessed directly with the node IP address and port.

  • LoadBalancer - 建立負載平衡器資源、設定外部 IP 位址,並將要求的 Pod 連線至負載平衡器後端集區。 若要允許客戶流量觸達應用程式,可對所需的連接埠建立負載平衡規則。

Diagram showing how LoadBalancer creates a load balancer resource, configures an external IP address, and connects the requested pods to the load balancer backend pool.

針對輸入流量的 HTTP/S 負載平衡,另一個選項是使用輸入控制器。

  • ExternalName - 建立特定的 DNS 項目,以讓應用程式存取更簡單。

Kubernetes 輸入

Kubernetes 輸入元件會向叢集內部的服務公開來自叢集外部的 HTTP 和 HTTPS 流量的路由。 您會使用「輸入規則」來定義輸入路由。 若沒有定義這些路由,Kubernetes 叢集會拒絕所有傳入流量。

Diagram showing how the Kubernetes ingress component exposes routes for HTTP and HTTPS traffic from outside a cluster to services inside the cluster.

輸入控制器

輸入控制器是一個軟體,可為 Kubernetes 服務提供可設定的流量路由。 Kubernetes 輸入資源可用來設定個別 Kubernetes 服務的輸入規則和路由。 透過使用輸入控制器和輸入規則,您可以單一 IP 位址將流量路由傳送至 Kubernetes 叢集中的多個服務。 在環境中部署控制器之後,您就可以建立並部署輸入資訊清單。 Kubernetes 會使用輸入控制器來管理叢集中的輸入設定,並提供數個功能。

輸入規則

輸入規則會定義流量的來源,以及要在叢集內導向的位置。 您可在輸入部署資訊清單檔中定義輸入規則。 這些規則會在資訊清單檔的規則索引鍵中定義。 每一項規則都是描述規則的一組值。

輸入註釋

註釋可供您針對工作負載附加非識別的中繼資料,例如輸入設定。 您可以將註釋視為定義資源特定設定的內部標籤。 例如,您可以使用支援名稱重寫或承載限制的特定輸入控制器。

網路原則

Kubernetes 提供網路原則功能來控制 Pod 之間的流量。 您可以根據指派的標籤、命名空間和流量連接埠的設定來允許或拒絕流量。 網路原則提供雲端原生方法,非常適合用來控制 Kubernetes Pod 之間的流量。