使用輸入設定 HTTP 負載平衡

本教學課程說明如何透過設定 Ingress 資源,在 HTTP 負載平衡器後方執行網路應用程式。

背景

針對可公開存取的應用程式適用的兩種雲端負載平衡,GKE 提供整合式支援:

  1. 您可以在 Service 資源資訊清單上指定 type: LoadBalancer,以建立 TCP/UDP 負載平衡器。雖然 TCP 負載平衡器適用於 HTTP 網路伺服器,但這些伺服器無法得知個別 HTTP(S) 要求,因此不適合用來終止 HTTP(S) 流量。GKE 不會為 TCP/UDP 負載平衡器設定任何健康狀態檢查。如需這類負載平衡器的範例,請參閱留言板教學課程

  2. 您可以使用 Ingress 資源來建立 HTTP(S) 負載平衡器。HTTP(S) 負載平衡器可終止 HTTP(S) 要求,並能做出更好的情境感知負載平衡決策。HTTP(S) 負載平衡器提供的功能包括可自訂的網址對應TLS 終止等。GKE 會自動為 HTTP(S) 負載平衡器設定健康狀態檢查

如果您要公開在 GKE 上託管的 HTTP(S) 服務,建議您使用 HTTP(S) 負載平衡這個方法進行負載平衡。

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud 會包含在 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具中輸入專案 IDCompute Engine 區域選項的時間,建議您設定預設設定:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

建立容器叢集

請執行下列指令,建立名為 loadbalancedcluster 的容器叢集:

gcloud container clusters create loadbalancedcluster

步驟 1:部署網路應用程式

使用範例網路應用程式容器映像檔建立部署,監聽通訊埠 8080 上的 HTTP 伺服器:

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080

步驟 2:在內部將部署公開為 Service

建立 Service 資源,以在容器叢集中存取讓 web 部署可供存取:

kubectl expose deployment web --target-port=8080 --type=NodePort

使用這個指令建立 NodePort 類型的 Service 時,GKE 會讓叢集中的所有節點透過隨機選取的高通訊埠號碼 (例如 32640) 存取 Service。

確認 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 資源。

步驟 3:建立 Ingress 資源

Ingress 是 Kubernetes 資源,封裝了一組規則和設定,可將外部 HTTP(S) 流量轉送至內部服務。

在 GKE 上,Ingress 會透過 Cloud Load Balancing 實作。在叢集中建立 Ingress 時,GKE 會建立一個 HTTP(S) 負載平衡器,並設定為將流量轉送至您的應用程式。

由於 Kubernetes Ingress 是一項測試版資源,因此您描述 Ingress 物件的方式可能會有變動,但 GKE 佈建來實作 Ingress 的 Cloud Load Balancer 可在實際工作環境中使用。

下列設定檔定義的 Ingress 資源會將流量導向至您的 web Service:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
spec:
  backend:
    serviceName: web
    servicePort: 8080

如要部署這個 Ingress 資源,請下載 basic-ingress.yaml 並執行下列指令:

kubectl apply -f basic-ingress.yaml

部署此資訊清單後,Kubernetes 會在您的叢集上建立 Ingress 資源。在叢集上執行的 Ingress 控制器會負責建立 HTTP(S) 負載平衡器,將通訊埠 80 上的所有外部 HTTP 流量轉送至您公開的 web NodePort Service。

步驟 4:造訪您的應用程式

請執行下列指令,找出為您的應用程式提供服務的負載平衡器外部 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

您可以造訪 GCP 主控台的 Load Balancing (負載平衡) 頁面,檢查 Ingress 控制器建立的網路資源。

步驟 5:(選用) 設定靜態 IP 位址

在網域名稱上公開網路伺服器時,您必須將應用程式的外部 IP 位址設為不會變動的靜態 IP。

根據預設,GKE 會為透過 Ingress 公開的 HTTP 應用程式分配暫時的外部 IP 位址。暫時位址可能會有變動。對於您規劃很久的網路應用程式,您必須使用靜態外部 IP 位址

請注意,為 Ingress 資源設定靜態 IP 後,刪除 Ingress 時將不會一併刪除與其關聯的靜態 IP 位址。如果您不再需要使用這些靜態 IP 位址,請務必清除設定。

選項 1:將現有的暫時 IP 位址轉換為靜態 IP 位址

如果您已部署 Ingress,可前往 GCP 主控台的「External IP addresses」(外部 IP 位址) 部分,將應用程式現有的暫時 IP 位址轉換成預留的靜態 IP 位址,無須變更外部 IP 位址。

選項 2:預留新的靜態 IP 位址

請執行下列指令,預留名為 web-static-ip靜態外部 IP 位址

gcloud compute addresses create web-static-ip --global

現在,您需要設定現有的 Ingress 資源以使用預留的 IP 位址。請將 basic-ingress.yaml 資訊清單內容換成下列資訊清單

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
spec:
  backend:
    serviceName: web
    servicePort: 8080

這項變更會在 Ingress 上新增註解,以使用名為 web-static-ip 的靜態 IP 資源。如要將這項變更套用至現有的 Ingress,請執行下列指令:

kubectl apply -f basic-ingress.yaml

執行 kubectl get ingress basic-ingress 並等待應用程式的 IP 位址變更為 web-static-ip 資源的預留 IP 位址。

您可能需要等待幾分鐘,系統才能更新現有的 Ingress 資源、重新設定負載平衡器,並將負載平衡規則傳播至全球各地。這項作業完成後,GKE 會釋出先前分配給應用程式的暫時 IP 位址。

步驟 6:(選用) 在單一負載平衡器上提供多個應用程式

您可以在 Ingress 上設定轉送規則,以在單一負載平衡器和公開 IP 上執行多項服務。您可以將多項服務託管在相同的 Ingress 上,就不需要為每項公開至網際網路的 Service 建立額外的負載平衡器 (計費資源)。

使用同一個網路應用程式的 2.0 版本建立另一個網路伺服器部署:

kubectl run web2 --image=gcr.io/google-samples/hello-app:2.0 --port=8080

接著,將 web2 部署在內部公開至 NodePort Service 上的 web 叢集:

kubectl expose deployment web2 --target-port=8080 --type=NodePort

下列資訊清單說明 Ingress 資源:

  • 使用開頭為 /v2/ 的路徑將要求轉送至 web2 Service
  • 將所有其他要求轉送至 web Service
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: fanout-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 8080
      - path: /v2/*
        backend:
          serviceName: web2
          servicePort: 8080

如要部署此資訊清單,請將其儲存到 fanout-ingress.yaml,並執行下列指令:

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)

在 GKE Ingress 上,path 欄位只支援使用 * 字元進行萬用字元模式比對。舉例來說,您可以在 path 欄位中輸入像是 /*/foo/bar/* 的規則。有關 path 的限制,請參閱網址對應說明文件

附註

根據預設,Ingress 會透過在 / 路徑做出 GET 要求,執行定期健康狀態檢查,以判斷該應用程式的健康狀態,並預期 HTTP 200 回應。如果您想要檢查不同的路徑,或預期不同的回應碼,您可以使用自訂健康狀態檢查路徑

Ingress 支援更多進階用途,例如:

  • 以名稱為基礎的虛擬託管:您可以利用 Ingress,將負載平衡器重複用於多個網域名稱和子網域,也可以公開單一 IP 位址和負載平衡器上的多項 Service。查看簡易 fanout以名稱為基礎的虛擬託管範例,瞭解如何為這些工作設定 Ingress。

  • HTTPS 終止:您可以使用 Cloud Load Balancer 設定 Ingress 終止 HTTPS 流量。

刪除 Ingress 後,Ingress 控制器會自動清除相關資源 (除了預留的靜態 IP 位址以外)。

清除資源

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  1. 刪除 Ingress:這項操作會取消分配暫時外部 IP 位址,也會釋出與您應用程式相關聯的負載平衡資源:

    kubectl delete ingress basic-ingress

    如果您有按照「步驟 6」操作,請執行下列指令以刪除 Ingress:

    kubectl delete ingress fanout-ingress

  2. 刪除靜態 IP 位址:如果您有按照步驟 5 操作,才需要執行這個作業。

    • 如果您按照步驟 5 的「選項 1」操作,將現有的暫時 IP 位址轉換成靜態 IP,請造訪 GCP 主控台來刪除靜態 IP。

    • 如果您按照步驟 5 的「選項 2」操作,請執行下列指令以刪除靜態 IP 位址:

      gcloud compute addresses delete web-static-ip --global
  3. 刪除叢集:這項操作會刪除容器叢集的運算節點和其他資源,例如叢集中的部署:

    gcloud container clusters delete loadbalancedcluster

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 教學課程