GKE Gateway で gke-l7-global-external-managed を試してみる
概要
前回の記事で GKE において Gateway API を利用した API のデプロイまでを行いました。
今回は Gateway で GCP の新しい Envoy ベースのロードバランサである External HTTP Global を利用出来る gke-l7-global-external-managed
class が GA となっていたため検証してみます。
External HTTP Classsic との機能差分は以下のドキュメントをご覧ください。
Gateway のデプロイ
gke-l7-global-external-managed
class を指定した以下のマニフェストをデプロイします。
TLS 化については以下の記事をご覧ください。
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