用於與 Ingress 進行負載平衡的 HTTP/2

本頁說明如何使用 Kubernetes IngressService 物件來設定 HTTP(S) 負載平衡器,以使用 HTTP/2 來與後端服務通訊。此功能從 Google Kubernetes Engine 1.11.2 版本開始提供。

總覽

HTTP(S) 負載平衡器是用戶端與應用程式間的 Proxy。用戶端可以使用 HTTP/1.1 或 HTTP/2 與負載平衡器 Proxy 進行通訊。但是,負載平衡器 Proxy 與應用程式間的連結預設使用 HTTP/1.1。如果您在 Google Kubernetes Engine pod 中執行的應用程式能夠接收 HTTP/2 要求,則您可以將負載平衡器設定為使用 HTTP/2 將要求轉發給您的應用程式。

顯示從負載平衡器到 pod 的 HTTP/2 圖表 (按一下可放大)

在本練習中,您將建立部署、服務和 Ingress。您會在服務清單中新增 cloud.google.com/app-protocols 註解,以指定負載平衡器應使用 HTTP/2 與您的應用程式進行通訊。然後,您將呼叫您的服務,並驗證您的應用程式是否收到了 HTTP/2 要求。

事前準備

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

  • 確認您已啟用 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

建立部署

這個部署資訊清單宣告您要執行 echoheaders 網路應用程式的兩個備用資源:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: echoheaders
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: echoheaders
    spec:
      containers:
      - name: echoheaders
        image: k8s.gcr.io/echoserver:1.10
        ports:
        - containerPort: 8443

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

kubectl apply -f my-deployment.yaml

建立 Service

以下是 Service 的資訊清單:

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
  name: echoheaders
  labels:
    app: echoheaders
spec:
  type: NodePort
  ports:
  - port: 443
    targetPort: 8443
    protocol: TCP
    name: my-port
  selector:
    app: echoheaders

將資訊清單儲存到名為 my-service.yaml 的檔案,然後建立 Service:

kubectl apply -f my-service.yaml

查看 Service:

kubectl get service echoheaders --output yaml

輸出結果會與下列內容相似:

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/app-protocols: '{"my-port":"HTTP2"}'
    ...
  labels:
    app: echoheaders
  name: echoheaders
  ...
spec:
  clusterIP: 10.39.251.148
  ...
  ports:
  - name: my-port
    nodePort: 30647
    port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    app: echoheaders
  ...
  type: NodePort
...

就本練習而言,以下是 Ingress 需要注意的重要事項:

  • 服務具有 NodePort 類型。這是要與 Ingress 建立關聯的 Service 所需要的類型。

  • 具有標籤 app: echoheaders 的任何 Pod 都是 Service 的成員。這是由 selector 欄位所指定。

  • 該 Service 有一個通訊埠,名為 my-portcloud.google.com/app-protocols 註解指定 my-port 應使用 HTTP/2 通訊協定。

  • 導向 TCP 通訊埠 443 上服務的流量會轉送到其中一個成員 Pod 中的 TCP 通訊埠 8443。這是由 porttargetPort 欄位所指定。

建立 Ingress

以下是 Ingress 的資訊清單:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echomap
spec:
  backend:
    serviceName: echoheaders
    servicePort: 443

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

kubectl apply -f my-ingress.yaml

請稍候幾分鐘,讓 Kubernetes Ingress 控制器設定 HTTP(S) 負載平衡器,然後查看 Ingress:

kubectl get ingress echomap --output yaml

輸出結果會與下列內容相似:

kind: Ingress
metadata:
  ...
  name: echomap
  ...
spec:
  backend:
    serviceName: echoheaders
    servicePort: 443
status:
  loadBalancer:
    ingress:
    - ip: 203.0.113.2

針對本練習的目的,以下是輸入需要注意的重要事項:

  • 連入流量的 IP 位址列於 loadBalancer:ingress 底下。

  • 傳入要求會路由到 Pod,該 Pod 為 echoheaders Service 的成員。在本練習中,成員 Pod 具有標籤 app: echoheaders

  • 要求將路由到 echoheaders 服務清單中指定目標通訊埠上的 Pod。在本練習中,Pod 目標通訊埠為 8443。

驗證您的負載平衡器是否支援 HTTP/2

gcloud

  1. 列出您的後段服務:

    gcloud compute backend-services list
    
  2. 描述您的後端服務:

    gcloud beta compute backend-services describe [BACKEND_SERVICE_NAME] --global
    

    其中 [BACKEND_SERVICE_NAME] 是後端服務的名稱。

  3. 在輸出中,請驗證通訊協定是 HTTP/2:

    backends:
    ...
    description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}'
    ...
    kind: compute#backendService
    loadBalancingScheme: EXTERNAL
    protocol: HTTP2
    ...
    

主控台

  1. 前往 Google Cloud Platform 主控台的「負載平衡」頁面。
    前往負載平衡頁面

  2. 名稱下,找到負載平衡器。

    Google Cloud Platform 主控台中顯示的 HTTP 負載平衡器的螢幕擷圖 (按一下可放大)
  3. 按一下負載平衡器的名稱以查看您的後端服務。

  4. 驗證後端服務的端點協議是否為 HTTP/2

    Google Cloud Platform 主控台中顯示的 HTTP/2 後端服務螢幕擷圖 (按一下可放大)

呼叫您的服務

請等待幾分鐘,以讓負載平衡器和後端服務完成設定。在瀏覽器的網址列中輸入負載平衡器的外部 IP 位址。

該輸出會顯示有關從負載平衡器到 Pod 的要求資訊:

Hostname: echoheaders-7886d5bc68-xnrwj
...
Request Information:
    ...
    method=GET
    real path=/
    query=
    request_version=2
    request_scheme=https
    ...

Request Headers:
    ...
    x-forwarded-for=[YOUR_IP_ADDRESS], 203.0.113.2
    x-forwarded-proto=http
...

就本練習而言,以下是之前的輸出中需要注意的重要事項:

  • request_version=2 列表示負載平衡器和 Pod 之間的要求使用了 HTTP/2。

  • x-forwarded-proto=http 表示您和負載平衡器之間的要求使用的是 HTTP 1.1,而非 HTTP/2。

後續步驟

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

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

這個網頁
Kubernetes Engine 說明文件