🚀

GKE Gateway で gke-l7-global-external-managed を試してみる

2023/10/07に公開

概要

前回の記事で GKE において Gateway API を利用した API のデプロイまでを行いました。
https://zenn.dev/tetsuya28/articles/gke-gateway-intro

今回は Gateway で GCP の新しい Envoy ベースのロードバランサである External HTTP Global を利用出来る gke-l7-global-external-managed class が GA となっていたため検証してみます。

External HTTP Classsic との機能差分は以下のドキュメントをご覧ください。

https://cloud.google.com/load-balancing/docs/https

https://cloud.google.com/load-balancing/docs/features

Gateway のデプロイ

gke-l7-global-external-managed class を指定した以下のマニフェストをデプロイします。

TLS 化については以下の記事をご覧ください。

https://zenn.dev/tetsuya28/articles/gke-gateway-ssl

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: gateway
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
      tls:
        mode: Terminate
        options:
          networking.gke.io/pre-shared-certs: gateway

適用後暫くすると External HTTP Global なロードバランサが作成されていることが確認出来ます。

HTTP から HTTPS のリダイレクト

gke-l7-gxlb class では実現出来なかった HTTPS へのリダイレクトについても確認してみます。

ここまでで構築した環境は 443 port のみ設定を行っているため現状 80 port にアクセスしてもサイトを利用することは出来ません。

curl -i http://gateway.tetsuya28.com/
curl: (56) Recv failure: Connection reset by peer

そこで先ほど作成した External HTTP Global に 80 port の設定を追加します。

先ほど利用したマニフェストに http 用のリスナーを追加します。

HTTPS リダイレクトを行う際は、対象の Namespace においてリダイレクト用のリスナーの他に HTTP Route が存在していないことが必須となります。

これは同一 Namespace に他の HTTP Route が存在する場合、他の HTTP Route の設定もロードバランサのルーティングルールに追加されてしまうためリダイレクト用のルーティングルールが効かなくなるためだと思われます。

今回の場合は Gateway とリダイレクト用の HTTP Route のみ default Namespace に作成し、バックエンドのリソースは store Namespace を利用しています。

kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: gateway
spec:
  gatewayClassName: gke-l7-global-external-managed
  listeners:
    # http リスナーを追加
    - name: http
      protocol: HTTP
      port: 80
      allowedRoutes:
        kinds:
        - kind: HTTPRoute
        namespaces:
          from: Same
    - name: https
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels:
              shared-gateway-access: "true"
    ...

適用後、 External HTTP Global なロードバランサが 1 つ追加されます。
新しく追加された方のロードバランサはプロトコルが HTTP となっています。

この状態で 80 port でアクセスするとルーティングルール ( HTTP Route ) が存在しないため、デフォルトの 404 が返ってきます。

curl -i http://gateway.tetsuya28.com/
HTTP/1.1 404 Not Found
Content-Length: 18
content-type: text/plain
via: 1.1 google
date: Sun, 09 Apr 2023 03:30:52 GMT

fault filter abort

この状態で HTTP から HTTPS にリダイレクトするための HTTP Route リソースを以下のマニフェストを用いて適用します。

kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: https-redirect
spec:
  parentRefs:
    - kind: Gateway
      name: gateway
      namespace: default
      sectionName: http
  rules:
    - filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https

すると、以下のように HTTP 用のロードバランサに HTTPS へのリダイレクト用のルーティングルールが追加されます。


この状態で 80 port にアクセスすると期待通り 443 port へのリダイレクトが行われました。

curl -i http://gateway.tetsuya28.com/
HTTP/1.1 301 Moved Permanently
Cache-Control: private
Location: https://gateway.tetsuya28.com:443/
Content-Length: 0
Date: Sun, 09 Apr 2023 03:15:48 GMT
Content-Type: text/html; charset=UTF-8

Discussion