【Kubernetes・GKE】IngressではなくGatewayを利用して、異なるnamespace上のサービスにroutingする
記事の内容
GKE上で動作するKubernetesクラスターにIngressではなくGatewayを利用することで、異なるnamespaceのサービスにトラフィックをルーティングします。
記事の長さ
1分で読めます
Gatewayの設定
gateway.yaml
kind: Gateway
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: default-namesapce-gateway
namespace: default
spec:
gatewayClassName: gke-l7-global-external-managed
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
kinds:
- kind: HTTPRoute
namespaces:
from: Selector
selector:
matchLabels:
expose-apps: "true"
というGatewayを作成します。このGatewayをKubernetesクラスターにapplyすると、defaultネームスペースにGatewayが作成されて、このGatewayがGCP上にロードバランサーを作成します。
そして、
allowedRoutes:
kinds:
- kind: HTTPRoute
namespaces:
from: Selector
selector:
matchLabels:
expose-apps: "true"
この設定値を追加していることで、expose-apps: "true"
というlabelがついているnamespaceにトラフィックを流すことができるようになります。
Namespaceの作成
expose-apps: "true"
というラベルが付与されたnamespace
を作成します。
namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: other
labels:
expose-apps: "true"
annotations:
argocd.argoproj.io/sync-options: Prune=false
このマニフェストファイルをkubectl apply
すると、other
というexpose-apps: "true"
ラベルが付与されたnamespaceが作成されます。
このnamespaceの中に作成されたHTTP Routeは先ほど作成したdefault-namespace-gateway
をparentRefsとして指定することができるようになります。
HTTP Routeの設定
http-route.yaml
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1beta1
metadata:
name: default-namesapce-httproute
namespace: other
spec:
parentRefs:
- kind: Gateway
name: default-namesapce-gateway
namespace: default
hostnames:
- "example.com"
rules:
- backendRefs:
- name: nginx
port: 80
先ほど作成したGatewayをparentRefsとして持つHTTPRouteを他のネームスペース(other
)に作成します。
このHTTP Routeを作成することで、異なるネームスペースからdefaultネームスペースにあるGatewayと接続することができます。
- Gateway
- namespace
- HTTP Route
の作成が完了したら、HTTP RouteのbackendRefs
に指定しているサービスに対してインターネット上からアクセスできるようになります。
まとめ
Ingressを利用すると異なるnamespaceにルーティングできないため、GatewayとHTTP Routeを利用して異なるnamespaceにトラフィックをルーティングしました。
note
勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。
Discussion