🎼

AKS Karpenter Provider を試してみました

2023/11/30に公開

はじめに

おそれ多くも Microsoft Top Partner Engineer's Advent Calender 2023 のトップバッターを務めさせていただくことになりました!

普段から「やってみた」系を中心に情報発信をしてきております。今回も、その方向で気になる機能を試してみました🤗

今回のテーマ

AKS (Azure Kubernetes Service) において、Karpenter の Provider が提供開始とのこと。

Karpenter は、Kubernetes のワークロードの状況から、自動でノードのスケールアップ・ダウンやスケールアウト・インを行ってくれるツールです。

よく HPA などで利用される CPU 使用率や KEDA で利用されるキューの量などではなく、Pending / Unschedulable な Pod の存在などをトリガーとしてスケールさせるようです。

試してみる

構築までの手順ドキュメント

環境

  • GitHub Codespaces
  • Windows 10
  • Visual Studio Code

Visual Studio Code には、GitHub Codespaces 拡張機能をインストールしておきます。

Azure 側は、有効なサブスクリプションさえあれば AKS クラスターなどの事前準備は特に不要です。

Codespaces 環境の作成と接続

公式リポジトリの「Code」から「Create a codespace on main」をクリックし、Codespaces 環境を作成します。Azure CLI や kubectl, skaffold など必要なものは全て準備された状態の環境が出来上がります。ほんと、この仕組みは便利すぎますね…

作成が完了したら、歯車マークから「Open in VSCode Desktop」をクリックし、ローカルの VSCode から起動します。

構築してみる

一連の構築処理は Makefile (Makefile-az.mk) にスクリプト的に記載されています。

既定ではデプロイ先が westus2 となっています。デプロイ先やリソースグループ名などを変更したい場合は、本ファイルで定義されている変数を変えてあげれば OK です。

シェル変数 AZURE_SUBSCRIPTION_ID を埋めておく必要があるため、ターミナル (bash) にて下記のコマンドを実行しておきます。

export AZURE_SUBSCRIPTION_ID=<your azure subscription id>

そのうえで "make az-all" コマンドを実行します。すると、Makefile に記載された記述に沿って構築スクリプトが実行されていきますので、気長に待ちましょう☕

初期のノードは 3 台構成です。

スケールアウトを確認する

無事構築が完了したら、Karpenter の機能を確認してみます。

構築したサンプルでは、「inflate」という名前の Deployment がレプリカ数 0 で作成されています。これをスケールさせてやれば、動作確認ができるようになっています。

レプリカ数を 10 に変更した直後の状態がこちら。

Pending 状態の Pod ができてしまっていますね。しばらく待つと…

ContainerCreating 状態になりました。この時、ノードを見てみると…

新しいノード (ここでは "aks-general-purpose-884hf") が増えていることが分かります。このことによりスケジュール可能なノードが増えたため、Pod が起動するようになったのですね。

この時、Azure Portal からノードプールおよびノードの状態を確認すると、下記のようになっています。

ノードプールの中の台数が増えているのではなく、ノード単体で増えていることが分かります。

スケールアウトを確認する (2)

調子に乗って、もう一度スケールさせてみました。

また新しく Pending 状態の Pod が生まれたため、想定では更に追加のノードが作成される…はずだったのですが、いつまでたってもこの状態から変わりませんでした🤔

Karpenter のログを見てみる

Karpenter の動作ログは、今回の環境では下記のコマンドで確認することができます。karpenter の Pod のログを確認する感じです。参考記事はこちら

kubectl logs -f -n karpenter $(kubectl get pods -n karpenter -o name)

なお、上記コマンドだとコンソールでの表示となり見づらいため、テキストファイルにリダイレクトさせたうえで、ローカルにダウンロードしてくるのが見やすいと思います。VSCode 上で作成されたファイルを右クリックしてダウンロードすることができます。

ログを確認すると、Pending 状態の Pod を認識して新しいノード作成のリクエストは実行されているものの、エラーが発生してしまっていました。

{"level":"INFO","time":"2023-11-24T15:17:48.844Z","logger":"controller.provisioner","message":"found provisionable pod(s)","commit":"389dc12-dirty","pods":"default/inflate-74ccd665f4-79x4g, default/inflate-74ccd665f4-mx7q9, default/inflate-74ccd665f4-p8gdr, default/inflate-74ccd665f4-gnvtq, default/inflate-74ccd665f4-4nvsd and 5 other(s)","duration":"15.193765ms"}
{"level":"INFO","time":"2023-11-24T15:17:48.845Z","logger":"controller.provisioner","message":"computed new nodeclaim(s) to fit pod(s)","commit":"389dc12-dirty","nodeclaims":1,"pods":10}
{"level":"INFO","time":"2023-11-24T15:17:48.861Z","logger":"controller.provisioner","message":"created nodeclaim","commit":"389dc12-dirty","nodepool":"general-purpose","nodeclaim":"general-purpose-pq7gl","requests":{"cpu":"10250m","memory":"2981280Ki","pods":"15"},"instance-types":"Standard_D14_v2, Standard_D16_v3, Standard_D16_v4, Standard_D16_v5, Standard_D16a_v4 and 73 other(s)"}
{"level":"INFO","time":"2023-11-24T15:17:48.976Z","logger":"controller.nodeclaim.lifecycle","message":"Selected instance type Standard_D16ls_v5","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}
{"level":"INFO","time":"2023-11-24T15:17:48.976Z","logger":"controller.nodeclaim.lifecycle","message":"Resolved image /CommunityGalleries/AKSUbuntu-38d80f77-467a-481f-a8d4-09b6d4220bd2/images/2204gen2containerd/versions/202311.13.0 for instance type Standard_D16ls_v5","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}
{"level":"DEBUG","time":"2023-11-24T15:17:48.976Z","logger":"controller.nodeclaim.lifecycle","message":"Returning 2 IPv4 backend pools: [/subscriptions/xxxxx/resourceGroups/MC_fantastic-succotash-jj9vrqv99pvf557g_karpenter_westus2/providers/Microsoft.Network/loadBalancers/kubernetes/backendAddressPools/aksOutboundBackendPool /subscriptions/xxxxx/resourceGroups/MC_fantastic-succotash-jj9vrqv99pvf557g_karpenter_westus2/providers/Microsoft.Network/loadBalancers/kubernetes/backendAddressPools/kubernetes]","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}
{"level":"DEBUG","time":"2023-11-24T15:17:48.976Z","logger":"controller.nodeclaim.lifecycle","message":"Creating network interface aks-general-purpose-pq7gl","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}
{"level":"DEBUG","time":"2023-11-24T15:17:53.943Z","logger":"controller.nodeclaim.lifecycle","message":"Successfully created network interface: /subscriptions/xxxxx/resourceGroups/MC_fantastic-succotash-jj9vrqv99pvf557g_karpenter_westus2/providers/Microsoft.Network/networkInterfaces/aks-general-purpose-pq7gl","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}
{"level":"DEBUG","time":"2023-11-24T15:17:53.943Z","logger":"controller.nodeclaim.lifecycle","message":"Creating virtual machine aks-general-purpose-pq7gl (Standard_D16ls_v5)","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}

上記ログの次の行に出力されていたエラー行がこちら。

{"level":"ERROR","time":"2023-11-24T15:17:54.619Z","logger":"controller.nodeclaim.lifecycle","message":"Creating virtual machine "aks-general-purpose-pq7gl" failed: PUT https://management.azure.com/subscriptions/xxxxx/resourceGroups/MC_fantastic-succotash-jj9vrqv99pvf557g_karpenter_westus2/providers/Microsoft.Compute/virtualMachines/aks-general-purpose-pq7gl\n--------------------------------------------------------------------------------\nRESPONSE 409: 409 Conflict\nERROR CODE: OperationNotAllowed\n--------------------------------------------------------------------------------\n{\n "error": {\n "code": "OperationNotAllowed",\n "message": "Operation could not be completed as it results in exceeding approved Total Regional Cores quota. Additional details - Deployment Model: Resource Manager, Location: westus2, Current Limit: 20, Current Usage: 14, Additional Required: 16, (Minimum) New Limit Required: 30. Submit a request for Quota increase at xxxxx by specifying parameters listed in the ‘Details’ section for deployment to succeed. Please read more about quota limits at https://docs.microsoft.com/en-us/azure/azure-supportability/regional-quota-requests"\n }\n}\n--------------------------------------------------------------------------------\n","commit":"389dc12-dirty","nodeclaim":"general-purpose-pq7gl","nodepool":"general-purpose"}

エラー本文をもう少し分かりやすく適宜改行すると、こんな感じです。

Creating virtual machine "aks-general-purpose-pq7gl" failed:
  PUT https://management.azure.com/subscriptions/xxxxx/resourceGroups/MC_fantastic-succotash-jj9vrqv99pvf557g_karpenter_westus2/providers/Microsoft.Compute/virtualMachines/aks-general-purpose-pq7gl
--------------------------------------------------------------------------------
RESPONSE 409: 409 Conflict
ERROR CODE: OperationNotAllowed
--------------------------------------------------------------------------------
{
  "error": {
    "code": "OperationNotAllowed",
    "message": "Operation could not be completed as it results in exceeding approved Total Regional Cores quota.
    Additional details - Deployment Model: Resource Manager, Location: westus2, Current Limit: 20, Current Usage: 14, Additional Required: 16, (Minimum) New Limit Required: 30.
    Submit a request for Quota increase at xxxxx by specifying parameters listed in the ‘Details’ section for deployment to succeed. 
    Please read more about quota limits at https://docs.microsoft.com/en-us/azure/azure-supportability/regional-quota-requests\"
  }
}
--------------------------------------------------------------------------------

上記を読むと分かるのですが、「Operation could not be completed as it results in exceeding approved Total Regional Cores quota.」とのことで、Azure サブスクリプションのクォータの上限に引っかかっておりノードが追加できなかったようです。

原因も分かりましたし、今回のサブスクリプションではクォータの追加をしたくなかったため、ここまでで終了としました🙏

終わりに

ということで、AKS Karpenter Provider を試してみました。図らずも、トラシュー時の第一歩についても踏み込めたかなと思います。

まだまだアルファ版ということでこれからの機能ですが、KEDA などと含めてスケール時の選択肢として覚えておきたいです!

Discussion