【Kubernetes】Gateway API と HTTPRoute を使った実践ルーティング入門

kubenetesロゴ

Kubernetesでの次世代インジェス(Ingress)として注目されている「Gateway API」。従来のIngressよりも柔軟で、かつ拡張性が高いルーティング制御が可能になります。

今回は、KillercodaのPlayground環境をベースに、Gateway と HTTPRoute を使って「/desktop」と「/mobile」のパスに応じてトラフィックを別々のサービス(Pod)に振り分けるハンズオンを解説します。

💡 前提条件 本記事では alias k="kubectl" を設定した状態でコマンドを記載しています。エイリアスを設定していない方は、適宜 k を kubectl に読み替えて実行してください。

Step 1: デプロイメント(Deployment)の作成

まずは、ルーティング先となる2つのアプリケーション(desktop用とmobile用)のDeploymentを作成します。

1.desktop用 Deploymentの作成

以下の内容を desctop-deploy.yaml という名前で保存します。

vi desctop-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: desktop-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: desktop
  template:
    metadata:
      labels:
        app: desktop
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        command: ["/bin/sh", "-c"]
        args:
          - |
            echo "hello desktop" > /usr/share/nginx/html/index.html;
            nginx -g 'daemon off;'

保存したら、マニフェストを適用します。

k apply -f desctop-deploy.yaml

2. mobile用 Deploymentの作成

続いて、以下の内容を mobile-deploy.yaml という名前で保存します。

vi mobile-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mobile-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mobile
  template:
    metadata:
      labels:
        app: mobile
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
        command: ["/bin/sh", "-c"]
        args:
          - |
            echo "hello mobile" > /usr/share/nginx/html/index.html;
            nginx -g 'daemon off;'

マニフェストを適用します。

k apply -f mobile-deploy.yaml

3. 作成の確認

Deploymentが正常に作成されたか確認しましょう。

k get deploy

Step 2: サービス(Service)の作成

次に、作成した各Deploymentをクラスター内部から呼び出せるように、Service(SVC)を作成します。ここでは kubectl expose コマンドを使って手軽に作成します。

desktop-appのSVCを作成

k expose deploy desktop-app --port=80 --name=desktop-svc

mobile-appのSVCを作成

k expose deploy mobile-app --port=80 --name=mobile-svc

動作確認(curlで検証)

確認用の使い捨てPod(tmp)を起動し、内部から各Serviceにアクセスできるか確認します。

k run tmp --image=nginx:alpine --restart=Never --rm -it -- sh

Pod内のシェルに入ったら、以下の curl コマンドを実行してみてください。

# 確認用コマンド
curl desktop-svc
curl mobile-svc

Step 3: Gatewayのインストールと作成

Gateway APIを利用するためには、環境に GatewayClass(CRD) と Gateway Controller が必要です。

通常、標準環境には含まれていないため、以下の手順でインストールを行います。(※すでにインストール済みの方はスキップして構いません)

まずは、現状の確認コマンドを入力してみます。

kubectl get gatewayclass

この段階でエラーになる、もしくはリソースが存在しない場合は、以下の手順を進めてください。

1. GatewayClass(CRD)のインストール

Gateway API 公式ドキュメントに準拠し、標準のインストールマニフェストを適用します。

kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml

適応後、再度確認します。

kubectl get gatewayclass

これでCRDが認識されるようになります。

2. Gateway Controller(NGINX Gateway Fabric)のインストール

CRDを登録しただけでは動作しないため、次にコントローラーを導入します。今回は NGINX Gateway Fabricを Helm 経由でインストールします。

helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace -n nginx-gateway

インストール完了後、GatewayClass がコントローラーによって認識されているか確認します。

kubectl get gatewayclass

3. Gatewayリソースの作成

準備が整ったので、いよいよ Gateway を作成していきます。

vi gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: sample-gateway
spec:
  gatewayClassName: nginx
  listeners:
  - name: http
    protocol: HTTP
    port: 30080
    hostname: test.gateway

マニフェストを適用します。

k apply -f gateway.yaml

適用後、状態を確認します。

k get gateway

Step 4: HTTPRouteを作成して振り分け(ルーティング)設定を行う

最後に、パス(/desktop と /mobile)に応じてトラフィックをそれぞれのServiceへ振り分けるための HTTPRoute リソースを作成します。

vi httproute.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: sample-httproute
spec:
  parentRefs:
  - name: sample-gateway
  hostnames:
  - test.gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /desktop
    backendRefs:
    - name: desktop-svc
      port: 80

  - matches:
    - path:
        type: PathPrefix
        value: /mobile
    backendRefs:
    - name: mobile-svc
      port: 80

マニフェストを適用します。

k apply -f httproute.yaml

最終確認

正常にルーティングが設定されたか確認を行います。

k get httproute
httproyte確認

設定した test.gateway:30080/desktop や test.gateway:30080/mobile に対し外部またはテスト用環境からリクエストを送信することで、Gateway APIを介したキレイなパスベースルーティングが確認できるはずです。

まとめ

従来のIngressと異なり、Gateway(インフラ設定)と HTTPRoute(ルーティング設定)が分離されたことで、エンジニア間の役割分担や管理がとてもスマートに行えるのがGateway APIの強みです。

ぜひ今回のハンズオンを参考に、実際の運用の現場でも試してみてください!