Azure Kubernetes Service (AKS) 中的網路概念
在應用程式開發的容器型微服務方法中,應用程式元件搭配運作以處理其工作。 Kubernetes 提供各種資源以啟用這類合作:
- 您可以在內部或外部連接和公開應用程式。
- 您可以對應用程式載入平衡,以建置具有高可用性的應用程式。
- 您可以限制在 Pod 和節點之間的網路流量,以改善安全性。
- 您可以為更複雜的應用程式設定 SSL/TLS 終止的輸入流量或多個元件的路由。
本文將介紹為 AKS 中的應用程式提供網路功能的核心概念:
Kubernetes 基本概念
為了提供對您應用程式的存取能力,或讓應用程式元件互相存取,Kubernetes 提供虛擬網路的抽象層。 Kubernetes 節點會連線至虛擬網路,並且可提供 Pod 的輸入和輸出連線能力。 Kube-proxy 元件會在每個節點上執行以提供這些網路功能。
在 Kubernetes 中:
- 服務會按邏輯將 Pod 分組,以允許透過 IP 位址或 DNS 名稱和特定連接埠上的直接存取。
- ServiceTypes 可讓您指定您想要的服務類型。
- 您可以使用負載平衡器來分散流量。
- 應用程式流量第 7 層路由也可以透過 輸入控制器來達成。
- 您可以「控制叢集節點的輸出流量」。
- 網路原則可以針對 Pod 的網路流量進行安全性和篩選。
Azure 平台也可簡化 AKS 叢集的虛擬網路。 當您建立 Kubernetes 負載平衡器時,也會建立並設定基礎的 Azure Load Balancer資源。 當您對 Pod 開啟網路連接埠時,即會設定對應的 Azure 網路安全性群組規則。 針對 HTTP 應用程式路由,Azure 也可以設定 外部 DNS ,因為已設定新的輸入路由。
服務
為了簡化應用程式工作負載的網路設定,Kubernetes 會使用「服務」按邏輯將一組 Pod 分組在一起,並提供網路連線。 您可以指定 Kubernetes ServiceType 來指定您想要的服務類型,例如,如果您想要將服務公開到叢集外部的外部 IP 位址。 如需詳細資訊,請參閱 發佈服務 (ServiceTypes) 的 Kubernetes 檔。
下列 ServiceTypes 可供使用:
ClusterIP
ClusterIP 會建立內部 IP 位址,以在 AKS 叢集內使用。 此服務適用于支援叢集內其他工作負載的內部 專用應用程式 。 如果您未明確指定服務的型別,就會使用這個預設值。
NodePort
NodePort 會在基礎節點上建立連接埠對應,以便直接透過節點 IP 位址和連接埠存取應用程式。
LoadBalancer
LoadBalancer 會建立 Azure 負載平衡器資源、設定外部 IP 位址,並將要求的 Pod 連線至負載平衡器後端集區。 若要允許客戶流量觸達應用程式,可在所需的連接埠上建立負載平衡規則。
針對輸入流量的 HTTP 負載平衡,另一個選項是使用 輸入控制器。
ExternalName
建立特定的 DNS 項目以方便存取應用程式。
動態指派負載平衡器和服務的 IP 位址,或指定要使用的現有靜態 IP 位址。 內部和外部的靜態 IP 位址都可指派。 現有的靜態 IP 位址通常會繫結至 DNS 項目。
您可以建立內部和外部負載平衡器。 由於內部負載平衡器只會指派私人 IP 位址,因此無法從網際網路加以存取。
如需服務的詳細資訊,請參閱 Kubernetes 文件 (英文)。
Azure 虛擬網路
在 AKS 中,您可以部署使用下列其中一個網路模型的叢集:
Kubenet 網路功能
在部署 AKS 叢集時通常會建立並設定網路資源。
Azure 容器網路介面 (CNI) 網路
AKS 叢集會連線至現有的虛擬網路資源和設定。
Kubenet (基本) 網路
Kubenet 網路選項是建立 AKS 叢集時的預設組態。 使用 kubenet:
- 節點會從 Azure 虛擬網路子網路取得 IP 位址。
- Pod 會從與節點 Azure 虛擬網路子網路邏輯上不同的位址空間取得 IP 位址。
- 網路位址轉譯 (NAT) 接著會進行設定,使 Pod 可以連接 Azure 虛擬網路上的資源。
- 流量的來源 IP 位址會被轉譯為節點的主要 IP 位址。
節點會使用 kubenet Kubernetes 外掛程式。 您可以讓 Azure 平台為您建立及設定虛擬網路,或選擇部署 AKS 叢集到現有的虛擬網路子網路。
只有節點會收到可路由的 IP 位址。 Pod 使用網路位址轉譯和 AKS 叢集外的資源交流。 此方法可減少您需要在網路空間中保留,以供 Pod 使用的 IP 位址數目。
注意
雖然 kubenet 是 AKS 叢集建立虛擬網路和子網的預設網路選項,但不建議用於生產部署。 針對大部分的生產部署,您應該規劃並使用 Azure CNI 網路,因為其延展性和效能特性較佳。
如需詳細資訊,請參閱為 AKS 叢集設定 kubenet 網路。
Azure CNI (進階) 網路
使用 Azure CNI,每個 Pod 都從子網路取得 IP 位址,並且可以直接存取。 這些 IP 位址在您的網路空間中必須是唯一的,且必須事先規劃。 每個節點都有一個組態參數,用於所支援的最大 Pod 數目。 然後預先保留每個節點的相同 IP 位址數目。 這種方法可能會導致 IP 位址耗盡,或需要隨著應用程式需求成長而重建較大子網中的叢集,因此請務必正確規劃。 為了避免這些規劃挑戰,您可以啟用 Azure CNI 網路功能,以動態配置 IP 和增強的子網支援。
不同於 kubenet,相同虛擬網路中端點流量不是節點主要 IP 的 NAT。 虛擬網路內流量的來源位址是 Pod IP。 虛擬網路外部流量仍為節點主要 IP 的 NAT。
節點會使用 Azure CNI Kubernetes 外掛程式。
如需詳細資訊,請參閱為 AKS 叢集設定 Azure CNI。
Azure CNI 重迭網路
Azure CNI 重反覆運算表 Azure CNI 的演進,解決從 VNet IP 指派至 Pod 所產生的延展性和規劃挑戰。 它可藉由將私人 CIDR IP 指派給 Pod 來達成此目的,這與 VNet 不同,而且可以在多個叢集之間重複使用。 不同于 Kubenet,其中流量資料平面是由 Kubernetes 節點的 Linux 核心網路堆疊處理,Azure CNI 重迭會將此責任委派給 Azure 網路。
Cilium 提供的 Azure CNI
在 由 Cilium 提供的 Azure CNI 中,Pod 的資料平面是由 Kubernetes 節點的 Linux 核心所管理。 不同于 Kubenet,它面臨 Linux 核心網路堆疊的延展性和效能問題,[Cilium][ https://cilium.io/ ] 會略過 Linux 核心網路堆疊,而是利用 Linux 核心中的 eBPF 程式來加速封包處理,以加快效能。
自備 CNI
您可以使用 自備 CNI 功能,在 AKS 中安裝協力廠商 CNI。
比較網路模型
Kubenet 和 Azure CNI 都會為您的 AKS 叢集提供網路連線能力。 不過,各有其優缺點。 概括而言,會有下列考量:
kubenet
- 節省 IP 位址空間。
- 使用 Kubernetes 內部或外部負載平衡器從叢集外部觸達 Pod。
- 您可以手動管理和維護使用者定義的路由 (UDR)。
- 每個叢集最多 400 個節點。
Azure CNI
- Pod 會取得完整的虛擬網路連線能力,並可透過其來自連線網路的私人 IP 位址直接連線。
- 需要更多 IP 位址空間。
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 服務 | 支援 | 支援 | 應用程式閘道輸入控制器 (AGIC) 支援 | 使用重迭模式時的相同限制 |
支援 Windows 節點集區 | 不支援 | 支援 | 支援 | 僅適用於 Linux,不適用於 Windows。 |
關於 DNS,搭配 kubenet 和 Azure CNI 外掛程式 DNS 皆由 CoreDNS 提供,這是在 AKS 中執行且具有其自動調整程式部署的部署。 如需 Kubernetes 上 CoreDNS 的詳細資訊,請參閱自訂 DNS 服務。 根據預設,CoreDNS 會設定為將未知網域轉送至部署 AKS 叢集的 Azure 虛擬網路 DNS 功能。 因此,Azure DNS 和私人區域適用於在 AKS 中執行的 Pod。
如需 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 Load Balancer 資源。 在您的服務中,負載平衡器會設定為透過指定的連接埠將流量分散到 Pod。
LoadBalancer僅適用于第 4 層。 在第 4 層,服務無法辨識實際的應用程式,且無法考量任何其他路由方式。
輸入控制器 會在第 7 層運作,而且可以使用更聰明的規則來分散應用程式流量。 輸入控制器通常根據輸入 URL 將 HTTP 流量路由到不同的應用程式。
建立輸入資源
在 AKS 中,您可以使用 NGINX、類似的工具或 AKS HTTP 應用程式路由功能來建立輸入資源。 當您啟用 AKS 叢集的 HTTP 應用程式路由時,Azure 平臺會建立輸入控制器和 External-DNS 控制器。 在 Kubernetes 中建立新的輸入資源時,必要的 DNS 記錄會在叢集特定的 DNS A
區域中建立。
如需詳細資訊,請參閱部署 HTTP 應用程式路由。
應用程式閘道輸入控制器 (AGIC)
使用應用程式閘道輸入控制器 (AGIC) 附加元件,您可以使用 Azure 的原生應用程式閘道層級 7 負載平衡器,將雲端軟體公開至網際網路。 AGIC 會在 AKS 叢集中以 Pod 的形式執行。 它會取用Kubernetes 輸入資源,並將其轉換成應用程式閘道設定,讓閘道能夠對 Kubernetes Pod 的流量進行負載平衡。
若要深入瞭解 AKS 的 AGIC 附加元件,請參閱什麼是應用程式閘道輸入控制器?。
SSL/TLS 終止
終止 SSL/TLS 是輸入的另一個常見功能。 在透過 HTTPS 存取的大型 Web 應用程式上,可由輸入資源來處理 TLS 終止,而無須由應用程式本身處理。 若要提供自動 TLS 憑證產生和設定的功能,您可以將輸入資源設定為使用 Let's Encrypt 之類的資源提供者。
如需使用 Let's Encrypt 設定 NGINX 輸入控制器的詳細資訊,請參閱 輸入和 TLS。
用戶端來源 IP 保留
設定輸入控制器,以在 AKS 叢集中容器的要求上保留用戶端來源 IP。 當您的輸入控制器將用戶端的要求路由傳送至 AKS 叢集中的容器時,該要求的原始來源 IP 無法提供給目標容器。 當您啟用用戶端來源 IP 保留時,用戶端的來源 IP 可在 X-Forwarded-For 下的要求標頭中取得。
如果您在輸入控制器上使用用戶端來源 IP 保留,則無法使用 TLS 傳遞。 用戶端來源 IP 保留和 TLS 傳遞可以與其他服務搭配使用,例如 LoadBalancer 類型。
若要深入瞭解用戶端來源 IP 保留,請參閱 用戶端來源 IP 保留如何適用于 AKS 中的 LoadBalancer Services。
控制輸出流量
AKS 叢集會部署在虛擬網路上,並具有該虛擬網路外部服務的輸出相依性。 這些輸出相依性幾乎完全以網域名稱定義 (FQDN)。 根據預設,AKS 叢集具有不受限制的輸出 (輸出) 網際網路存取,可讓您執行的節點和服務視需要存取外部資源。 如有需要,您可以限制輸出流量。
如需詳細資訊,請參閱控制 AKS 中叢集節點的輸出流量。
網路安全性群組
網路安全性群組可篩選 VM 的流量,例如 AKS 節點。 當您建立服務時,例如 LoadBalancer,Azure 平臺會自動設定任何必要的網路安全性群組規則。
您無須以手動方式設定對 AKS 叢集中的 Pod 進行流量篩選的網路安全性群組規則。 您可以將任何必要的埠和轉送定義為 Kubernetes Service 資訊清單的一部分,並讓 Azure 平臺建立或更新適當的規則。
您也可以使用網路原則,自動將流量篩選規則套用至 Pod。
如需詳細資訊,請參閱 網路安全性群組如何篩選網路流量。
網路原則
根據預設,AKS 叢集中的所有 Pod 都可以無限制地傳送及接收流量。 為了提升安全性,請定義控制流量的規則,例如:
- 後端應用程式只會向必要的前端服務公開。
- 或者,只有連線到資料庫元件的應用層才能存取資料庫元件。
網路原則是一種 AKS 中提供的 Kubernetes 功能,可讓您控制 Pod 之間的流量。 您可以根據指派的標籤、命名空間或流量埠等設定,允許或拒絕 Pod 的流量。 雖然網路安全性群組更適合 AKS 節點,但網路原則是更適合的雲端原生方式,可控制 Pod 流量的流程。 由於 Pod 是在 AKS 叢集內以動態方式建立的,因此可以自動套用所需的網路原則。
如需詳細資訊,請參閱使用 Azure Kubernetes Service (AKS) 中的網路原則來保護 Pod 之間的流量 \(英文\)。
後續步驟
若要開始使用 AKS 網路功能,請使用 kubenet 或 Azure CNI 以您自己的 IP 位址範圍建立及設定 AKS 叢集。
如需相關的最佳作法,請參閱 AKS 中的網路連線和安全性最佳做法。
如需有關 Kubernetes 及 AKS 核心概念的詳細資訊,請參閱下列文章: