🚸

GKE Gateway で Namespace を跨いでリソースを配置する

2023/10/07に公開

概要

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

Ingress で実現出来なかった、バックエンドのリソースを別の Namespace に配置しながら Gateway を一元管理する方法を検証してみます。

別の Namespace から Gateway に接続する

設定更新

store Namespace の HTTP Route から default Namespace の Gateway に接続してみます。

store Namespace にバックエンドをデプロイしたのち、以下のマニフェストで HTTP Route をデプロイします。

kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
  name: store-external
  namespace: store # Gateway とは異なる Namespace に設定を追加します
spec:
  parentRefs:
  - kind: Gateway
    name: gateway
    namespace: default
  hostnames:
  - "gateway.tetsuya28.com"
  rules:
  - backendRefs:
    - name: store-v1
      port: 8080
  - matches:
    - headers:
      - name: env
        value: canary
    backendRefs:
    - name: store-v2
      port: 8080
  - matches:
    - path:
        value: /de
    backendRefs:
    - name: store-german
      port: 8080

動作確認

バックエンドリソースを別の Namespace ( store ) に配置して Gateway 経由でアクセスしてみます。

404 が返ってきます。

curl -i https://gateway.tetsuya28.com/
HTTP/2 404
date: Sat, 08 Apr 2023 11:53:15 GMT
content-length: 74
content-type: text/plain; charset=utf-8
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

response 404 (backend NotFound), service rules for the path non-existent

現状の Gateway の設定を確認してみます。

デフォルトの設定だと Gateway は同一の Namespace の HTTP Route からの接続のみ許可します。

apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: gateway
  namespace: default
spec:
  gatewayClassName: gke-l7-gxlb
  listeners:
  - allowedRoutes:
      namespaces:
        from: Same

Gateway の設定を更新する

設定更新

この Gateway に対して他の Namespace から接続を行えるように設定を更新します。

Gateway の allowedRoutes に設定を追加することで Gateway がデプロイされている Namespace 以外にデプロイしたバックエンドとの接続を行うことが出来ます。

接続を行う Namespace は allowedRoutes.namespaces に追加します。

namespaces.from には Same, All, Selector が利用出来ます。

今回は特定のラベル ( shared-gateway-access: "true" ) が付与されている Namespace からのみの接続を許可するため Selector を利用します。

Gateway の allowedRoutes の設定の詳細に関しては公式ドキュメントをご覧ください。

https://gateway-api.sigs.k8s.io/v1alpha2/references/spec/#gateway.networking.k8s.io%2Fv1beta1.AllowedRoutes

spec:
  gatewayClassName: gke-l7-gxlb
  listeners:
    - name: https
      ...
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels:
              shared-gateway-access: "true"

上記で設定したラベルを対象の Namespace にも付与します。

apiVersion: v1
kind: Namespace
metadata:
  name: store
  labels:
    shared-gateway-access: "true"

動作確認

適用後、暫くしてロードバランサの設定が更新されると、異なる Namespace に配置されているバックエンドに対してアクセスを行うことが確認出来ます。

curl -i https://gateway.tetsuya28.com/
HTTP/2 200
server: Werkzeug/2.2.2 Python/3.10.9
date: Sat, 08 Apr 2023 12:18:23 GMT
content-type: application/json
content-length: 365
access-control-allow-origin: *
via: 1.1 google
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

{
  "cluster_name": "tetsuya28",
  "gce_instance_id": "3864015078128664451",
  "gce_service_account": "tetsuya28.svc.id.goog",
  "host_header": "gateway.tetsuya28.com",
  "metadata": "store-v1",
  "pod_name": "store-v1-84c89967f8-lkfwf",
  "pod_name_emoji": "🔶",
  "project_id": "tetsuya28",
  "timestamp": "2023-04-08T12:18:23",
  "zone": "asia-northeast1-c"
}

Discussion