Kubernetes ist der de-facto Standard für Container-Orchestrierung. Möchte man den Betrieb nicht selber bewerkstelligen, greift man zu einer Managed Lösung wie Microsofts Azure Kubernetes Service (AKS). Damit werden einem weite Teile des operativen Betriebs abgenommen. Auch die Aktualisierung der Kubernetes-Version kann komplett von Azure übernommen werden. Wie man auto-upgrade konfiguriert, erklärt Microsoft in diesem Artikel. Möchte man die Version und den Zeitpunkt eines Upgrades seines Cluster aber selber festlegen, kann man dies über die Azure CLI oder noch besser via Terraform erledigen. Voraussetzung ist natürlich, dass man seine Kubernetes-Infrastruktur mittels Terraform provisioniert.

Azure Kubernetes Versionen

Die unterstützen Kubernetes-Versionen sowie deren Support-Zeiträume listet Microsoft in der Dokumentation auf.

Zu beachten ist, dass ein Update immer nur innerhalb einer Minor-Version oder auf die nächste Minor-Version möglich ist. Möchte man etwa von Version 1.24 auf 1.26 updaten, muss man dies über Version 1.25 in zwei Durchgängen erledigen.

Die verfügbaren Versionen hängen von der Region ab, in der der Cluster angesiedelt ist. Über die Azure CLI lassen sich die verfügbaren Versionen für eine Region abfragen.

az aks get-versions \
  --location westeurope \
  --output table

Die Ausgabe liefert eine Liste der verfügbaren Versionen und die möglichen Upgrades.

KubernetesVersion    Upgrades
-------------------  -----------------------
1.26.3               None available
1.26.0               1.26.3
1.25.6               1.26.0, 1.26.3
1.25.5               1.25.6, 1.26.0, 1.26.3
1.24.10              1.25.5, 1.25.6
1.24.9               1.24.10, 1.25.5, 1.25.6

Auch lassen sich die verfügbaren Upgrades für einen speziellen Cluster abfragen.

az aks get-upgrades \
  --resource-group rg-aks-test \
  --name aks-test \
  --output table

Das Ergebnis zeigt genau die verfügbaren Upgrades an.

Name     ResourceGroup    MasterVersion    Upgrades
-------  ---------------  ---------------  --------------
default  rg-aks-test      1.24.10          1.25.5, 1.25.6

Terraform

Das Konfigurieren eines AKS Clusters mittels Terraform ist schnell erledigt. Über den Azure Provider legt man die entsprechende Resource azurerm_kubernetes_cluster an.

Hier konfiguriert man über kubernetes_version die Version des Control Plane und über default_node_pool.orchestrator_version die Version der Nodes.

terraform {
  required_version = ">= 0.13"

  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~> 3.48.0"
    }
  }
}

# Configure the Azure Provider via environment variables
provider "azurerm" {
  features {}
}

# Resource Group
resource "azurerm_resource_group" "rg" {
  name     = "rg-aks-test"
  location = "westeurope"
}

# AKS Cluster
resource "azurerm_kubernetes_cluster" "aks" {
  name                              = "aks-test"
  location                          = azurerm_resource_group.rg.location
  resource_group_name               = azurerm_resource_group.rg.name
  dns_prefix                        = "k8s"
  kubernetes_version                = "1.24.10"
  role_based_access_control_enabled = true

  default_node_pool {
    name                 = "default"
    node_count           = 2
    vm_size              = "Standard_B2s"
    orchestrator_version = "1.24.10"
  }

  identity {
    type = "SystemAssigned"
  }
}

Ein terraform apply und ein paar Minuten später steht ein AKS Cluster in der gewünschten Version zur Verfügung.

Upgrade mit Terraform

Um seinen AKS Cluster nun auf eine höhere Version zu heben, ändern man die Versionsnummern in seinem Terraform-File, am besten sowohl für das Control Plane als auch die Node Pools. Ein terraform apply stößt den Upgrade-Vorgang an. Nun werden nacheinander die einzelnen Knoten aus dem Cluster entfernt und durch aktualisierte Varianten ersetzt. Die laufenden Pods werden dabei natürlich auf die verbleibenden Knoten verteilt und bleiben weiterhin erreichbar. Der Upgrade-Vorgang kann abhängig von der Anzahl der Knoten einige Minuten bis Stunden dauern.

Solltet Ihr für die Infrastruktur-Anpassung eine CI/CD-Pipeline nutzen, achtet darauf, dass der Vorgang nicht in einen Timeout läuft.

Über die Azure CLI und im Azure Portal lässt sich der Prozess verfolgen.

az aks list -o table

az aks nodepool list \
  --resource-group rg-aks-test \
  --cluster-name  aks-test \
  --output table

Der ProvisioningState wechselt auf Upgrading.

Name     OsType    KubernetesVersion    ProvisioningState
-------  --------  -------------------  -------------------
default  Linux     1.25.6               Upgrading

Nach Abschluss des Upgrades wechselt der ProvisioningState wieder auf Succeeded und alle Knoten laufen auf der neuen Kubernetes-Version.