AKSで近接配置グループを使ってマイクロサービスの高速化

概要

AKS (他のKubernetes サービス含む) 上にマイクロサービスアプリケーションを実装していて問題になる1つとして、API間のパフォーマンスがあると思います。
可用性とパフォーマンスの双方を考慮し、アプリケーションを作っていくと言うのは難しいですね。
実際ゲームやECサイトでは課金用のAPIのレスポンスが遅いことによるユーザーからのクレームにも繋がります。
今回はAKSAPIのレスポンスを上げる取り組みを試してみたいと思います。

実装

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
}

AKS クラスタを作成します

以下のコマンドはノード数も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"

既存のAKSクラスタに追加する場合

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間通信が遅いと感じてる方はぜひお試しください。