はじめに
Azureコンテナソリューショングループの過部です。 当社ではAzure × コンテナをソリューションとしたSIや内製化支援サービスを提供しています。 その一環として、日々の学びをこのブログでアウトプットしていきます。
今回は、AGICを用いたパスベースルーティングの実装手順についてご紹介します。
パスベースルーティングとは
パスベースルーティングとは、URLのパスに基づいて、リクエストの転送先を決定することです。
つまり、https://www.example.com/XXX のXXX部分に応じて、どのバックエンドに転送するかを柔軟に決めることができます。
よくあるユースケースとしては、コンテンツの種類に応じて、別々のバックエンドを使いたいが、同じドメイン名を使いたいシチュエーションが挙げられます。
例えば、ドメイン名www.example.comを用いて、画像共有サービスとビデオ共有サービスを提供したいとします。 www.example.com/image/ から始まるリクエストはイメージサーバーへ、www.example.com/video/ から始まるリクエストはビデオサーバーへ転送することで、別々のドメインを用意することなく、同一ドメインで二つのサービスを提供することができます。
今回の構成
構成図
今回の構成は以下の通りです。
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でパスベースルーティングを実装する際は、ぜひご検討ください。