このページでは、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
を実行して最新のバージョンを取得します。
- 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 ポート 8422 にルーティングするように指定します。
マニフェストをクラスタに適用します。
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 を作成する
次のマニフェストを
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 にルーティングされます。この演習では、PodtargetPort
は8443
です。マニフェストをクラスタに適用します。
kubectl apply -f my-ingress.yaml
Kubernetes 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 --global
BACKEND_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 証明書を構成する。