使用 HTTP/2 進行 Ingress 負載平衡


本頁說明如何使用 Kubernetes IngressService 物件,設定外部應用程式負載平衡器,以使用 HTTP/2 與後端服務通訊。

總覽

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

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

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。

建立 Deployment

  1. 將下列資訊清單複製到名為 my-deployment.yaml 的檔案:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echoheaders
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: echoheaders
      template:
        metadata:
          labels:
            app: echoheaders
        spec:
          containers:
          - name: echoheaders
            image: registry.k8s.io/echoserver:1.10
            ports:
            - containerPort: 8443
    

    這個資訊清單說明含有兩個 echoheaders 網路應用程式副本的部署。

  2. 將資訊清單套用至叢集:

    kubectl apply -f my-deployment.yaml
    

建立服務

  1. 將下列資訊清單複製到名為 my-service.yaml 的檔案:

    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
    

    這份資訊清單說明具有下列屬性的 Service:

    • type: NodePort:指定這是 NodePort 類型的服務。
    • app: echoheaders:指定具有這個標籤的任何 Pod 都是 Service 的成員。
    • cloud.google.com/app-protocols:指定 my-port 應使用 HTTP/2 通訊協定。
    • port: 443protocol: TCPtargetPort: 8433:指定導向 TCP 通訊埠 443 上服務的流量,應轉送到其中一個成員 Pod 中的 TCP 通訊埠 8443。
  2. 將資訊清單套用至叢集:

    kubectl apply -f my-service.yaml
    
  3. 查看 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

  1. 將下列資訊清單複製到名為 my-ingress.yaml 的檔案:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: echomap
    spec:
      defaultBackend:
        service:
          name: echoheaders
          port:
            number: 443
    

    這個資訊清單說明 Ingress,該 Ingress 會指定傳入要求傳送至 echoheaders Service 的成員 Pod。要求會轉送到 echoheaders 服務資訊清單中指定的 targetPort 上的 Pod。在本練習中,Pod targetPort8443

  2. 將資訊清單套用至叢集:

    kubectl apply -f my-ingress.yaml
    

    Kubernetes Ingress 控制器設定應用程式負載平衡器時,這個指令可能需要幾分鐘才能完成。

  3. 檢視 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
    

    在這個輸出內容中,Ingress 的 IP 位址為 203.0.113.2

測試負載平衡器

gcloud

  1. 列出您的後段服務:

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

    gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --global
    

    BACKEND_SERVICE_NAME 改為後端服務名稱。

    輸出內容會指定 protocolHTTP2

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

控制台

  1. 前往 Google Cloud 控制台的「Load balancing」(負載平衡) 頁面。

    前往「Load balancing」(負載平衡) 頁面

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

  3. 按一下負載平衡器的名稱以查看您的後端服務。

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

呼叫您的服務

請稍候幾分鐘,讓 GKE 設定負載平衡器和後端服務,然後在瀏覽器的網址列中輸入負載平衡器的外部 IP 位址。

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

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
...

這項輸出資訊與從負載平衡器到 Pod 的要求有關:

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

後續步驟