APC 技術ブログ

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

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

AGICを用いてパスベースルーティングしてみた

f:id:p1k42:20211129201922p:plain

はじめに

Azureコンテナソリューショングループの過部です。 当社ではAzure × コンテナをソリューションとしたSIや内製化支援サービスを提供しています。 その一環として、日々の学びをこのブログでアウトプットしていきます。

今回は、AGICを用いたパスベースルーティングの実装手順についてご紹介します。

パスベースルーティングとは

パスベースルーティングとは、URLのパスに基づいて、リクエストの転送先を決定することです。
つまり、https://www.example.com/XXX のXXX部分に応じて、どのバックエンドに転送するかを柔軟に決めることができます。

よくあるユースケースとしては、コンテンツの種類に応じて、別々のバックエンドを使いたいが、同じドメイン名を使いたいシチュエーションが挙げられます。

例えば、ドメイン名www.example.comを用いて、画像共有サービスとビデオ共有サービスを提供したいとします。 www.example.com/image/ から始まるリクエストはイメージサーバーへ、www.example.com/video/ から始まるリクエストはビデオサーバーへ転送することで、別々のドメインを用意することなく、同一ドメインで二つのサービスを提供することができます。

今回の構成

構成図

今回の構成は以下の通りです。 f:id:p1k42:20211129201116j:plain AKS上にNginx, Apache HTTP Server用のPod, Serviceをそれぞれデプロイします。
その前段に、AGICを置くことで、パスベースルーティングを行えるようにしています。

転送ルール

https://example.com/nginx/ へのアクセスは、nginxのServiceに、
https://example.com/httpd/ へのアクセスは、httpdのServiceに、
それぞれ転送します。

URLリライト機能

①の場合、上記のルールに従い、nginxのServiceにhttps://example.com/nginx/を要求URLとして、転送します。 ただ、転送先の識別部分( /nginx/)は、nginxサーバにとって邪魔な場合がよくあります。 なので、今回はURLリライト機能も有効化しており、転送先が決まった後、URL書き換えが行われてから転送されます。 具体的には、https://example.com/XXX/YYY/XXX/部分を 、「/XXX/」 ➡ 「/」のように書き換える設定にしています。

※例えば、https://example.com/nginx/へのアクセスは、https://example.com/ にURLが書き換えられた後、nginxのServiceに転送されます。

実装手順

以下の流れで実装します。

1. 各種Azureリソースのデプロイ

ResourceGroup, VNet, Public IP, Subnet, AKS, Application Gatewayをデプロイします。

2. Pod, Serviceのデプロイ

nginx, httpdのPod, Serviceをそれぞれデプロイします。

3. AGICのインストール

AGICの実装方法には二種類あり、①アドオン ②Helm のどちらかを利用できます。
今回は、アドオンを用いてAGICを導入します。

4. パス疎通確認

パスに基づいて、適切なServiceに転送されているか確認します。

以下、具体的な手順です。

1. 各種Azureリソースのデプロイ

ResourceGroupのデプロイ
➜ az group create -g sample-rg -l japaneast


VNet, Subnetのデプロイ
➜ az network vnet create \
  --name sample-vnet \
  --resource-group sample-rg \
  --location japaneast \
  --address-prefix 10.21.0.0/16 \
  --subnet-name sample-subnet \
  --subnet-prefix 10.21.0.0/24


Public IPのデプロイ
➜ az network public-ip create \
  --resource-group sample-rg \
  --name sample-pip \
  --allocation-method Static \
  --sku Standard


Application Gatewayのデプロイ
➜ az network application-gateway create \
  --name sample-appgw \
  --location japaneast \
  --resource-group sample-rg \
  --capacity 2 \
  --sku Standard_v2 \
  --public-ip-address sample-pip \
  --vnet-name sample-vnet \
  --subnet sample-subnet \


AKSのデプロイ

デプロイ後、AKSに接続するための認証情報を取得しています。

➜ az aks create -n sample-aks -g sample-rg --network-plugin azure --enable-managed-identity -a ingress-appgw --appgw-name sample-appgw --appgw-subnet-cidr "10.2.0.0/16" --generate-ssh-keys

➜ az aks get-credentials -g sample-rg -n sample-aks


続いてAKSへデプロイしていきます。

2. Pod, Serviceをデプロイ

nginxのデプロイ
➜ kubectl run nginx --image nginx --port 80
➜ kubectl expose po nginx --port 80


httpdのデプロイ
➜ kubectl run httpd --image httpd --port 80
➜ kubectl expose po httpd --port 80


3. AGICのデプロイ

➜ kubectl apply -f sample-ing.yaml


#sample-ing.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: sample-ing
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  rules:
  - http:
      paths:
      - path: /nginx/
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80
      - path: /httpd/
        pathType: Prefix
        backend:
          service:
            name: httpd
            port:
              number: 80

4. パス疎通確認

ドメイン名を取得して、AGICのパブリックIPアドレスを割り当てているわけではないので、実際にドメイン名でアクセスすることことができません。 なので、curlコマンドのオプション"-H"を用いて、ホスト名をヘッダーで指定する形で、ホスト名を用いた疎通確認を疑似的に行います。

AGICのパブリックIPアドレスを取得

➜ kubectl get ing

#出力結果
NAME         CLASS    HOSTS         ADDRESS         PORTS   AGE
sample-ing   <none>   example.com   20.210.XXX.XXX   80      103s


nginxへの疎通確認

➜ curl -H 'HOST:example.com' http://20.210.XXX.XXX/nginx/

#出力結果
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>


httpdへの疎通確認

➜ curl -H 'HOST:example.com' http://20.210.XXX.XXX/httpd/

#出力結果
<html><body><h1>It works!</h1></body></html>


パスに応じて適切なWebサーバに転送されていることが、無事確認できました。

最後に

今回は、AGICを用いたパスベースルーティングのよくあるパターンについてご紹介しました。 Nginx Ingress Controllerを用いたパスベースルーティングももちろん可能ですが、AGICを使うことで、AzureネイティブのL7ロードバランサーを活用でき、様々なメリットを享受できます。 AKSでパスベースルーティングを実装する際は、ぜひご検討ください。