Azure Kubernetes Service (AKS) 中應用程式的網路概念

在應用程式開發的容器型微服務方法中,應用程式元件搭配運作以處理其工作。 Kubernetes 提供各種資源以啟用這類合作:

  • 您可以在內部或外部連接和公開應用程式。
  • 您可以對應用程式載入平衡,以建置具有高可用性的應用程式。
  • 您可以限制進入 Pod 和節點或其間的網路流量,以提升安全性。
  • 針對較複雜的應用程式,您可以設定終止 SSL/TLS 的輸入流量或多個元件的路由。

本文將介紹為 AKS 中的應用程式提供網路功能的核心概念:

Kubernetes 網路基本概念

Kubernetes 採用虛擬網路層來管理應用程式或其元件內和其間的存取:

  • Kubernetes 節點和虛擬網路:Kubernetes 節點會連線到虛擬網路。 此設定可讓 Pod (Kubernetes 中的基本部署單位) 同時具有輸入和輸出連線能力。

  • Kube-proxy 元件:kube-proxy 會在每個節點上執行,並負責提供必要的網路功能。

關於特定的 Kubernetes 功能:

  • 負載平衡器:您可以使用負載平衡器,將網路流量平均分散到各種資源。
  • 輸入控制器:這些有助於第 7 層路由,這對於引導應用程式流量至關重要。
  • 輸出流量控制:Kubernetes 可讓您管理和控制來自叢集節點的輸出流量。
  • 網路原則:這些原則會啟用安全性措施,並篩選 Pod 中的網路流量。

在 Azure 平台的內容中:

  • Azure 會簡化 AKS (Azure Kubernetes Service) 叢集的虛擬網路。
  • 在 Azure 上建立 Kubernetes 負載平衡器會同時設定對應的 Azure 負載平衡器資源。
  • 當您對 Pod 開放網路連接埠時,Azure 會自動設定必要的網路安全性群組規則。
  • 建立新的輸入路由時,Azure 也會管理 HTTP 應用程式路由的外部 DNS 設定。

Azure 虛擬網路

在 AKS 中,您可以部署使用下列任意網路模型的叢集:

  • Kubenet 網路

    部署 AKS 叢集時通常會建立並設定網路資源。

  • Azure 容器網路介面 (CNI) 網路

    AKS 叢集會連線至現有的虛擬網路資源和設定。

Kubenet (基本) 網路

kubenet 網路選項是 AKS 叢集建立的預設設定。 使用 kubenet

  1. 節點會接收來自 Azure 虛擬網路子網路的 IP 位址。
  2. Pod 會從邏輯上與節點的 Azure 虛擬網路子網路不同的位址空間接收 IP 位址。
  3. 網路位址轉譯 (NAT) 接著會進行設定,使 Pod 可以連接 Azure 虛擬網路上的資源。
  4. 流量的來源 IP 位址會被轉譯為節點的主要 IP 位址。

節點會使用 kubenet Kubernetes 外掛程式。 您可以讓 Azure 平台自行建立和設定虛擬網路,也可以選擇將 AKS 叢集部署到現有的虛擬網路子網路中。

只有節點會接收可路由 IP 位址。 Pod 會使用 NAT 與 AKS 叢集以外的其他資源通訊。 這項做法可減少您需要在網路空間中保留以供 Pod 使用的 IP 位址數目。

注意

雖然 kubenet 是 AKS 叢集建立虛擬網路和子網路的預設網路選項,但不建議用於生產環境部署。 針對大部分的生產環境部署,您應該規劃和使用 Azure CNI 網路,因為其具有優越的可擴縮性和效能特性。

如需詳細資訊,請參閱為 AKS 叢集設定 kubenet 網路 (部分機器翻譯)。

Azure CNI (進階) 網路

透過 Azure CNI,每個 Pod 都會從子網路取得 IP 位址,且可以直接存取。 這些 IP 位址在您網路空間中必須是唯一且事先經過規劃。 每個節點都有一個設定參數,表示其支援的 Pod 數量上限。 接著系統便會預先保留每個節點的對等 IP 位址數目。 這項做法容易導致 IP 位址耗盡,或需要在應用程式需求增加後,於較大子網路內重建叢集,因此請務必妥善規劃。 為了避免這些規劃挑戰,您可以啟用 Azure CNI 網路,以動態配置 IP 並增強子網路支援功能 (部分機器翻譯)。

注意

由於 Kubernetes 限制,資源群組名稱、虛擬網路名稱與子網路名稱都必須少於 63 個字元。

不同於 kubenet,傳送到相同虛擬網路中之端點的流量不會轉譯 (NAT) 到節點的主要 IP。 虛擬網路內流量的來源位址為 Pod IP。 虛擬網路外部的流量,仍會轉譯至節點的主要 IP。

節點會使用 Azure CNI Kubernetes 外掛程式。

顯示兩個節點的網橋連線到單一 Azure VNet 的圖表

如需詳細資訊,請參閱為 AKS 叢集設定 Azure CNI (部分機器翻譯)。

Azure CNI 重疊網路

Azure CNI 重疊 (部分機器翻譯) 代表 Azure CNI 的演進,可因應從虛擬網路 IP 指派給 Pod 所產生的可擴縮性和規劃挑戰。 Azure CNI 重疊會將私人 CIDR IP 指派給 Pod。 私人 IP 與虛擬網路不同,且可跨多個叢集重複使用。 Azure CNI 重疊可以擴大到超過 Kubenet 叢集中強制執行的 400 個節點限制。 Azure CNI 重疊是適用於大多數叢集的建議選項。

由 Cilium 提供的 Azure CNI

由 Cilium 提供的 Azure CNI (部分機器翻譯) 會使用 Cilium (英文) 來提供高效能的網路、可檢視性和網路原則強制執行。 其會與 Azure CNI 重疊 (部分機器翻譯) 原生整合,以進行可擴縮的 IP 位址管理 (IPAM)。

此外,Cilium 預設會強制執行網路原則,而不需個別的網路原則引擎。 由 Cilium 提供的 Azure CNI 可以使用 ePBF 程式和更有效率的 API 物件結構,來擴大到超過 Azure 網路原則管理員 250 個節點 / 20-K Pod 的限制

針對需要強制執行網路原則的叢集,建議選用由 Cilium 提供的 Azure CNI。

自備 CNI

您可以使用自備 CNI 功能,在 AKS 中安裝非 Microsoft CNI。

比較網路模型

Kubenet 和 Azure CNI 都會為您的 AKS 叢集提供網路連線能力。 不過,各有其優缺點。 概括而言,會有下列考量:

  • kubenet

    • 節省 IP 位址空間。
    • 使用 Kubernetes 內部或外部負載平衡器,從叢集外部連線到 Pod。
    • 您可以手動管理和維護使用者定義的路由 (UDR)。
    • 每個叢集最多 400 個節點。
  • Azure CNI

    • Pod 會取得完整的虛擬網路連線能力,並可透過其來自連線網路的私人 IP 位址直接連線。
    • 需要更多 IP 位址空間。
網路模型 使用時機
Kubenet • IP 位址空間交談是一個優先考慮事項。
•簡單設定。
• 每個叢集少於 400 個節點。
• Kubernetes 內部或外部負載平衡器就足以從叢集外部連線到 Pod。
• 可接受手動管理和維護使用者定義的路由。
Azure CNI • Pod 需要完整虛擬網路連線。
• 需要進階 AKS 功能 (例如虛擬節點)。
• 有足夠的 IP 位址空間可供使用。
• 需要 Pod 到 Pod 及 Pod 到虛擬機器連線。
• 外部資源需要直接連線到 Pod。
• 需要 AKS 網路原則。
Azure CNI 重疊 • IP 位址短缺是一項考量。
• 每個節點最多擴大到 1,000 個節點和 250 個 Pod 就已足夠。
• 可接受 Pod 連線的額外躍點。
• 更簡單的網路設定。
• 可符合 AKS 輸出需求。

Kubenet 與 Azure CNI 之間存在下列行為差異:

功能 Kubenet Azure CNI Azure CNI 重疊 Cilium 提供的 Azure CNI
在現有或新的虛擬網路中部署叢集 支援 - 手動套用 UDR 支援 支援 支援
Pod-Pod 連線能力 支援 支援 支援 支援
Pod-VM 連線能力;相同虛擬網路中的 VM 由 Pod 起始時可運作 雙向均可運作 由 Pod 起始時可運作 由 Pod 起始時可運作
Pod-VM 連線能力;對等互連虛擬網路中的 VM 由 Pod 起始時可運作 雙向均可運作 由 Pod 起始時可運作 由 Pod 起始時可運作
使用 VPN 或 Express Route 的內部部署存取 由 Pod 起始時可運作 雙向均可運作 由 Pod 起始時可運作 由 Pod 起始時可運作
存取受服務端點保護的資源 支援 支援 支援
使用負載平衡器服務、應用程式閘道或輸入控制器來公開 Kubernetes 服務 支援 支援 支援 使用重疊模式時的相同限制
支援 Windows 節點集區 不支援 支援 支援 僅適用於 Linux,不適用於 Windows。 (部分機器翻譯)
預設 Azure DNS 和私人區域 支援 支援 支援

如需 Azure CNI 和 kubenet 的詳細資訊,以及協助判斷哪一個選項最適合您,請參閱在 AKS 中設定 Azure CNI 網路 (部分機器翻譯) 和在 AKS 中使用 kubenet 網路 (部分機器翻譯)。

網路模型之間的支援範圍

無論您使用何種網路模型,都可以使用下列其中一種方式來部署 kubenet 和 Azure CNI:

  • 當您建立 AKS 叢集時,Azure 平台可以自動建立及設定虛擬網路資源。
  • 您可以在建立 AKS 叢集時手動建立及設定虛擬網路資源,並附加至這些資源。

雖然 kubenet 和 Azure CNI 都支援服務端點或 UDR 等功能,但 AKS 的支援原則會定義您可以進行的變更。 例如:

  • 如果您手動建立 AKS 叢集的虛擬網路資源,您可以在設定自己的 UDR 或服務端點時受到支援。
  • 如果 Azure 平台會自動為您的 AKS 叢集建立虛擬網路資源,您就無法手動變更這些 AKS 管理的資源來設定您自己的 UDR 或服務端點。

輸入控制器

當您建立 LoadBalancer 型別的服務時,也會建立基礎的 Azure 負載平衡器資源。 在您的服務中,負載平衡器會設定為透過指定的連接埠將流量散發至 Pod。

LoadBalancer 僅適用於第 4 層。 在第 4 層中,服務無法辨識實際的應用程式,且無法考量任何其他路由方式。

輸入控制器適用於第 7 層,並可使用更具智慧的規則來散發應用程式流量。 輸入控制器通常會根據輸入 URL,將 HTTP 流量路由到不同的應用程式。

顯示 AKS 叢集中輸入流量流量的圖表

比較輸入選項

下表列出不同輸入控制器選項之間的功能差異:

功能 應用程式路由附加元件 容器的應用程式閘道 Azure 服務網格/Istio 型服務網格
輸入/閘道控制器 NGINX 輸入控制器 適用於容器的 Azure 應用程式閘道 Istio 輸入閘道
API 輸入 API 輸入 API 和閘道 API 閘道 API
裝載 叢集中 Azure 託管 叢集中
調整大小 自動調整 自動調整 自動調整
負載平衡 內部/外部 外部 內部/外部
SSL 終止 叢集中 是:卸除和 E2E SSL 叢集中
mTLS N/A 是至後端 N/A
靜態IP位址 N/A FQDN N/A
Azure 金鑰保存庫 儲存的 SSL 憑證 Yes N/A
DNS 區域管理的 Azure DNS 整合 Yes N/A

下表列出您可以使用每個輸入控制器的不同案例:

輸入選項 使用時機
受控 NGINX - 應用程式路由附加元件 • 叢集中裝載、可自定義且可調整的 NGINX 輸入控制器。
• 基本負載平衡和路由功能。
• 內部和外部負載平衡器組態。
• 靜態IP位址設定。
• 與 Azure 金鑰保存庫 整合以進行憑證管理。
• 與 Azure DNS 區域整合,以進行公用和私人 DNS 管理。
• 支援輸入 API。
適用於容器的 應用程式閘道 • Azure 裝載的輸入閘道。
• 由控制器管理的彈性部署策略,或為容器自備 應用程式閘道。
• 進階流量管理功能,例如自動重試、可用性區域復原、相互驗證 (mTLS) 至後端目標、流量分割/加權迴圈配置資源,以及自動調整。
• 與 Azure 金鑰保存庫 整合以進行憑證管理。
• 與 Azure DNS 區域整合,以進行公用和私人 DNS 管理。
• 支援輸入和閘道 API。
Istio 輸入閘道 • 使用 Istio 做為服務網格時,根據 Envoy。
• 進階流量管理功能,例如速率限制和斷路器。
• 支援 mTLS
• 支持閘道 API。

建立輸入資源

應用程式路由附加元件是在 AKS 中設定輸入控制器的建議方式。 應用程式路由附加元件是 Azure Kubernetes Service (AKS) 的完全受控輸入控制器,可提供下列功能:

  • 根據 Kubernetes NGINX 輸入控制器,輕鬆設定受控 NGINX 輸入控制器。

  • 與 Azure DNS 整合,以進行公用和私人區域管理。

  • 使用儲存於 Azure Key Vault 中的憑證進行 SSL 終止。

如需應用程式路由附加元件的詳細資訊,請參閱使用應用程式路由附加元件的受控 NGINX 輸入 (部分機器翻譯)。

用戶端來源 IP 保留

設定輸入控制器,以在 AKS 叢集中容器的要求上保留用戶端來源 IP。 當您的輸入控制器將用戶端的要求路由傳送至 AKS 叢集中的容器時,該要求的原始來源 IP 無法提供給目標容器。 當您啟用用戶端來源 IP 保留時,用戶端的來源 IP 可在 X-Forwarded-For 下的要求標頭中取得。

如果您在輸入控制器上使用用戶端來源 IP 保留,則無法使用 TLS 傳遞。 用戶端來源 IP 保留和 TLS 傳遞可以與其他服務搭配使用,例如 LoadBalancer 類型。

若要深入了解用戶端來源 IP 保留,請參閱用戶端來源 IP 保留如何適用於 AKS 中的 LoadBalancer 服務 (英文)。

控制輸出流量

AKS 叢集會部署在虛擬網路上,並具有該虛擬網路外部服務的輸出相依性。 這些輸出相依性幾乎完全以網域名稱定義 (FQDN)。 根據預設,AKS 叢集具有不受限制的輸出網際網路存取,這可讓您執行的節點和服務視需要存取外部資源。 如有需要,您可以限制輸出流量。

如需詳細資訊,請參閱控制 AKS 中叢集節點的輸出流量

網路安全性群組

網路安全性群組可篩選 VM 的流量,例如 AKS 節點。 當您建立服務 (例如 LoadBalancer) 時,Azure 平台會自動設定任何必要的網路安全性群組規則。

您無須以手動方式設定對 AKS 叢集中的 Pod 進行流量篩選的網路安全性群組規則。 您可以將任何必要的連接埠和轉送定義為 Kubernetes 服務資訊清單的一部分,然後由 Azure 平台建立或更新適當的規則。

您也可以使用網路原則,自動將流量篩選規則套用至 Pod。

如需詳細資訊,請參閱網路安全性群組如何篩選網路流量

網路原則

根據預設,AKS 叢集中的所有 Pod 都可以無限制地傳送及接收流量。 為了提升安全性,請定義控制流量的規則,例如:

  • 後端應用程式只對必要的前端服務公開。
  • 或者,只有連線到資料庫元件的應用層才能存取資料庫元件。

網路原則是 AKS 中提供的 Kubernetes 功能,可以控制 OPod 之間的流量。 您可以根據指派的標籤、命名空間或流量連接埠等設定,允許或拒絕傳送至 Pod 的流量。 雖然網路安全性群組更適合 AKS 節點,但網路原則是更適合的雲端原生方式,可控制 Pod 流量的流程。 由於 Pod 是在 AKS 叢集中動態建立的,因此可以自動套用所需的網路原則。

如需詳細資訊,請參閱使用 Azure Kubernetes Service (AKS) 中的網路原則來保護 Pod 之間的流量 (部分機器翻譯)。

下一步

若要開始使用 AKS 網路,請使用 kubenet (部分機器翻譯) 或 Azure CNI (部分機器翻譯),以您自己的 IP 位址範圍建立並設定 AKS 叢集。

如需相關的最佳作法,請參閱 AKS 中的網路連線和安全性最佳做法

如需有關 Kubernetes 及 AKS 核心概念的詳細資訊,請參閱下列文章: