概要
AKS (他のKubernetes サービス含む) 上にマイクロサービスアプリケーションを実装していて問題になる1つとして、API間のパフォーマンスがあると思います。
可用性とパフォーマンスの双方を考慮し、アプリケーションを作っていくと言うのは難しいですね。
実際ゲームやECサイトでは課金用のAPIのレスポンスが遅いことによるユーザーからのクレームにも繋がります。
今回はAKSでAPIのレスポンスを上げる取り組みを試してみたいと思います。
実装
API間のレスポンスを向上させる方法の1つに、近接配置グループ ( Proximity placement groups ) を使う方法があります。
リソースを同一の場所に配置して、ネットワーク待ち時間を短縮するというものです。
クラスターのノードプールに近接配置グループを使い、API間通信の距離を短くすることで通信時間を短縮します。
作るには ポータル / Azure CLI / Azure PowerShell のいずれかで作成します。
公式ドキュメント
docs.microsoft.com
ポータルからの作り方
docs.microsoft.com
AKSへの実装方法
docs.microsoft.com
Azure CLI で作成していく
リソースグループを作成します
az group create --name ppgtest --location japaneast
作成結果は以下のように出ます。
{
"id": "/subscriptions/xx0xxx00-00x0-0000-0x00-x0000x0x0x00/resourceGroups/ppgtest",
"location": "japaneast",
"managedBy": null,
"name": "ppgtest",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
近接配置グループを作成します
az ppg create -n ppgdemo -g ppgtest -l japaneast -t standard
作成されたリソースID("id")を控えておきます。
{
"availabilitySets": null,
"colocationStatus": null,
"id": "/subscriptions/xx0xxx00-00x0-0000-0x00-x0000x0x0x00/resourceGroups/ppgtest/providers/Microsoft.Compute/proximityPlacementGroups/ppgdemo",
"location": "japaneast",
"name": "ppgdemo",
"proximityPlacementGroupType": "Standard",
"resourceGroup": "ppgtest",
"tags": {},
"type": "Microsoft.Compute/proximityPlacementGroups",
"virtualMachineScaleSets": null,
"virtualMachines": null
}
以下のコマンドはノード数も1に指定していますので最小限となります。
お使いの環境に合わせて構築してください。
ppg には前項の"id"を使います。
az aks create \
--resource-group ppgtest \
--name ppgtest \
--node-count 1 \
--generate-ssh-keys \
--ppg "/subscriptions/xx0xxx00-00x0-0000-0x00-x0000x0x0x00/resourceGroups/ppgtest/providers/Microsoft.Compute/proximityPlacementGroups/ppgdemo"
az aks nodepool add \
--resource-group ppgtest \
--cluster-name ppgtest \
--name ppgtestnodepool \
--node-count 1 \
--ppg "/subscriptions/xx0xxx00-00x0-0000-0x00-x0000x0x0x00/resourceGroups/ppgtest/providers/Microsoft.Compute/proximityPlacementGroups/ppgdemo"
やってみた結果
ノード数10のクラスターに近接配置グループを追加して、API間の通信を20回計測してみたところ以下のような結果になりました。
計測にはAPI間の通信速度を計測できるよう分散トレーシングとしてJeagerをAKSクラスターとアプリケーションに仕込みました。
* before : 平均80ms
* after : 平均65ms
簡単なアプリケーションを使用したので劇的に早くなったわけではありませんが、多少の効果はみられました。
API間通信が遅いと感じてる方はぜひお試しください。