本頁說明如何在 Google Kubernetes Engine (GKE) 中部署服務。請參考本頁面,進一步瞭解 Service Networking 的各個面向,以及 GKE 中的 Service Network 功能。
Service 網路總覽
服務網路是一種發布應用程式的方式,可將用戶端使用的應用程式基礎擁有權、實作或環境抽象化。簡單來說,Service 就是安全、一致且可用的端點,應用程式可透過這個端點存取。
用戶端和應用程式的通訊方式和需求各不相同。 簡單來說,就是將 Kubernetes 叢集中的應用程式公開給 Pod 使用,複雜一點的話,就是將全球網際網路用戶的流量轉送至應用程式。GKE 提供多種方法,可將應用程式公開為服務,以符合您的獨特用途。
服務的要素
向用戶端公開應用程式時,Service 有三個重要元素:
前端:負載平衡器前端定義了用戶端可存取負載平衡器並向其傳送流量的範圍。這是監聽流量的網路位置。這項服務具有網路、特定區域 (或網路內的子網路)、網路中的一或多個 IP、連接埠、特定通訊協定,以及用於建立安全連線的 TLS 憑證。
轉送和負載平衡:轉送和負載平衡定義流量的處理和轉送方式。您可以根據通訊協定、HTTP 標頭和 HTTP 路徑等參數,將流量轉送至服務。視您使用的負載平衡器而定,負載平衡器可能會平衡流量,為客戶提供更低的延遲時間和更高的彈性。
後端:負載平衡器後端是由端點類型、應用程式平台和後端服務探索整合定義。GKE 會使用服務探索整合功能,在 GKE 端點啟動和關閉時,動態更新負載平衡器後端。
下圖說明內部和外部流量的這些概念:
在這張圖中,外部應用程式負載平衡器會透過全球數百個 Google 服務點,監聽公用網際網路上的流量。這個全域前端可讓流量在靠近用戶端的邊緣終止,然後將流量負載平衡至 Google 資料中心的後端。
內部應用程式負載平衡器會在虛擬私有雲網路範圍內接聽,允許內部進行私人通訊。這些負載平衡器屬性使其適用於不同類型的應用程式用途。
瞭解 GKE 負載平衡
如要公開 GKE 叢集外部的應用程式,GKE 提供內建的 GKE Ingress 控制器和 GKE 服務控制器,可代表 GKE 使用者部署負載平衡器。這與 VM 負載平衡基礎架構相同,但生命週期完全自動化,並由 GKE 控制。GKE 網路控制器使用符合 Ingress 和 Service API 標準的專用高階介面,提供容器原生 Pod IP 負載平衡。
下圖說明 GKE 網路控制器如何自動建立負載平衡器:
如圖所示,基礎架構或應用程式管理員會針對 GKE 叢集部署宣告式資訊清單。Ingress 和 Service 控制器會監控 GKE 網路資源 (例如 Ingress 物件),並根據資訊清單部署負載平衡器 (以及 IP 位址、防火牆規則等)。
控制器會根據環境和流量變化,持續管理負載平衡器和後端。因此,GKE 負載平衡器會成為動態且可自我維持的負載平衡器,並提供以開發人員為導向的介面。
選擇公開應用程式的方法
在 GKE 中選擇公開應用程式的方法時,請以用戶端網路、通訊協定和應用程式區域性為主要考量因素。GKE 提供一系列 Ingress 和 Service 控制器,可讓您在公開應用程式時,將上述各項因素納入考量。
雖然下列各節並未涵蓋應用程式網路的各個層面,但逐一瞭解下列因素,有助於判斷哪些解決方案最適合您的應用程式。大多數 GKE 環境都會託管許多不同類型的應用程式,且各有獨特需求,因此您可能會在任何特定叢集中使用多個應用程式。
如要詳細比較 Ingress 功能,請參閱「Ingress 設定」。
用戶端網路
用戶端網路是指應用程式用戶端存取應用程式的網路。這會影響負載平衡器的前端應監聽的位置。舉例來說,用戶端可能與應用程式位於同一個 GKE 叢集。在這種情況下,他們會從叢集網路中存取應用程式,因此可以使用 Kubernetes 原生 ClusterIP 負載平衡。
用戶端也可以是內部網路用戶端,從虛擬私有雲 (VPC) 內部或透過 Cloud Interconnect 從地端部署網路存取應用程式。
用戶端也可能是外部用戶,透過公開網際網路存取應用程式。不同類型的網路會決定不同的負載平衡拓撲。
在 GKE 中,您可以選擇內部或外部負載平衡器。內部是指虛擬私有雲網路,這是無法直接從網際網路存取的內部私人網路。「外部」是指公開網際網路。ClusterIP 服務屬於單一 GKE 叢集內部,因此範圍比虛擬私有雲網路更小。
下表概述內部和外部網路可用的解決方案。
| 網路類型 | 可用的解決方案 |
|---|---|
| 內部 |
ClusterIP 服務
NodePort 服務 內部 LoadBalancer 服務 內部 Ingress |
| 外部 |
NodePort 服務1
外部 LoadBalancer 服務 外部 Ingress 多叢集 Ingress |
1 使用 --no-enable-private-nodes 旗標的 GKE 叢集可以擁有具備公開和私人 IP 位址的節點,因此 NodePort Service 可在內部和外部存取。
通訊協定
通訊協定是客戶端與應用程式通訊時使用的語言。語音、遊戲和低延遲應用程式通常會直接使用 TCP 或 UDP,因此需要可在第 4 層進行精細控制的負載平衡器。其他應用程式則使用 HTTP、HTTPS、gRPC 或 HTTP2,需要明確支援這些通訊協定的負載平衡器。通訊協定規定會進一步定義最適合的應用程式曝光方法類型。
在 GKE 中,您可以設定第 4 層負載平衡器,根據通訊埠和通訊協定等網路資訊轉送流量,也可以設定第 7 層負載平衡器,瞭解用戶端工作階段等應用程式資訊。如下表所示,每種負載平衡器支援的通訊協定都不盡相同:
| 資料層 | 通訊協定 | 可用的解決方案 |
|---|---|---|
| L4 | TCP UDP |
ClusterIP Service
NodePort Service 內部 LoadBalancer Service 外部 LoadBalancer Service |
| L7 |
HTTP
HTTPS HTTP2 |
內部 Ingress
外部 Ingress 多叢集 Ingress |
應用程式區域性
應用程式區域性是指應用程式在多個區域或 GKE 叢集之間的分散程度。與在兩個獨立的 GKE 叢集中代管應用程式的備援執行個體相比,代管單一應用程式執行個體有不同的需求。在五個 GKE 叢集中代管地理位置分散的應用程式,以便將工作負載放在更靠近使用者的位置,縮短延遲時間,這需要負載平衡器具備更多叢集和多區域意識。
您可以將 GKE 負載平衡解決方案的區域性分為兩大類:
後端範圍 (或叢集範圍):這個範圍是指負載平衡器能否將流量傳送至多個 GKE 叢集的後端。多叢集 Ingress 可公開單一虛擬 IP 位址,將流量導向不同叢集和區域的 Pod。
前端範圍:這個範圍是指負載平衡器 IP 監聽的範圍是單一區域,還是多個區域。所有外部負載平衡器都會監聽網際網路,網際網路本質上就是多區域,但部分內部負載平衡器只會在單一區域內監聽。
下表依據這兩個維度,細分 GKE 負載平衡解決方案。
| 後端範圍 (叢集範圍) |
可用的解決方案 |
|---|---|
| 單一叢集 |
ClusterIP 服務
NodePort 服務 內部 LoadBalancer 服務 外部 LoadBalancer 服務 內部 Ingress 外部 Ingress |
| 多叢集 | 多叢集 Ingress |
| 前端範圍 | 可用的解決方案 |
|---|---|
| 區域 |
ClusterIP 服務
內部 Ingress |
| 全球 |
ClusterIP Service
NodePort Service 內部負載平衡器 Service 外部負載平衡器 Service 外部 Ingress 多叢集 Ingress |
其他應用程式曝光解決方案
上述解決方案並非公開應用程式的唯一方法。下列解決方案也可能取代或輔助 GKE 負載平衡器。
叢集內 Ingress
叢集內 Ingress 是指軟體 Ingress 控制器,這類控制器會在 Kubernetes 叢集內代管 Ingress 代理伺服器。這與 GKE Ingress 控制器不同,後者會代管及管理負載平衡基礎架構,與 Kubernetes 叢集分開。這些第三方解決方案通常由叢集運算子自行部署及管理。istio-ingressgateway 和 nginx-ingress 是兩個常用且為開放原始碼的叢集內 Ingress 控制器。
叢集內 Ingress 控制器通常符合 Kubernetes Ingress 規格,並提供不同的功能和易用性。開放原始碼解決方案可能需要更嚴密的管理和更高階的技術專業知識,但如果這些解決方案提供應用程式所需的特定功能,或許就能滿足您的需求。此外,圍繞開放原始碼社群建構的企業 Ingress 解決方案生態系統也相當龐大,可提供進階功能和企業支援。
獨立網路端點群組 (NEG)
GKE Ingress 和 Service 控制器提供自動化、宣告式和 Kubernetes 原生方法,可部署 Cloud Load Balancing。手動為 GKE 後端部署負載平衡器也有其用途,例如直接且更精細地控管負載平衡器,或在容器和 VM 後端之間平衡負載。
獨立 NEG 可動態更新 NEG 的 Pod 後端 IP,藉此提供這項功能,但允許手動部署負載平衡器的前端。這樣一來,您就能直接控管負載平衡器,同時保留由 GKE 叢集控管的動態後端。
服務網格
服務網格透過集中式控制平面提供用戶端負載平衡。Cloud Service Mesh 可在 GKE 叢集、區域之間,以及容器和 VM 之間,進行內部流量的負載平衡。這會模糊內部負載平衡 (東西向流量) 和應用程式曝光 (南北向流量) 之間的界線。現代服務網格控制層的彈性和涵蓋範圍,讓用戶端和伺服器更有可能位於同一服務網格範圍內。上述 GKE Ingress 和 Service 解決方案通常會為沒有專屬 Sidecar Proxy 的用戶端部署中介 Proxy 負載平衡器。不過,如果用戶端和伺服器位於同一個網格中,則可使用網格處理應用程式曝光,而非中介 Proxy 負載平衡。
後續步驟
- 進一步瞭解 Ingress 功能。
- 進一步瞭解外部 Ingress。
- 進一步瞭解內部 Ingress。
- 使用外部 LoadBalancer Service。
- 使用內部 LoadBalancer Service。