このページでは、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コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- Kubernetes Ingress と Service のリソースについて確認します。
- 外部アプリケーション ロードバランサの HTTP/2 の上限をご覧ください。
Deployment を作成する
次のマニフェストを
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 を記述しています。マニフェストをクラスタに適用します。
kubectl apply -f my-deployment.yaml
Service を作成する
次のマニフェストを
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: 443、protocol: TCP、targetPort: 8433: TCP ポート 443 の Service に送信されるトラフィックを、いずれかのメンバー Pod の TCP ポート 8443 にルーティングするように指定します。
マニフェストをクラスタに適用します。
kubectl apply -f my-service.yamlService を表示します。
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 を作成する
次のマニフェストを
my-ingress.yamlという名前のファイルにコピーします。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echomap spec: defaultBackend: service: name: echoheaders port: number: 443このマニフェストでは、受信リクエストを
echoheadersService のメンバーである Pod に送信することを指定する Ingress を記述しています。リクエストは、echoheadersService マニフェストで指定されたtargetPortの Pod にルーティングされます。この演習では、PodtargetPortは8443です。マニフェストをクラスタに適用します。
kubectl apply -f my-ingress.yamlKubernetes Ingress コントローラがアプリケーション ロードバランサを構成する間、このコマンドが完了するまでに数分かかることがあります。
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
バックエンド サービスを一覧表示します。
gcloud compute backend-services listバックエンド サービスの説明を設定します。
gcloud beta compute backend-services describe BACKEND_SERVICE_NAME --globalBACKEND_SERVICE_NAMEは、バックエンド サービスの名前に置き換えます。出力では、
protocolがHTTP2であることが示されます。backends: ... description: '{...,"kubernetes.io/service-port":"443","x-features":["HTTP2"]}' ... kind: compute#backendService loadBalancingScheme: EXTERNAL protocol: HTTP2 ...
コンソール
Google Cloud コンソールで [ロード バランシング] ページに移動します。
[名前] で、ロードバランサを探します。
バックエンド サービスを表示するには、ロードバランサの名前をクリックします。
バックエンド サービスのエンドポイント プロトコルが 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 が使用されたことを示します。
次のステップ
Ingress を使用してアプリケーションに静的 IP アドレスとドメイン名を構成する。
Ingress ロードバランサの SSL 証明書を構成する。