本教學課程說明如何透過設定 Ingress 資源,在外部應用程式負載平衡器後方執行網路應用程式。
本頁面適用於網路專家,他們負責為機構設計及建構網路,並安裝、設定及支援網路設備。如要進一步瞭解我們在Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。
背景
Google Kubernetes Engine (GKE) 針對可公開存取的應用程式,提供兩種 Cloud Load Balancing 整合式支援:
在本教學課程中,您會使用 Ingress。
Ingress
在資源資訊清單中指定 kind: Ingress
時,您會指示 GKE 建立 Ingress 資源。只要加入註解,並支援工作負載和服務,即可建立自訂 Ingress 控制器。否則,GKE 會發出適當的 Google Cloud API 呼叫,建立外部應用程式負載平衡器。負載平衡器的網址對應主機規則和路徑比對器會參照一或多個後端服務,其中每個後端服務都對應至 Ingress
中參照的 NodePort
類型 GKE Service。每個後端服務的後端都是執行個體群組或網路端點群組 (NEG)。設定 容器原生負載平衡做為 Ingress 設定的一部分時,系統會建立 NEG。針對每個後端服務,GKE 會根據對應 GKE Service 參照的工作負載就緒探測設定,建立 Google Cloud 健康狀態檢查。
如果您要公開在 GKE 上託管的 HTTP(S) 服務,建議您使用 HTTP(S) 負載平衡這個方法進行負載平衡。
目標
- 建立 GKE 叢集。
- 將範例網頁應用程式部署至叢集。
- 將範例應用程式公開發布至網際網路,並在外部應用程式負載平衡器後方。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
請依照下列步驟啟用 Kubernetes Engine API:- 前往 Google Cloud 控制台的 Kubernetes Engine 頁面。
- 建立或選取專案。
- 等待 API 和相關服務完成啟用。 這可能需要幾分鐘的時間。
-
Make sure that billing is enabled for your Google Cloud project.
請安裝下列指令列工具,我們將在本教學課程中使用這些工具:
-
gcloud
可用來建立和刪除 Kubernetes Engine 叢集。gcloud
包含在gcloud
CLI 中。 -
kubectl
可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用gcloud
安裝kubectl
:gcloud components install kubectl
從 GitHub 複製程式碼範例:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/networking/load-balancing
設定 gcloud
指令列工具的預設設定
如要節省在 gcloud
指令列工具中輸入專案 ID 和 Compute Engine 區域選項的時間,可以採用預設設定:gcloud config set project project-id gcloud config set compute/zone compute-zone
建立 GKE 叢集
建立 GKE Autopilot 叢集:
gcloud container clusters create-auto loadbalancedcluster
部署網頁應用程式
下列資訊清單說明 Deployment,會在通訊埠 8080 的 HTTP 伺服器上執行範例網路應用程式容器映像檔:
將資源套用至叢集:
kubectl apply -f web-deployment.yaml
公開叢集內的 Deployment
下列資訊清單說明 Service,可讓容器叢集存取 web
部署作業:
將資源套用至叢集:
kubectl apply -f web-service.yaml
使用這個指令建立 NodePort 類型的 Service 時,GKE 會讓叢集中的所有節點透過隨機選取的高通訊埠號碼 (例如 32640) 存取 Service。
確認服務已建立,且系統已分配節點通訊埠:
輸出:kubectl get service web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web NodePort 10.35.245.219 <none> 8080:32640/TCP 5m
在輸出範例中,
web
Service 的節點通訊埠為32640
。 另請注意,系統沒有為此 Service 分配外部 IP。根據預設,您無法從外部存取 GKE 節點,因此建立此 Service 不會讓您的應用程式可從網際網路存取。
如要讓 HTTP(S) 網路伺服器應用程式可公開存取,您必須建立 Ingress 資源。
建立 Ingress 資源
Ingress 是 Kubernetes 資源,封裝了一組規則和設定,可將外部 HTTP(S) 流量轉送至內部服務。
在 GKE 上,Ingress 會透過 Cloud Load Balancing 實作。在叢集中建立 Ingress 時,GKE 會建立一個 HTTP(S) 負載平衡器,並設定為將流量轉送至您的應用程式。
下列資訊清單說明 Ingress 資源,該資源會將流量導向至您的 web
Service:
將資源套用至叢集:
kubectl apply -f basic-ingress.yaml
部署此資訊清單後,Kubernetes 會在您的叢集上建立 Ingress 資源。GKE Ingress 控制器會根據 Ingress 中的資訊,建立及設定 HTTP(S) 負載平衡器,將通訊埠 80 上的所有外部 HTTP 流量轉送至您公開的 web
NodePort Service。
前往應用程式
請執行下列指令,找出為您的應用程式提供服務的負載平衡器外部 IP 位址:
kubectl get ingress basic-ingress
NAME HOSTS ADDRESS PORTS AGE basic-ingress * 203.0.113.12 80 2m
在瀏覽器中開啟應用程式的外部 IP 位址,並查看純文字 HTTP 回應,如下所示:
Hello, world! Version: 1.0.0 Hostname: web-6498765b79-fq5q5
您可以前往 Google Cloud 控制台的「Load Balancing」(負載平衡) 頁面,檢查 GKE Ingress 控制器建立的網路資源。
(選用) 設定靜態 IP 位址
在網域名稱上公開網路伺服器時,您必須將應用程式的外部 IP 位址設為不會變動的靜態 IP。
根據預設,GKE 會為透過 Ingress 公開的 HTTP 應用程式分配暫時的外部 IP 位址。暫時位址可能會有變動。如果您打算長期執行應用程式,就必須使用靜態外部 IP 位址。
請注意,為 Ingress 資源設定靜態 IP 後,刪除 Ingress 時將不會一併刪除與其關聯的靜態 IP 位址。如果您不再需要使用這些靜態 IP 位址,請務必清除設定。
如要設定靜態 IP 位址,請完成下列步驟:
預留名為
web-static-ip
的靜態外部 IP 位址:basic-ingress-static.yaml
資訊清單會在 Ingress 上新增註解,以使用名為web-static-ip
的靜態 IP 資源:查看資訊清單:
cat basic-ingress-static.yaml
將資源套用至叢集:
kubectl apply -f basic-ingress-static.yaml
檢查外部 IP 位址:
kubectl get ingress basic-ingress
等待應用程式的 IP 位址變更為
web-static-ip
資源的預留 IP 位址。您可能需要等待幾分鐘,系統才能更新現有的 Ingress 資源、重新設定負載平衡器,並將負載平衡規則傳播至全球各地。這項作業完成後,GKE 會釋出先前分配給應用程式的暫時 IP 位址。
(選用) 在單一負載平衡器上提供多個應用程式
您可以在 Ingress 上設定轉送規則,以在單一負載平衡器和公開 IP 上執行多項服務。您可以將多項服務託管在相同的 Ingress 上,就不需要為每項公開至網際網路的 Service 建立額外的負載平衡器 (計費資源)。
下列資訊清單說明含有相同網路應用程式 2.0
版本的部署:
將資源套用至叢集:
kubectl apply -f web-deployment-v2.yaml
下列資訊清單說明一項服務,該服務會透過名為 web2
的 NodePort 服務,在叢集內部公開 web2
:
將資源套用至叢集:
kubectl apply -f web-service-v2.yaml
下列資訊清單說明 Ingress 資源:
- 使用開頭為
/v2/
的路徑將要求轉送至web2
Service - 將所有其他要求轉送至
web
Service
將資源套用至叢集:
kubectl create -f fanout-ingress.yaml
部署 Ingress 後,執行 kubectl get ingress fanout-ingress
以找出叢集的公開 IP 位址。
接著造訪 IP 位址,看看您是否可以在同一個負載平衡器上存取兩個應用程式:
- 造訪
http://<IP_ADDRESS>/
,並記下包含Version: 1.0.0
的回應 (要求轉送至web
Service) - 造訪
http://<IP_ADDRESS>/v2/
,並記下包含Version: 2.0.0
的回應 (要求轉送至web2
Service)
Ingress 的 path
欄位僅支援 *
字元做為萬用字元。*
字元必須在正斜線 (/
) 之後,並且必須是模式中的最後一個字元。例如,/*
、/foo/*
和 /foo/bar/*
是有效模式,但 *
、/foo/bar*
和 /foo/*/bar
則不是。
較明確的模式會優先於較不明確的模式。如果您同時有 /foo/*
和 /foo/bar/*
,系統會使用 /foo/bar/bat
來比對 /foo/bar/*
。
如要進一步瞭解路徑限制和模式比對,請參閱網址對應說明文件。
(選用) 監控服務的可用性和延遲情形
Google Cloud 正常運作時間檢查會從使用者角度執行應用程式的黑箱監控,判斷從多個外部 IP 到負載平衡器 IP 位址的延遲和可用性。相較之下, Google Cloud 健康狀態檢查會對 Pod IP 執行內部檢查,判斷執行個體層級的可用性。這些檢查是互補的,可提供應用程式健康狀態的整體情況。
您可以使用 Google Cloud 控制台、Cloud Monitoring API 或 Cloud Monitoring 用戶端程式庫,建立運作時間檢查。詳情請參閱「管理運作時間檢查」。 如要使用 Google Cloud 控制台建立運作時間檢查,請按照下列步驟操作:
前往 Google Cloud 控制台的「Services & Ingress」(服務與 Ingress) 頁面。
按一下要建立運作時間檢查的服務名稱。
按一下「建立運作時間檢查」。
在「建立運作時間檢查」窗格中,輸入運作時間檢查的標題,然後按一下「下一步」,前往「目標」設定。
系統會使用服務負載平衡器的資訊,自動填入正常運作時間檢查的「目標」欄位。
如需運作時間檢查中所有欄位的完整說明文件,請參閱「建立運作時間檢查」。
按一下「下一步」,前往「回應驗證」設定。
按一下「下一步」前往「快訊和通知」部分。
如要監控運作時間檢查,您可以建立快訊政策或查看運作時間檢查資訊主頁。如果運作時間檢查失敗,快訊政策會透過電子郵件或其他管道通知您。如要大致瞭解快訊政策,請參閱「快訊簡介」一文。
點選「建立」。
附註
根據預設,Ingress 會透過在 /
路徑做出 GET
要求,執行定期健康狀態檢查,以判斷該應用程式的健康狀態,並預期 HTTP 200 回應。如果您想要檢查不同的路徑,或預期不同的回應碼,可以使用自訂健康狀態檢查路徑。
Ingress 支援更多進階用途,例如:
以名稱為基礎的虛擬託管:您可以利用 Ingress,將負載平衡器重複用於多個網域名稱和子網域,也可以公開單一 IP 位址和負載平衡器上的多項 Service。查看簡易 fanout 和以名稱為基礎的虛擬託管範例,瞭解如何為這些工作設定 Ingress。
終止 HTTPS:您可以設定 Ingress,使用 Cloud Load Balancer 終止 HTTPS 流量。
刪除 Ingress 後,GKE Ingress 控制器會自動清除相關資源 (除了預留的靜態 IP 位址以外)。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。
刪除所有手動建立的轉送規則和參照 Ingress 的目標 Proxy:
如果目標 Proxy 參照 GKE Ingress 控制器管理的網址對應,在 GKE 1.15.4-gke.22 以上版本中,刪除 Ingress 時會失敗。請檢查 Ingress 資源,找出類似下列錯誤訊息的事件:
Error during GC: error running load balancer garbage collection routine: googleapi: Error 400: The url_map resource 'projects/project-id/global/urlMaps/k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82' is already being used by 'projects/project-id/global/targetHttpsProxies/k8s2-um-tlw9rhgp-default-my82-target-proxy', resourceInUseByAnotherResource
在上述錯誤訊息中,
k8s2-um-tlw9rhgp-default-my82-target-proxy
是手動建立的目標 HTTPS Proxy,仍參照由 Ingress 控制器建立及管理的網址對應k8s2-um-tlw9rhgp-default-my-ingress-9ifnni82
。您必須先刪除這些手動建立的前端資源 (轉送規則和目標 Proxy),才能刪除 Ingress。
刪除 Ingress:這項操作會取消分配暫時外部 IP 位址,也會釋出與您應用程式相關聯的負載平衡資源:
kubectl delete ingress basic-ingress
如果您按照選用步驟建立 Ingress,依路徑轉送要求,請刪除 Ingress:
kubectl delete ingress fanout-ingress
刪除靜態 IP 位址:如果您有按照選用步驟建立靜態 IP 位址,才需要完成這個步驟。
如果您按照「選項 1」操作,將現有的暫時 IP 位址轉換成靜態 IP,請造訪 Google Cloud 主控台來刪除靜態 IP 位址。
如果您按照「選項 2」建立新的靜態 IP 位址,請執行下列指令來刪除該靜態 IP 位址:
gcloud compute addresses delete web-static-ip --global
刪除叢集:這項操作會刪除容器叢集的運算節點和其他資源,例如叢集中的部署:
gcloud container clusters delete loadbalancedcluster
後續步驟
- 如要進一步瞭解 Ingress 功能,請參閱 Ingress 使用手冊。
- 使用 Ingress 為 Ingress 應用程式設定靜態 IP 和網域名稱。
- 為 Ingress 負載平衡器設定 SSL 憑證。
- 瞭解如何搭配 Ingress 使用 Google 代管的 SSL 憑證。
如果您的應用程式在不同地區的多個 Kubernetes Engine 叢集上執行,請設定多叢集 Ingress,將流量轉送到最接近使用者所在地區的叢集。
探索其他 Kubernetes Engine 教學課程。
探索 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。