AZURE AKS → STACKIT SKE

Azure Kubernetes Service to STACKIT Kubernetes Engine

AKS moves to STACKIT Kubernetes Engine (SKE), and your workloads move with their manifests and Helm charts. StackToIT writes the SKE cluster with every node pool of the source, checks the version against the SKE catalogue and names each Azure integration that SKE replaces.

An AKS cluster with two node pools, converted

A small estate written for this page and assessed by StackToIT on 4 November 2026. Left: the input. Right: the resource blocks of the STACKIT Terraform the engine wrote; the review comments that sit above each block in the file are left out here.

Example inputmain.tf
resource "azurerm_kubernetes_cluster" "platform" {
  name                = "aks-platform"
  location            = azurerm_resource_group.platform.location
  resource_group_name = azurerm_resource_group.platform.name
  dns_prefix          = "platform"
  kubernetes_version  = "1.31"

  default_node_pool {
    name                 = "system"
    vm_size              = "Standard_D4s_v5"
    vnet_subnet_id       = azurerm_subnet.nodes.id
    auto_scaling_enabled = true
    min_count            = 2
    max_count            = 4
  }

  identity {
    type = "SystemAssigned"
  }

  network_profile {
    network_plugin = "azure"
  }
}

resource "azurerm_kubernetes_cluster_node_pool" "workloads" {
  name                  = "workloads"
  kubernetes_cluster_id = azurerm_kubernetes_cluster.platform.id
  vm_size               = "Standard_E8s_v5"
  vnet_subnet_id        = azurerm_subnet.nodes.id
  auto_scaling_enabled  = true
  min_count             = 3
  max_count             = 9
}
STACKIT Terraform by StackToITterraform/kubernetes.tf
resource "stackit_ske_cluster" "platform" {
  project_id = var.project_id
  name       = "aks-2a0320"
  node_pools = [{
    name               = "system"
    machine_type       = var.azurerm_kubernetes_cluster_platform_default_node_pool_machine_type
    minimum            = 2
    maximum            = 4
    availability_zones = var.availability_zones
    }, {
    name               = "workloads"
    machine_type       = var.workloads_machine_type
    minimum            = 3
    maximum            = 9
    availability_zones = var.availability_zones
  }]
  kubernetes_version_min = "1.36"
}
  • Every node pool lands in one SKE cluster

    The default node pool and the separate azurerm_kubernetes_cluster_node_pool become two node pools of the same SKE cluster. min_count and max_count carry over as minimum and maximum: 2 to 4 and 3 to 9.

  • Machine types with the source size beside them

    Each pool gets its own machine type variable. Its description records the Azure size, about 4 vCPU and 16 GiB for Standard_D4s_v5 and about 8 vCPU and 64 GiB for Standard_E8s_v5, and links the STACKIT machine types.

  • Version checked against SKE

    The source runs Kubernetes 1.31. SKE in eu01 supports 1.35 and newer, so the code asks for 1.36, the lowest supported version at or above the source, and flags the five minor versions it crosses so you check removed APIs first.

  • Cluster name fitted to SKE

    An SKE cluster name has 1 to 11 characters. aks-platform has 12, so the code names the cluster aks-2a0320 and asks you to set the name you want.

The node subnet becomes a STACKIT network

From the same run. Left: the input. Right: the resource blocks StackToIT wrote; the review comments above each block in the file are left out here.

Example inputmain.tf
resource "azurerm_subnet" "nodes" {
  name                 = "snet-aks-nodes"
  resource_group_name  = azurerm_resource_group.platform.name
  virtual_network_name = azurerm_virtual_network.platform.name
  address_prefixes     = ["10.10.0.0/20"]
}
STACKIT Terraform by StackToITterraform/network.tf
resource "stackit_network" "nodes" {
  project_id       = var.project_id
  name             = "snet-aks-nodes"
  ipv4_prefix      = "10.10.0.0/20"
  ipv4_nameservers = var.default_ipv4_nameservers
}
  • Same IPv4 prefix

    snet-aks-nodes keeps 10.10.0.0/20 as the prefix of its STACKIT network, so the address plan stays as it is.

  • No VNet object needed

    STACKIT has no VNet container. Each subnet becomes a network in a project, and networks that must reach each other privately join a Network Area.

  • DNS named

    The source relies on the Azure-provided resolver, which also answers private DNS zones. The network reads its nameservers from a variable, and the code notes that private names need a DNS server of their own.

How the AKS estate maps

Azure resourceSTACKIT targetMigration class
AKS cluster with its default node poolSKE cluster with a node poolReplatform
Additional AKS node poolSecond node pool of the same SKE clusterREPLATFORM, as part of the cluster
Virtual networkSTACKIT project networking or Network AreaReconfigure
SubnetSTACKIT network with the same IPv4 prefixReconfigure

Classes as the run decided them. The resource group is not a unit of its own: STACKIT has no resource groups, so the resource group and subscription layout becomes your folder and project layout.

What the code names for your architects

  • Cluster identity

    The system-assigned identity of the cluster has no counterpart on an SKE cluster. The run records it as a decision for the identity architect.

  • API server address

    dns_prefix has no SKE counterpart, so the API server address changes. The code says to update kubeconfigs and clients.

  • Cluster networking

    Azure CNI gives way to the networking SKE runs itself. The network plugin and the pod and service ranges are not carried, and the code says so.

  • Storage and ingress

    Azure Disk and Azure Files storage classes become SKE storage classes, with persistent volumes moved by a backup tool such as Velero. Application Gateway ingress is re-created with an ingress controller on SKE.

Proven on a real AWS estate

The AWS Retail Store Sample App, a public Terraform project from AWS, assessed by StackToIT and published in full, exactly as the run wrote it.

View Case Study
282
Terraform resource declarations analyzed
44
migration units identified
38
target units generated, from 52 considered
331
plan steps written

Questions platform teams ask

Can several AKS node pools move into one SKE cluster?

Yes. StackToIT reads the default node pool and every additional node pool of the cluster and writes them as node pools of one SKE cluster, each with its own minimum, maximum and machine type.

Which Kubernetes version will the SKE cluster run?

The lowest version SKE supports in the region at or above the source version. For an AKS cluster on 1.31 that is 1.36 in eu01, and the code flags the upgrade so you check removed APIs before the move.

What happens to managed identities and Azure CNI?

Neither carries over as such. The cluster identity becomes a decision for your identity architect, and SKE runs its own cluster networking, so pod and service ranges are set again on STACKIT.

Sources

Your next move: STACKIT.

Tell us about your estate. We show you what StackToIT delivers for it: target architecture, Terraform artifacts and a structured migration plan.