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.
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"
}
}
}
}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.
{
"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.
resource "google_service_account" "api" {
account_id = "checkout-api"
display_name = "Checkout API runtime"
}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 resource | STACKIT target | Migration class |
|---|---|---|
| Cloud Run service | SKE workload (or Cloud Foundry Docker app) | Containerize |
| Service account | STACKIT service account | Reconfigure |
| Artifact Registry Docker repository | STACKIT Container Registry | Reconfigure |
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.