透過 Ingress 設定負載平衡

本頁說明如何透過建立 Kubernetes Ingress 物件來設定 HTTP(S) 負載平衡器。Ingress 物件必須與一或多個 Service 物件關聯,而每個 Service 物件都會與一組 Pod 關聯。

Service 對象具有一個或多個 servicePort 結構。Ingress 所鎖定的每個 servicePort 都與 Google Cloud Platform 後端服務資源相關聯。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

多項後端服務

HTTP(S) 負載平衡器提供穩定的 IP 位址,用來將要求轉送到各種後端服務。

在本練習中,您將設定負載平衡器以根據網址路徑將要求轉送到不同的後端服務。將路徑 / 轉送到後端服務的要求,以及具有路徑 /kube 轉送到不同後端服務的要求。

以下大致說明此練習中的步驟:

  1. 建立一個部署並使用名為 hello-world 的服務將其公開。
  2. 建立第二個部署並使用名為 hello-kubernetes 的服務將其公開。
  3. 建立一個 Ingress 以指定將要求轉送到一個或另一個 Service 的規則 (依要求中的網址路徑而定)。在建立 Ingress 時,GKE 輸入控制器會建立並設定 HTTP(S) 負載平衡器。
  4. 測試 HTTP(S) 負載平衡器。

以下是第一個部署的資訊清單:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: world
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: world
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50000"

將資訊清單複製到名為 hello-world-deployment.yaml 的檔案,然後建立部署:

kubectl apply -f hello-world-deployment.yaml

此為公開您第一個部署的 Service 資訊清單:

apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  selector:
    greeting: hello
    department: world
  ports:
  - protocol: TCP
    port: 60000
    targetPort: 50000

針對本練習的目的,以下是 Service 需要瞭解的重要事項:

  • 具有 greeting: hellodepartment: world 標籤的任何 Pod 都是 Service 的成員。

  • 當要求傳送至 TCP 通訊埠 60000 上的 Service 時,會轉送至在 TCP 通訊埠 50000 上的其中一個成員 Pod。

將清單複製到名為 hello-world-service.yaml 的檔案中,然後建立服務:

kubectl apply -f hello-world-service.yaml

此為第二次部署的資訊清單:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-kubernetes-deployment
spec:
  selector:
    matchLabels:
      greeting: hello
      department: kubernetes
  replicas: 3
  template:
    metadata:
      labels:
        greeting: hello
        department: kubernetes
    spec:
      containers:
      - name: hello-again
        image: "gcr.io/google-samples/node-hello:1.0"
        env:
        - name: "PORT"
          value: "8080"

將清單複製到名為 hello-kubernetes-deployment 的檔案,並建立部署:

kubectl apply -f hello-kubernetes-deployment.yaml

此為公開您第二個部署的 Service 資訊清單:

apiVersion: v1
kind: Service
metadata:
  name: hello-kubernetes
spec:
  type: NodePort
  selector:
    greeting: hello
    department: kubernetes
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

針對本練習的目的,以下是 Service 需要瞭解的重要事項:

  • 具有 greeting: hellodepartment: kubernetes 標籤的任何 Pod 都是 Service 的成員。

  • 當要求傳送至 TCP 通訊埠 80 上的 Service 時,會轉送至在 TCP 通訊埠 8080 上的其中一個成員 Pod。

將資訊清單複製到名為 hello-kubernetes-service.yaml 的檔案中,然後建立 Service:

kubectl apply -f hello-kubernetes-service.yaml

以下是 Ingress 的資訊清單:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: hello-world
          servicePort: 60000
      - path: /kube
        backend:
          serviceName: hello-kubernetes
          servicePort: 80

請注意,Ingress 資訊清單有兩個 (serviceNameservicePort) 配對。每個 (serviceNameservicePort) 都與 GCP 後端服務有關。

將資訊清單複製到名為 my-ingress.yaml 的檔案,然後建立 Ingress:

kubectl apply -f my-ingress.yaml

建立 Ingress 時,GKE 輸入控制器會建立 HTTP(S) 負載平衡器,然後依以下內容設定負載平衡器:

  • 當用戶端使用網址路徑 / 向負載平衡器發送要求時,該要求將轉發到通訊埠 60000 上的 hello-world Service。

  • 當用戶端使用網址路徑 /kube 向負載平衡器發送要求時,該要求會轉發到通訊埠 80 上的 hello-kubernetes Service。

等待大約五分鐘,以等待負載平衡器進行設定。

檢視 Ingress:

kubectl get ingress my-ingress --output yaml

輸出顯示了 HTTP(S) 負載平衡器的外部 IP 位址。

status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.1

測試 / 路徑:

curl [LOAD_BALANCER_IP]/

其中,[LOAD_BALANCER_IP] 是負載平衡器的外部 IP 位址。

該輸出顯示 Hello, world! 訊息:

Hello, world!
Version: 2.0.0
Hostname: ...

測試 /kube 路徑:

curl [LOAD_BALANCER_IP]/kube

該輸出會顯示 Hello Kubernetes 訊息:

Hello Kubernetes!

用戶端和負載平衡器之間的 HTTPS

HTTP(S) 負載平衡器是用戶端與應用程式間的 Proxy。如果要接受來自用戶端的 HTTPS 要求,負載平衡器必須要有憑證,以向用戶端證明其身分。負載平衡器還必須要有私密金鑰才能完成 HTTPS 握手。相關參考資訊

停用 HTTP

如果您希望所有用戶端和負載平衡器之間的流量使用 HTTPS,則您可以停用 HTTP。如需更多資訊,請參閱停用 HTTP

負載平衡器和用戶端之間的 HTTPS

如果您在 GKE pod 中執行的應用程式能接收 HTTPS 要求,您可以將負載平衡器設為將要求轉送到您的應用程式時使用 HTTPS。若須更多訊息,請參閱負載平衡器和應用程式之間的 HTTPS (TLS)

用戶端和負載平衡器之間的 HTTP/2

用戶端可以使用 HTTP/2 向負載平衡器傳送要求,您無需再進行設定。

負載平衡器和應用程式之間的 HTTP/2

如果您在 GKE pod 中執行的應用程式能接收 HTTP/2 要求,您可以將負載平衡器設為將要求轉送到您的應用程式時使用 HTTP/2。若須更多資訊,請參閱以 Ingress 進行負載平衡的 HTTP/2

網路端點群組

如果您的叢集支援容器原生負載平衡,則您可以將負載平衡器設定為使用網絡端點群組。若需更多資訊,請參閱使用容器原生負載平衡器一文。

Ingress 註解摘要

kubernetes.io/ingress.allow-http
指定是否允許用戶端與 HTTP (S) 負載平衡器之間的 HTTP 通訊。可能的值為「true」和「false」,預設為「true」。請參閱停用 HTTP
ingress.gcp.kubernetes.io/pre-shared-cert
您可以將憑證和金鑰上傳到 GCP 專案。使用此註解以參照憑證和金鑰。在 HTTP(S) 負載平衡中使用多個 SSL 憑證。
kubernetes.io/ingress.global-static-ip-name
使用此註解來指定負載平衡器應使用之前建立的靜態外部 IP 地址。請參閱 HTTP(S) 負載平衡器的靜態 IP 位址
service.alpha.kubernetes.io/app-protocols
使用此註解可設定負載平衡器與應用程式之間的通訊協定。可能的通訊協定為 HTTP、HTTPS 和 HTTP/2。 請參閱負載平衡器與您應用程式之間的 HTTPS用於與 Ingress 進行負載平衡的 HTTP/2
beta.cloud.google.com/backend-config
使用此註解以設定與 servicePort 關聯的後端服務。請參閱 BackendConfig 自訂資源
cloud.google.com/neg
使用此註解指定負載平衡器應使用網絡端點群組。使用容器原生負載平衡功能

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件