AKS のアップグレード情報を EventGrid を使って取得する
AKS のアップグレードについては色々書きたいことが多いのですが、今回は「アップグレードについてどうやって検知するか」という内容について書きたいと思います。
AKS を運用していると、最短でも4ヶ月、最長でも12ヶ月(だとギリギリ)に1回はアップグレードを行う必要があります。それは、AKS というより Kubernetes のアップグレード方針によるところが大きいですが、サポートにも影響してきます。
AKS では次期バージョン 1.27 が GA するタイミングで LTS 版もサポートするという発表がされています。がしかし、全て LTS にしておけば安心ということでもありませんし、基本的にアップグレードは追従して行く方向で考えたほうが良いことも多いと思います。(私個人の考えです)
長期サポート (LTS):
では、このアップグレードをするタイミングをどうやって検知するか?というところですが、昨年の Ignights で EventGrid で AKS のアップグレード情報が検知ができるようになりました。そして先月のアップデート情報では、その内容が追加になったというニュースもあります!これで定期的に確認しに行くチェックから、イベントドリブンで検知できるようになりました。
概要
Event Grid とは
Azure EventGridは、Microsoft Azureのサービスの1つで、イベント駆動型アーキテクチャに特化したメッセージングサービスです。このサービスは、アプリケーションやサービス間で発生したイベントを検知し、それを他のアプリケーション、関数、サービスへと配信します。ユーザーは、特定のイベントをトリガーとして任意の処理を開始することができます。これにより、システム間の連携や自動化を実現することが可能です。EventGridは、リアルタイム性、スケーラビリティ、安全性を高度に保証し、クラウド環境での高度なイベント処理をサポートしています。
AKS と組み合わせると何が良いか
AKSとEventGridを組み合わせると、AKSのクラスターやワークロードのイベント(例えば、アップグレード、障害、スケーリングなど)を検知し、これをトリガーにさまざまな自動化処理を行うことができます。この組み合わせにより、アプリケーションの監視や運用効率が大幅に向上し、システムのリアルタイムなレスポンスが可能となります。アップグレードを検知することによって、アプリケーションの運用管理を大幅に効率化できます。
では、実際に組み合わせてみましょう。また、今回AKSとEventGridの他に、通知させるためのリソースとして Logic Apps も登場します。
実装
AKS の作成
まずは何はともあれ AKS を作成します。通知がされやすいように、Kubernetes の古いバージョンをあえて指定します。(執筆当時は 1.24.9 を作成)
myResourceGroup=<yourResourceGroup>
location=japaneast
myAKSCluster=<yourAKSCluster>
az group create --name $myResourceGroup --location $location
az aks create -g $myResourceGroup -n $myAKSCluster --kubernetes-version 1.24.9 --enable-managed-identity --node-count 3 --enable-addons monitoring --enable-msi-auth-for-monitoring --generate-ssh-keys
作成後、AKS に接続します。
az aks get-credentials --resource-group $myResourceGroup --name $myAKSCluster
接続できたことを確認します。
% kubectl get pods
No resources found in default namespace.
AKS の準備は完了です。
Event Grid Create
続いて Event Grid を作成します。az eventhubs
を使用して名前空間と EventHub を作成します。EventHub は、Event Grid サブスクリプションのエンドポイントとして使用されます。
MyNamespace=<yourEventGridNamespace>
MyEventGridHub=<yourEventGridHub>
az eventhubs namespace create --location $location --name $MyNamespace -g $myResourceGroup
az eventhubs eventhub create --name $MyEventGridHub --namespace-name $MyNamespace -g $myResourceGroup
AKS イベントをサブスクライブします。
SOURCE_RESOURCE_ID=$(az aks show -g $myResourceGroup -n $myAKSCluster --query id --output tsv)
ENDPOINT=$(az eventhubs eventhub show -g $myResourceGroup -n $MyEventGridHub --namespace-name $MyNamespace --query id --output tsv)
MyEventGridSubscription=AKS-EventGridSubscription
az eventgrid event-subscription create --name $MyEventGridSubscription \
--source-resource-id $SOURCE_RESOURCE_ID \
--endpoint-type eventhub \
--endpoint $ENDPOINT
イベントが設定されたかを確認します。
az eventgrid system-topic event-subscription show --name your-event-subscription-name --source-resource-id your-source-resource-id --include-full-endpoint-url
結果は以下の通りです。
% az eventgrid event-subscription show --name $MyEventGridSubscription --source-resource-id $SOURCE_RESOURCE_ID --include-full-endpoint-url
{
"deadLetterDestination": null,
"deadLetterWithResourceIdentity": null,
"deliveryWithResourceIdentity": null,
"destination": {
"deliveryAttributeMappings": null,
"endpointType": "EventHub",
"resourceId": "/subscriptions/XXXXXXXXXXXXX/resourceGroups/krmt-AKS-EventGrid/providers/Microsoft.EventHub/namespaces/krmt-AKS-namespace/eventhubs/krmt-AKS-EventGridHub"
},
"eventDeliverySchema": "EventGridSchema",
"expirationTimeUtc": null,
"filter": {
"advancedFilters": null,
"enableAdvancedFilteringOnArrays": null,
"includedEventTypes": [
"Microsoft.ContainerService.NewKubernetesVersionAvailable",
"Microsoft.ContainerService.ClusterSupportEnded",
"Microsoft.ContainerService.ClusterSupportEnding",
"Microsoft.ContainerService.NodePoolRollingStarted",
"Microsoft.ContainerService.NodePoolRollingSucceeded",
"Microsoft.ContainerService.NodePoolRollingFailed"
],
"isSubjectCaseSensitive": null,
"subjectBeginsWith": "",
"subjectEndsWith": ""
},
"id": "/subscriptions/XXXXXXXXXXXXX/resourceGroups/krmt-AKS-EventGrid/providers/Microsoft.ContainerService/managedClusters/krmt-AKS-EventGrid/providers/Microsoft.EventGrid/eventSubscriptions/AKS-EventGridSubscription",
"labels": null,
"name": "AKS-EventGridSubscription",
"provisioningState": "Succeeded",
"resourceGroup": "krmt-AKS-EventGrid",
"retryPolicy": {
"eventTimeToLiveInMinutes": 1440,
"maxDeliveryAttempts": 30
},
"systemData": null,
"topic": "/subscriptions/XXXXXXXXXXXXX/resourceGroups/krmt-aks-eventgrid/providers/microsoft.containerservice/managedclusters/krmt-aks-eventgrid",
"type": "Microsoft.EventGrid/eventSubscriptions"
}
Logic Apps Create
Logic Appsの作成はポータルで作成しました。受け取ったイベントをメールで通知するように設定しました。
使用可能な Kubernetes バージョンの一覧が更新された時、クラスターがサポート対象外になった場合としていましたが、シンプルに一つずつにしてもよかったですね。
[
"Microsoft.ContainerService.NewKubernetesVersionAvailable",
"Microsoft.ContainerService.ClusterSupportEnding"
]
また、今回はメールとしていましたが、Slack などに飛ばしてもいいですよね。
結果
しばらく稼働させていると、以下のメッセージが届きました。AKS のバージョン 1.24.9 を使っていますが、使用可能なバージョンの一覧が更新されたことがトリガーとなったようです。
件名:krmt-AKS01
トピック:/subscriptions/XXXXXXXXXX/resourceGroups/krmt-AKS01/providers/Microsoft.ContainerService/managedClusters/krmt-AKS01
本文:{"topic":"/subscriptions/XXXXXXXXXX/resourceGroups/krmt-AKS01/providers/Microsoft.ContainerService/managedClusters/krmt-AKS01","subject":"krmt-AKS01","eventType":"Microsoft.ContainerService.NewKubernetesVersionAvailable","id":"XXXXXXXXXX","data":{"latestSupportedKubernetesVersion":"1.26.3","latestStableKubernetesVersion":"1.25.6","lowestMinorKubernetesVersion":"1.24.10","latestPreviewKubernetesVersion":"1.27.1"},"dataVersion":"1","metadataVersion":"1","eventTime":"2023-08-01T13:53:15Z"}
項目:{"topic":"/subscriptions/XXXXXXXXXX/resourceGroups/krmt-AKS01/providers/Microsoft.ContainerService/managedClusters/krmt-AKS01","subject":"krmt-AKS01","eventType":"Microsoft.ContainerService.NewKubernetesVersionAvailable","id":"XXXXXXXXXX","data":{"latestSupportedKubernetesVersion":"1.26.3","latestStableKubernetesVersion":"1.25.6","lowestMinorKubernetesVersion":"1.24.10","latestPreviewKubernetesVersion":"1.27.1"},"dataVersion":"1","metadataVersion":"1","eventTime":"2023-08-01T13:53:15Z"}
うーん、ちょっと見えずらいので、結果のJSONファイルを貼ります。
{
"topic": "/subscriptions/XXXXXXXXXX/resourceGroups/krmt-AKS01/providers/Microsoft.ContainerService/managedClusters/krmt-AKS01",
"subject": "krmt-AKS01",
"eventType": "Microsoft.ContainerService.NewKubernetesVersionAvailable",
"id": "XXXXXXXXXX",
"data": {
"latestSupportedKubernetesVersion": "1.26.3",
"latestStableKubernetesVersion": "1.25.6",
"lowestMinorKubernetesVersion": "1.24.10",
"latestPreviewKubernetesVersion": "1.27.1"
},
"dataVersion": "1",
"metadataVersion": "1",
"eventTime": "2023-08-01T13:53:15Z"
}
今使っているバージョンが使用不可になったようですね。(lowestMinorKubernetesVersion 参照)
今回は、とりあえず取得できる情報を
ドキュメントにも記載されていますが、以下の内容が来ていますね。もう少し Logic Apps の中を更新すると、わかりやすい通知が届くはずです。
プロパティ | Type | 説明 |
---|---|---|
latestSupportedKubernetesVersion | string | 使用可能な Kubernetes のサポートされている最新バージョン。 |
latestStableKubernetesVersion | string | 使用可能な Kubernetes のサポートされている最新の安定バージョン。 |
lowestMinorKubernetesVersion | string | 使用可能な Kubernetes のサポートされている最小バージョン。 |
latestPreviewKubernetesVersion | string | 使用可能な Kubernetes の最新のプレビュー バージョン。 |
まとめ
今回は、AKS のバージョン情報を取得する方法を紹介しました。自動的に通知する方法を実装することで、AKS のバージョン情報を自動的に取得することができます。
そのため、「あっ、知らない間に対応バージョンが変わっている」ということがなくなると思います。
参考
Discussion