Ingress による HTTP/2 を使用したロード バランシング


このページでは、Kubernetes の Ingress オブジェクトと Service オブジェクトを使用して、バックエンド サービスとの通信で HTTP/2 を使用するように外部アプリケーション ロードバランサを構成する方法について説明します。

概要

アプリケーション ロードバランサは、クライアントとアプリケーションの間のプロキシとして機能します。クライアントは、HTTP/1.1 または HTTP/2 を使用してロードバランサ プロキシと通信できます。ただし、ロードバランサ プロキシからアプリケーションへの接続は、デフォルトで HTTP/1.1 を使用します。Google Kubernetes Engine(GKE)Pod で実行中のアプリケーションで HTTP/2 リクエストを受信できる場合、アプリケーションにリクエストを転送するときに HTTP/2 を使用するように外部ロードバランサを構成します。

この演習では、Deployment、Service、Ingress を作成します。Service マニフェストに 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 つある Deployment を記述しています。

  2. マニフェストをクラスタに適用します。

    kubectl apply -f my-deployment.yaml
    

Service を作成する

  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 タイプの Service であることを指定します。
    • app: echoheaders: このラベルを持つすべての Pod が Service のメンバーであることを指定します。
    • cloud.google.com/app-protocols: my-port が HTTP/2 プロトコルを使用することを指定します。
    • port: 443protocol: TCPtargetPort: 8433: TCP ポート 443 の Service に送信されるトラフィックを、いずれかのメンバー Pod の TCP ポート 8422 にルーティングするように指定します。
  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
    

    このマニフェストでは、受信リクエストを echoheaders Service のメンバーである Pod に送信することを指定する Ingress を記述しています。リクエストは、echoheaders Service マニフェストで指定された 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 Console の [ロード バランシング] ページに移動します。

    [Cloud Load balancing] に移動

  2. [名前] で、ロードバランサを探します。

  3. バックエンド サービスを表示するには、ロードバランサの名前をクリックします。

  4. バックエンド サービスのエンドポイント プロトコルHTTP/2 であることを確認します。

Service を呼び出す

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/2 ではなく HTTP 1.1 が使用されたことを示します。

次のステップ