外部 HTTP(S) 負荷分散での Ingress

このページでは、Ingress の外部 HTTP(S) 負荷分散が Google Kubernetes Engine(GKE)でどのように機能するかについて説明します。外部負荷分散向け Ingress を設定して使用する方法もご覧ください。

GKE での負荷分散の使用に関する一般的な情報については、HTTP(S) 負荷分散での Ingress をご覧ください。

概要

Google Cloud の外部 HTTP(S) ロードバランサは、インターネットでアプリケーションを公開するためのグローバルに分散されたロードバランサです。Google の拠点(PoP)をまたいでデプロイされ、世界中に低レイテンシの HTTP(S) 接続を提供します。エニーキャスト ルーティングはロードバランサの IP に使用されるため、インターネット ルーティングで、最も近い Google ロードバランサへの最小コストのパスが判断されます。

GKE Ingress では、外部 HTTP(S) ロードバランサをデプロイして、Pod にグローバル負荷分散をバックエンドとしてネイティブに提供します。

Google Cloud 機能のサポート

次のような機能を使用するために、BackendConfig を使用して外部 HTTP(S) ロードバランサを構成できます。

BackendConfig は、Google Cloud 機能の設定情報を保持するカスタム リソースです。サポートされている機能の詳細については、Ingress 機能をご覧ください。

WebSocket のサポート

外部 HTTP(S) 負荷分散では、WebSocket プロトコルが構成なしで機能します。

WebSocket プロトコルを使用する場合は、デフォルトの 30 秒よりも長いタイムアウト値を使用することをおすすめします。Google Cloud 外部 HTTP(S) ロードバランサ経由で送信される WebSocket トラフィックのバックエンド サービスのタイムアウトは、アイドル状態かどうかにかかわらず、WebSocket 接続をオープン状態に保てる最長時間として解釈されます。

Ingress で構成されたバックエンド サービスのタイムアウト値を設定するには、BackendConfig オブジェクトを作成し、Service マニフェストで beta.cloud.google.com/backend-config アノテーションを使用します。

構成の情報については、バックエンドのレスポンスのタイムアウトをご覧ください。

HTTP(S) ロードバランサの静的 IP アドレス

Ingress オブジェクトを作成すると、クライアントが Service、さらには実行中のコンテナにアクセスするために使用できる外部の固定 IP アドレスを取得できます。 この IP アドレスは、Ingress オブジェクトの存続期間にわたって持続するという意味で固定されます。ただし、Ingress を削除して同じマニフェスト ファイルから新しい Ingress を作成しても、同じ外部 IP アドレスが得られる保証はありません。

Ingress を削除して新しい IP アドレスを作成した後も、同じ永続 IP アドレスが必要な場合は、グローバルな静的外部 IP アドレスを予約する必要があります。その後、Ingress マニフェストに、予約した静的 IP アドレスの名前を示すアノテーションを追加します。

たとえば、my-static-address という名前のグローバル静的外部 IP アドレスを次のように予約しているとします。Ingress マニフェストで、次のように kubernetes.io/ingress.global-static-ip-name を追加します。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-static-address

クライアントとロードバランサ間の HTTPS(TLS)の設定

HTTP(S) ロードバランサは、クライアントとアプリケーションの間のプロキシとして機能します。クライアントからの HTTPS リクエストを受け入れるには、ロードバランサは証明書を持っていなければなりません。これにより、適切な送信先であることをクライアントに示すことができます。さらに、ロードバランサには、HTTPS handshake を完了するための秘密鍵も必要です。

ロードバランサがクライアントからの HTTPS リクエストを受け入れると、クライアントとロードバランサ間のトラフィックは TLS で暗号化されます。ただし、TLS 暗号化はロードバランサで終了し、アプリケーションへのリクエストの転送は暗号化なしに行われます。ロードバランサとアプリケーションの間でトラフィックを暗号化する方法については、ロードバランサとアプリケーション間の HTTPS をご覧ください。

Google マネージド SSL 証明書(ベータ版)またはご自身で管理している証明書を使用できます。Google マネージド証明書を使用する Ingress の作成方法については、Google マネージド SSL 証明書(ベータ版)の使用をご覧ください。

ご自身で作成した証明書とキーを HTTP(S) ロードバランサで利用するために、Kubernetes Secret オブジェクトを作成します。Secret には証明書とキーが格納されます。次の例のように、Ingress マニフェストの tls フィールドに Secret を追加します。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
spec:
  tls:
  - secretName: secret-name
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: service-name
          servicePort: 60000

Secret の変更内容は一定期間ごとに反映されるので、Secret 内のデータを変更した場合、それらの変更がロードバランサに適用されるまでに最大で 10 分かかります。

詳細については、Ingress を使用した HTTP(S) 負荷分散における複数 SSL 証明書の使用をご覧ください。

HTTP の無効化

クライアントと HTTP(S) ロードバランサ間のすべてのトラフィックに HTTPS を使用する場合は、Ingress マニフェストに kubernetes.io/ingress.allow-http アノテーションを追加します。アノテーションの値を "false" に設定します。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: my-ingress-2
  annotations:
    kubernetes.io/ingress.allow-http: "false"
spec:
  tls:
  - secretName: secret-name
  ...

ロードバランサの事前共有証明書

HTTP(S) 終端用に Kubernetes Secret を使用してロードバランサに証明書を提供する代わりに、事前に Google Cloud プロジェクトにアップロードしておいた証明書を使用することもできます。詳細については、事前共有証明書の使用Ingress を使用した HTTP(S) 負荷分散における複数 SSL 証明書の使用をご覧ください。

ロードバランサとアプリケーション間の HTTPS(TLS)

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

ロードバランサとアプリケーションの間で使用されるプロトコルを構成するには、cloud.google.com/app-protocols アノテーションを Service マニフェストで使用します。

次の Service マニフェストでは、2 つのポートを指定しています。そのアノテーションによると、HTTP(S) ロードバランサが Service のポート 80 をターゲットにしているとき、HTTP を使用する必要があります。また、ロードバランサが Service のポート 443 をターゲットにしているとき、HTTPS を使用する必要があります。

apiVersion: v1
kind: Service
metadata:
  name: my-service-3
  annotations:
    cloud.google.com/app-protocols: '{"my-https-port":"HTTPS","my-http-port":"HTTP"}'
spec:
  type: NodePort
  selector:
    app: metrics
    department: sales
  ports:
  - name: my-https-port
    port: 443
    targetPort: 8443
  - name: my-http-port
    port: 80
    targetPort: 50001

次のステップ