CLOUD RUN → STACKIT SKE

Cloud Run alternatives on STACKIT

On STACKIT, a Cloud Run service runs as a container workload on STACKIT Kubernetes Engine (SKE): the image you already build becomes a Kubernetes Deployment, and StackToIT writes the SKE cluster that runs it. A Cloud Foundry app from the same image is the named alternative.

A Cloud Run service, 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 "google_cloud_run_v2_service" "checkout" {
  name     = "checkout-api"
  location = "europe-west3"
  ingress  = "INGRESS_TRAFFIC_ALL"

  template {
    service_account                  = google_service_account.api.email
    max_instance_request_concurrency = 80
    timeout                          = "30s"

    scaling {
      min_instance_count = 1
      max_instance_count = 20
    }

    containers {
      image = "europe-west3-docker.pkg.dev/shop-web-prod/images/checkout-api:1.8.2"

      ports {
        container_port = 8080
      }

      resources {
        limits = {
          cpu    = "2"
          memory = "1Gi"
        }
      }

      env {
        name  = "LOG_LEVEL"
        value = "info"
      }
    }
  }
}
STACKIT Terraform by StackToITterraform/kubernetes.tf
resource "stackit_ske_cluster" "containers" {
  project_id = var.project_id
  name       = "containers"
  node_pools = [{
    name               = "workloads"
    machine_type       = var.containers_machine_type
    minimum            = var.containers_nodes_min
    maximum            = var.containers_nodes_max
    availability_zones = var.availability_zones
  }]
}
  • One cluster for the container workloads

    The code writes one SKE cluster that runs the migrated Cloud Run services as Deployments, Jobs and CronJobs. If the estate already has an SKE cluster, your architect can run them there instead.

  • The service settings, named for the Deployment

    The ports, environment variables and resource limits, the concurrency of 80 and the 30-second timeout are named in the code for the Deployment and Service you write.

  • Pool size is yours

    Machine type and the minimum and maximum of the node pool are variables, so you size the cluster for all the services it hosts together.

The decision behind it

The unit result from the same run, exactly as assessment.json records it.

StackToIT assessmentassessment.json
{
  "id": "google_cloud_run_v2_service.checkout",
  "class": "CONTAINERIZE",
  "confidence": "MEDIUM",
  "target": {
    "service": "SKE workload (or Cloud Foundry Docker app)"
  },
  "reason": "The service already runs a container image, so it moves as a Deployment on SKE (or a Cloud Foundry app from the image). Scale-to-zero and per-request billing go away unless Knative or KEDA is operated on SKE."
}
  • CONTAINERIZE

    The service already runs a container image, so it moves as a Deployment on SKE, or as a Cloud Foundry app from the image.

  • Scaling to zero

    Scale-to-zero comes with Knative or KEDA operated on SKE. Without such an autoscaler, at least one replica runs.

  • Public invocation

    The service allows allUsers to invoke it. The code carries no invocation check, so you decide deliberately which endpoints stay public.

The runtime service account, converted

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 "google_service_account" "api" {
  account_id   = "checkout-api"
  display_name = "Checkout API runtime"
}
STACKIT Terraform by StackToITterraform/identity.tf
resource "stackit_service_account" "api" {
  project_id = var.project_id
  name       = "checkout-api"
}
  • Same name, new address

    checkout-api becomes a STACKIT service account of the same name. STACKIT generates its e-mail address, so the code says to update every reference to the old one.

  • Identity of the workload

    The run asks how the workload gets its identity on STACKIT, a service account of its own or workload federation, because the service named the account in its template.

How the Cloud Run estate maps

Google Cloud resourceSTACKIT targetMigration class
Cloud Run serviceSKE workload (or Cloud Foundry Docker app)Containerize
Service accountSTACKIT service accountReconfigure
Artifact Registry Docker repositorySTACKIT Container RegistryReconfigure

Classes as the run decided them. Images are copied registry to registry with tools such as skopeo or crane, and image references change to the new host; the registry is set up through the STACKIT portal or API.

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 application teams ask

What is the STACKIT alternative to Google Cloud Run?

A container workload on STACKIT Kubernetes Engine (SKE), or a Cloud Foundry app from the same image. StackToIT classifies Cloud Run services as CONTAINERIZE and writes the SKE cluster that runs them.

Do we have to rebuild our container images?

No. The service already runs a container image, which moves to STACKIT Container Registry and runs as a Deployment on SKE.

Can a service still scale to zero on STACKIT?

Yes, with Knative or KEDA operated on SKE. Without such an autoscaler, at least one replica runs.

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.