GKE Gateway で Namespace を跨いでリソースを配置する
概要
前回の記事で GKE において Gateway API を利用した API のデプロイまでを行いました。
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
の設定の詳細に関しては公式ドキュメントをご覧ください。
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