Managed vs Self-Managed Kubernetes on GCP: GKE Autopilot vs Standard
Most teams on GCP should start with GKE Autopilot. Google manages the control plane and all node operations, so you deploy Pods and focus on your application. Use GKE Standard when you need node-level control: GPU nodes, privileged containers, custom OS images, or specific kernel parameters. Self-managed Kubernetes on Compute Engine is a valid choice only in rare, specific circumstances.
This page breaks down what you actually manage with each option, the real cost trade-offs, and how to pick the right one for your workload. If you are new to Kubernetes concepts, start there first.
Simple explanation
There are three ways to run Kubernetes on GCP. They differ in how much Google manages for you.
Think of it like housing. Self-managed Kubernetes is building a house from raw materials: you pour the foundation, wire the electricity, and fix every leak yourself. GKE Standard is buying a house: the structure is solid and professionally built, but you handle the interior, the lawn, and the maintenance schedule. GKE Autopilot is renting a fully serviced apartment: you move in, arrange your furniture, and someone else handles everything from plumbing to landscaping.
- Self-managed Kubernetes means you install and run Kubernetes yourself on Compute Engine VMs. You own everything: the control plane, the worker nodes, upgrades, networking, certificates, and monitoring. Google provides the VMs. The rest is on you.
- GKE Standard means Google runs the Kubernetes control plane (API server, etcd, scheduler). You manage the worker nodes through node pools, choosing machine types, configuring autoscaling, and approving upgrades.
- GKE Autopilot means Google manages both the control plane and node operations. You define Pod specifications with resource requests, and Google provisions the right infrastructure automatically. This is the closest Kubernetes gets to a serverless experience.
If you are unsure whether you even need Kubernetes, read Choosing Between Cloud Run, GKE, and Compute Engine first. Many teams reach for Kubernetes when Cloud Run would be simpler and cheaper.
What each option manages
| Responsibility | Self-Managed on Compute Engine | GKE Standard | GKE Autopilot |
|---|---|---|---|
| Control plane | You install, configure, and maintain | Google (fully managed) | Google (fully managed) |
| Worker nodes | You provision and manage VMs | You manage node pools | Google (auto-provisioned) |
| Upgrades and patching | Fully manual on every component | Configurable: auto or manual per node pool | Google handles automatically |
| Networking setup | You choose and install a CNI plugin | VPC-native networking by default | VPC-native networking by default |
| Security defaults | You configure everything manually | Shielded nodes, Workload Identity available | Hardened by default, restricted privileged access |
| Privileged workloads | No restrictions | No restrictions | Restricted (allowlisted partners excepted) |
| Pricing model | VM cost only (plus your engineering time) | VM cost + cluster management fee | Per Pod resource request (CPU + memory) |
| Operational effort | High: dedicated Kubernetes expertise required | Medium: node management and upgrade planning | Low: focus on workloads, not infrastructure |
| Best fit | Custom distributions, multi-cloud consistency, specialised requirements | Teams needing GPU nodes, DaemonSets, or custom node configs | Most teams running standard Kubernetes workloads |
How it works
Self-managed: you own every component
Running Kubernetes on Compute Engine VMs means installing and operating the full stack yourself. The control plane (API server, etcd, scheduler, controller manager) runs on VMs you provision. etcd is the cluster’s state store. If it goes down, nothing schedules. A highly available etcd cluster needs at least 3 nodes spread across failure domains.
You choose and install a CNI plugin (Calico, Cilium, Flannel) for pod networking, generate and rotate TLS certificates for all components, provision worker VMs with the kubelet and container runtime, and run every Kubernetes upgrade manually. A version upgrade means draining nodes, upgrading packages, and confirming pod rescheduling across control plane and workers, all without disrupting production traffic.
An etcd corruption event on a self-managed cluster with no tested backup process is a data-loss scenario. If you choose self-managed, you need a dedicated Kubernetes engineer who understands etcd recovery, certificate management, and network troubleshooting.
GKE Standard: managed control plane, your nodes
With GKE Standard, Google runs the entire control plane on managed infrastructure, redundant across zones. You never touch etcd, configure certificates, or worry about API server availability.
You manage worker nodes through node pools: choose machine types, set autoscaling policies, attach GPUs, and select OS images. GKE can auto-upgrade nodes on a release channel (Rapid, Regular, or Stable) during maintenance windows you define. VPC-native networking is the default, so Pod IPs are real VPC addresses and Pods communicate with other GCP services natively.
# Create a GKE Standard cluster with auto-upgrade enabled
gcloud container clusters create my-cluster \
--region us-central1 \
--num-nodes 2 \
--machine-type e2-standard-2 \
--release-channel regular \
--enable-autoupgrade \
--enable-autorepair \
--project my-projectGKE Autopilot: workload-first model
GKE Autopilot removes node management entirely. You define Pod specifications with resource requests and limits. Google provisions the right node capacity, handles bin-packing, runs upgrades, and enforces security guardrails automatically.
Autopilot enforces security policies by default: containers must declare resource requests, host namespace access is restricted, and most privileged containers are blocked. Google maintains an allowlist for partner workloads (monitoring agents, security tools) that need elevated permissions. Billing is per Pod resource request, so Pods not running cost nothing.
# Create a GKE Autopilot cluster
gcloud container clusters create-auto my-autopilot-cluster \
--region us-central1 \
--project my-projectAutopilot clusters are regional by default. You do not need to configure zone distribution or replica placement for the control plane. Google handles it.
Three-way comparison
| Dimension | Self-Managed on Compute Engine | GKE Standard | GKE Autopilot |
|---|---|---|---|
| Control plane | You | ||
| Node management | You | You (node pools) | |
| Upgrade process | Fully manual, multi-step | Automated or manual per channel | Fully automated by Google |
| Networking | Manual CNI install and config | VPC-native by default | VPC-native by default |
| Node customisation | Full | Full (machine types, GPUs, OS images) | Limited (Google selects nodes) |
| Privileged containers | Allowed | Allowed | Restricted (allowlisted exceptions) |
| Billing model | VM costs only | VM costs + cluster management fee | Per Pod CPU and memory request |
| Setup time | Days to weeks | Minutes | Minutes |
| Operational effort | High | Medium | Low |
| Google SLA | None for Kubernetes layer | Yes (regional clusters) | Yes (regional by default) |
| Best for | Custom distros, multi-cloud tooling | GPU workloads, DaemonSets, custom node configs | Most teams on GCP |
When to use each option
When GKE Autopilot is the right choice
Autopilot is the right default for most Kubernetes workloads on GCP. Choose it when:
- You are running standard stateless or stateful web services and do not need custom node configurations
- Your team wants to focus on deploying applications, not managing infrastructure
- Workloads are bursty and Autopilot’s per-Pod billing keeps idle costs at zero
- You want hardened security defaults without manually configuring Pod Security Standards
- You are running microservices that use standard Kubernetes Deployments, Services, and Ingress
- You want monitoring and logging integrated by default
Example: A team running 5 microservices behind an HTTP load balancer with a Cloud SQL backend. Autopilot provisions exactly the capacity needed, auto-upgrades the cluster, and bills only for the Pods that are running.
When GKE Standard is the right choice
GKE Standard gives you full control over nodes while Google handles the control plane. Choose it when:
- You need GPU-attached nodes for ML training or inference workloads
- Your monitoring or security agents require DaemonSets with privileged access (and are not on Autopilot’s allowlist)
- You need custom machine types, specific OS images (e.g., Ubuntu instead of Container-Optimized OS), or kernel parameter tuning
- You are running workloads that require host networking or specific Linux capabilities Autopilot restricts
- You need fine-grained control over node pool placement, taints, and tolerations
- You want to use private clusters with full control over node network configuration
Example: An ML platform team running training jobs on A100 GPU nodes alongside a CPU node pool for API servers, with a custom Prometheus agent DaemonSet that requires host-level metrics access.
Rare cases where self-managed Kubernetes still makes sense on GCP
Self-managed Kubernetes on Compute Engine is almost always the wrong choice when GKE is available. The engineering cost of operating your own control plane (etcd management, certificate rotation, manual upgrades, CNI maintenance) is substantial and ongoing. But there are narrow exceptions:
- Custom Kubernetes distributions: Your organisation standardises on OpenShift, RKE2, or k3s and needs that specific distribution running on GCP infrastructure.
- Multi-cloud operational consistency: You run an identical Kubernetes toolchain across AWS, Azure, and GCP and need the same bootstrap process everywhere for operational uniformity.
- Control plane customisation: You need API server flags, custom admission controllers, or scheduler configurations that GKE does not expose.
- Regulatory or air-gapped requirements: Specific compliance frameworks require full control over every cluster component, including the control plane, for audit purposes.
If none of these apply, use GKE. For multi-cloud Kubernetes with a managed control plane, consider Google Distributed Cloud (formerly Anthos) before resorting to raw self-managed clusters.
Running self-managed Kubernetes in production without a dedicated Kubernetes engineer is a significant operational risk. Before choosing self-managed, confirm that your team can handle etcd backup and restore, certificate rotation, CNI troubleshooting, and multi-step version upgrades under pressure.
Autopilot vs Standard: the GKE decision
Most teams comparing managed Kubernetes options on GCP are choosing between these two GKE modes, not considering self-managed. Here is the short version:
Start with Autopilot. It provides the full Kubernetes API, removes all node management, and bills per Pod resource request. For standard web services, APIs, batch jobs, and stateful workloads, Autopilot handles everything.
Move to GKE Standard when you hit a specific Autopilot limitation:
- You need GPU node pools for ML workloads
- Your workload requires privileged containers or host-level access that Autopilot blocks
- You need custom machine types or OS images not available in Autopilot
- You want to run Windows Server containers
- Your DaemonSets or system agents are not on Autopilot’s partner allowlist
If you cannot name a specific feature that Autopilot blocks, you should be on Autopilot. “More control” is not a requirement. It is overhead.
Cost considerations
Self-managed: cheap on paper, expensive in practice
Self-managed Kubernetes costs only VM time on the invoice. But the hidden cost is engineering time. A production-grade self-managed cluster needs at least 3 control plane VMs for etcd quorum, plus dedicated time for upgrades, certificate rotation, backups, and incident response. For most organisations, the fully loaded cost of engineering hours far exceeds any GKE management fee.
GKE Standard: cluster fee plus node costs
GKE Standard charges a cluster management fee for the managed control plane, plus standard Compute Engine pricing for the worker node VMs. Check the current GKE pricing page for the latest rates. Google periodically adjusts fees and free-tier eligibility. Node costs scale with the machine types and node count you choose, and Committed Use Discounts apply to nodes.
GKE Autopilot: pay for what your Pods use
Autopilot bills based on the CPU and memory your Pods request. You do not pay for idle node capacity, only for Pods that are scheduled. For bursty workloads with variable traffic, Autopilot is often cheaper than Standard because there is no over-provisioned node capacity sitting idle. For workloads running at consistently high utilisation around the clock, costs are comparable to a well-tuned Standard cluster.
The real cost comparison
When comparing costs, include operational overhead, not just the invoice. GKE Autopilot reduces cost in engineering hours spent on node management, upgrade planning, and capacity tuning. GKE Standard gives you more levers to optimise (spot VMs, committed use discounts, right-sizing node pools) but requires the expertise to use them. Self-managed clusters have the highest operational cost by far.
GKE pricing changes over time. Always verify current rates on the official pricing page before making budget decisions. The cost model described here (management fee for Standard, per-Pod billing for Autopilot) is structurally accurate, but the exact numbers shift.
Common mistakes
- Choosing Kubernetes before you need it. If your workload is a stateless HTTP service or event-driven job, Cloud Run is simpler, cheaper, and faster to deploy. Kubernetes adds real operational complexity. Make sure you have a specific requirement Cloud Run cannot meet before committing to GKE.
- Assuming Autopilot supports every workload unchanged. Autopilot enforces security restrictions that may block workloads designed for Standard clusters. Privileged containers, host network access, and some DaemonSets will not run without modification. Check compatibility before migrating. Do not assume it will “just work.”
- Running zonal clusters for high-availability workloads. A zonal cluster has a single-zone control plane and single-zone nodes. If that zone has an outage, the cluster is unavailable. Regional clusters distribute across three zones and are strongly recommended for production workloads where downtime matters.
- Self-managing for “more control” without a concrete requirement. “We want more control” is not a reason to take on etcd management, certificate rotation, manual upgrades, and CNI maintenance. If you cannot name the specific capability GKE lacks, the extra control is just extra operational burden.
- Forgetting resource requests on Autopilot. Autopilot requires resource requests on all containers to provision the right node capacity. Without them, Pods will not schedule. Set CPU and memory requests on every container spec.
Quick decision
- Default to GKE Autopilot. Managed control plane, managed nodes, full Kubernetes API, billed per Pod request. Right for most teams.
- Use GKE Standard when you need GPU nodes, privileged containers, custom OS images, specific kernel parameters, or full node pool control.
- Self-managed Kubernetes on GCP is rarely justified. It makes sense for custom distributions, multi-cloud tooling consistency, or control plane customisation GKE does not expose.
- Consider Cloud Run first if your workloads are stateless. You may not need Kubernetes at all.
- Use regional clusters for production. Zonal clusters cannot survive a single-zone outage.
- Secure your cluster with Workload Identity regardless of which GKE mode you choose.
Frequently asked questions
What does Google manage in GKE Standard vs Autopilot?
In GKE Standard, Google manages the control plane: API server, etcd, scheduler, and controller manager. You manage the worker nodes — machine types, scaling, OS patches, and node pool configuration. In GKE Autopilot, Google manages the control plane and all node operations. You define Pod specs with resource requests, and Google provisions the right node capacity automatically.
Is self-managed Kubernetes ever justified on GCP?
Rarely. Self-managing Kubernetes on Compute Engine VMs makes sense only in narrow cases: running a distribution GKE does not support (OpenShift, k3s), needing Kubernetes API server flags GKE does not expose, or enforcing identical tooling across multiple clouds for operational consistency. For standard workloads, GKE eliminates the control plane burden entirely.
Can GKE Autopilot run privileged workloads?
Autopilot restricts privileged containers and host-level access by default, but it is not a blanket ban. Google has added allowlisted partner workloads (such as Datadog and Dynatrace agents) that can run with elevated permissions. If your workload needs capabilities Autopilot blocks and is not on the allowlist, GKE Standard gives you full control over security policies.
Are regional clusters required for production on GKE?
Regional clusters are strongly recommended for production because they distribute the control plane and nodes across three zones, surviving a single-zone outage. Zonal clusters are acceptable for development, testing, or workloads where brief downtime during a zone outage is tolerable. Most production workloads should use regional clusters.
When should I use Cloud Run instead of GKE?
Use Cloud Run when your workloads are stateless HTTP services or event-driven jobs, you want zero infrastructure management, traffic is bursty or unpredictable, or your team does not have Kubernetes expertise. Cloud Run scales to zero, deploys in seconds, and costs nothing when idle. Switch to GKE only when you need StatefulSets, DaemonSets, GPU nodes, service mesh, or the full Kubernetes API.