📚

【Kubernetes・GKE】IngressではなくGatewayを利用して、異なるnamespace上のサービスにroutingする

2024/05/30に公開

記事の内容

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で配信しています。

https://note.com/ring_belle/membership

Discussion