APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【AKS】AKS環境に EnvoyGateway を導入して GatewayAPI による通信を検証してみた

はじめに

皆様、こんにちは。ACS事業部 木戸と申します。

今回は AKS 環境で Gateway API を利用するために EnvoyGateway を導入し、HTTPRoute を利用してURLのパスに応じたルーティングが行えるかを検証してみました。

準備

事前にWindowsのローカル環境のWSLに作成したUbuntu環境に、以下のツールをインストールしています。

・az cli
・kubectl
・helm

1. AKSクラスターの作成

Azure 上に AKS クラスターを作成します。
以下のコマンドを実行し Azure CNI Powered by Cilium をサポートした状態でAKSを構築します。 learn.microsoft.com

// Azure環境へのログイン
az login

// AKS構築
az aks create \
  --name {AKSの名前} \
  --resource-group {リソースグループ名} \
  --location {リージョン} \
  --network-plugin azure \
  --network-plugin-mode overlay \
  --pod-cidr {IPアドレス} \
  --network-dataplane cilium \
  --generate-ssh-keys

AKSが構築できたら以下のコマンドでアクセス資格情報を取得しておきます。

az aks get-credentials --resource-group {リソースグループ名} --name {AKSの名前}

2. サンプルアプリのデプロイ

サンプルアプリは フロントエンド(Next.js-React)とバックエンド(Express-Node.js)の構成で実装しました。
デプロイの方法等は割愛しますが、ContainerRegistryに各コンテナをプッシュしKubernetesのマニフェストをデプロイして準備をしております。

// サンプルアプリのデプロイ状況
kubectl get svc -n sample-1

<結果>
NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
sampleapp-backend-service   ClusterIP   xx.xx.xx.xx  <none>        4000/TCP   7m55s
sampleapp-next-service      ClusterIP   xx.xx.xx.xx      <none>        3000/TCP   8m5s

3. EnvoyGatewayのインストール

EnvoyGatewayの公式に用意されているHelm Chartを利用してインストールを行いました。
以下のコマンドを実行し、インストール後にenvoy-gateway用のServiceが出力されることを確認しました。

gateway.envoyproxy.io

// HelmによるEnvoyGatewayのインストール
helm install eg oci://docker.io/envoyproxy/gateway-helm --version v1.7.0 -n envoy-gateway-system --create-namespace
// Serviceの確認
kubectl get svc -n envoy-gateway-system

<結果>
envoy-gateway                                 ClusterIP      xx.xx.xx.xx  <none>          18000/TCP,18001/TCP,18002/TCP,19001/TCP,9443/TCP   7d23h

4. GatewayClass, Gatewayをデプロイする。

EnvoyGatewayでは主に以下のオブジェクトを実装することで Gateway API の機能を提供します。

GatewayClass

 コントローラーとの紐付けやインフラの構成などを定義します。

Gateway

 GatewayClassに基づいたロードバランサーとして、待ち受けポート(Listener)を定義します。

HttpRoute

 特定のパスへのアクセスをどの名前空間のサービスに流すかなどのルーティングルールを定義します。

以下のYAMLファイルを適用することで、GatewayClass, Gateway を実装していきます。

# Gateway Class
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: eg-class
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
---
# サンプルアプリ用 Gateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: sample-eg-gateway
  namespace: sample-1
spec:
  gatewayClassName: eg-class
  listeners:
    - name: http
      protocol: HTTP
      port: 80

実装後に以下のコマンドでgatewayが実装されていることを確認できました。

kubectl get gateway -n sample-1


<結果>
NAMESPACE     NAME                CLASS      ADDRESS         PROGRAMMED   AGE
sample-1      sample-eg-gateway   eg-class   xx.xx.xx.xx   True         4h38m

5.サンプルアプリの為のルーティングのHTTPRouteをデプロイする。

以下のHttpRouteのルールを適用し、URLのパスで通信を振り分けるように設定します。
最終的にAKS上に図のような環境を構築しています。

# サンプルアプリ用 HttpRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: sample-app-route
  namespace: sample-1
spec:
  parentRefs:
    - name: sample-eg-gateway
      namespace: sample-1
  rules:
    # Backend API ルーティング
    - matches:
        - path:
            type: PathPrefix
            value: /api
      backendRefs:
        - group: ""
          kind: Service
          name: sampleapp-backend-service
          port: 4000
          weight: 1
    # Frontend ルーティング
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - group: ""
          kind: Service
          name: sampleapp-next-service
          port: 3000
          weight: 1

Gatewayに設定されたアドレスにブラウザでアクセスし、サンプルアプリが起動することを確認できました。
メッセージの登録、一覧表示のデータが出力されており、パスのルーティングによりバックエンドからデータを取得できています。

5. まとめ

今回は、AKS 上で Envoy Gateway と Gateway API(GatewayClass、Gateway、HTTPRoute)を使い、パスベースルーティングの基本動作を確認しました。
シンプルな構成であれば導入しやすい一方、実運用では Namespace 設計や Gateway の分割方針、セキュリティポリシーとの整合を設計しておく事が重要だと感じました。

ACS事業部のご紹介

私達ACS事業部はクラウドネイティブ技術、Azure AI サービス、Platform Engineering、AI駆動開発支援などを通して、攻めのDX成功に向けた開発者体験・開発生産性の向上・内製化のご支援をしております。

www.ap-com.co.jp また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。 www.ap-com.co.jp