📘

AKS のアップグレード情報を EventGrid を使って取得する

2023/08/03に公開

AKS のアップグレードについては色々書きたいことが多いのですが、今回は「アップグレードについてどうやって検知するか」という内容について書きたいと思います。
AKS を運用していると、最短でも4ヶ月、最長でも12ヶ月(だとギリギリ)に1回はアップグレードを行う必要があります。それは、AKS というより Kubernetes のアップグレード方針によるところが大きいですが、サポートにも影響してきます。

AKS では次期バージョン 1.27 が GA するタイミングで LTS 版もサポートするという発表がされています。がしかし、全て LTS にしておけば安心ということでもありませんし、基本的にアップグレードは追従して行く方向で考えたほうが良いことも多いと思います。(私個人の考えです)

長期サポート (LTS):
https://learn.microsoft.com/ja-jp/azure/aks/supported-kubernetes-versions?tabs=azure-cli#long-term-support-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の作成はポータルで作成しました。受け取ったイベントをメールで通知するように設定しました。

LogicApps 設定画面

使用可能な 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 のバージョン情報を自動的に取得することができます。
そのため、「あっ、知らない間に対応バージョンが変わっている」ということがなくなると思います。

参考

https://learn.microsoft.com/ja-jp/azure/aks/quickstart-event-grid?source=recommendations&tabs=azure-cli

https://learn.microsoft.com/ja-jp/azure/event-grid/event-schema-aks?tabs=event-grid-event-schema

https://azure.microsoft.com/ja-jp/updates/generally-available-event-grid-integration-with-aks/

GitHubで編集を提案
Microsoft (有志)

Discussion