highIntermediateUSE#compute engine#provisioning#startup#zone

GCE instance stuck in PROVISIONING state

gcloud compute instances list shows PROVISIONING for minutes

Likely source:availabilityperformance

Focused incident mode — strips away everything but this runbook.

Symptoms

  • gcloud compute instances list shows PROVISIONING for minutes
  • Instance is not RUNNING despite start request succeeding
  • SSH attempts fail even though the operation reported success
  • New MIG replicas hang before they can serve traffic

PROVISIONING is normally seconds; if it persists past a few minutes the placement is blocked by capacity, quota, or a reservation. Do not delete the VM before checking operations — you can lose the attached disk.

Evidence to grab

Collect these artifacts before you change anything — they prove (or rule out) each cause.

  • Instance state and last operation

    gcloud compute instances describe <INSTANCE> --zone=<ZONE> --format='value(status,lastStartTimestamp)'
  • Recent compute operations

    gcloud compute operations list --filter='targetLink~<INSTANCE>' --format='table(name,operationType,status,insertTime)'

Diagnostic flow

Run the steps in order, marking each claim confirmed or refuted. The evidence you gather feeds the ranked causes below.

Guided decision tree is ready.

Steps with commands, expected output, and pass/fail branches.

Ranked root causes

Evidence checklist

  • Multiple VM starts hang in PROVISIONING at the same time
  • gcloud compute zones shows reduced availability or quota nearly exhausted
  • Start operation stays RUNNING for a long time

Confirm before fixing

gcloud compute regions describe <REGION> --format='value(quotas)'
READ

Inspect remaining quota in the region

Expected: CPUS_ALL_REGIONS quota with available headroom

Fix

gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>
CHANGE

Move the VM to a healthier zone if the current one is degraded

Expected: Instance [<INSTANCE>] moved...

Resolution runbook

Apply from top to bottom after the cause is confirmed. Review every command before running it — risk tags are shown on each.

1
gcloud compute instances describe <INSTANCE> --zone=<ZONE> --format='value(status)'
READ

Confirm the stuck state

2
gcloud compute operations list --filter='targetLink~<INSTANCE>' --limit=10 --format='table(name,operationType,status,error)'
READ

Look for an errored or hung start operation

3
gcloud compute instances start <INSTANCE> --zone=<ZONE>
CHANGE

Retry start if a transient error is present

4
gcloud compute instances move <INSTANCE> --zone=<ZONE> --destination-zone=<ALT_ZONE>
CHANGE

Move to another zone if the current one is under capacity

Prevention

  • Spread critical instances across multiple zones so a capacity stall hits them one at a time.
  • Reserve CUD/reservations for machine types you depend on in hot zones.
  • Monitor instance group provisioning by adding an SLA on time-to-RUNNING.
  • Keep start/stop retry logic in provisioning scripts instead of manual intervention.

Commands marked READ CHANGE DESTRUCTIVE — never run DESTRUCTIVE commands against production data you cannot restore. Copy → verify → execute.