Common issues and solutions for 5-Spot.
# Operator pods
kubectl get pods -n 5spot-system
# Operator logs (JSON — pipe through jq for readability)
kubectl logs -n 5spot-system -l app=5spot-controller --tail=100 | jq .
# Plain-text logs (for quick reads without jq)
RUST_LOG_FORMAT=text kubectl logs -n 5spot-system -l app=5spot-controller --tail=100
# Detailed pod info
kubectl describe pod -n 5spot-system -l app=5spot-controllerEvery reconciliation carries a unique reconcile_id field. Use it to isolate all log lines for a single reconciliation attempt:
# Stream logs and filter by resource name, showing reconcile_id
kubectl logs -n 5spot-system -l app=5spot-controller -f | \
jq -c 'select(.fields.resource == "<machine-name>")'
# Trace a specific reconciliation end-to-end
kubectl logs -n 5spot-system -l app=5spot-controller | \
jq -c 'select(.fields.reconcile_id == "<id-from-a-previous-log-line>")'
# Find all Error-phase transitions
kubectl logs -n 5spot-system -l app=5spot-controller | \
jq -c 'select(.fields.to_phase == "Error")'# List all ScheduledMachines
kubectl get scheduledmachines -A
# Detailed status
kubectl describe scheduledmachine <name>
# Get status as JSON
kubectl get scheduledmachine <name> -o jsonpath='{.status}'# List CAPI machines
kubectl get machines -A
# Describe machine
kubectl describe machine <name>Symptoms:
- Machine stays in
Pendingphase - No Machine resource created
Possible Causes:
-
Schedule not matching current time
# Check current time vs schedule kubectl get scheduledmachine <name> -o jsonpath='{.spec.schedule}' date -u # Compare with UTC
-
Operator not running
kubectl get pods -n 5spot-system
-
RBAC permissions
kubectl auth can-i create machines --as=system:serviceaccount:5spot-system:5spot-controller
Solution:
- Verify schedule matches current time and timezone
- Check controller logs for errors
- Ensure RBAC is correctly configured
Symptoms:
- Machine stays in
Activeafter schedule window - Grace period seems to never complete
Possible Causes:
-
Pods not draining
kubectl get pods -o wide | grep <machine-name>
-
PodDisruptionBudget blocking eviction
PDB-blocked evictions (HTTP 429) now surface as a
CapiErrorin the reconciler and will cause the machine to enter theErrorphase. Check for blocking PDBs:kubectl get pdb -A # Look for PDBs with maxUnavailable: 0 or minAvailable matching current replicas kubectl get pdb -A -o json | jq '.items[] | {name:.metadata.name, ns:.metadata.namespace, disruptions:.status.disruptionsAllowed}'
-
Long grace period
kubectl get scheduledmachine <name> -o jsonpath='{.spec.gracefulShutdownTimeout}'
Solution:
- Check for pods that can't be evicted; look for
warnlog lines with"Pod eviction blocked by PDB (HTTP 429)" - Review PDB settings — temporarily scale up or relax
minAvailableto allow drain - Consider using
killSwitch: truefor immediate removal (bypasses drain)
Symptoms:
- Machine doesn't activate during schedule window
- No status changes
Possible Causes:
-
Schedule disabled
kubectl get scheduledmachine <name> -o jsonpath='{.spec.schedule.enabled}'
-
Timezone mismatch
kubectl get scheduledmachine <name> -o jsonpath='{.spec.schedule.timezone}' TZ=<timezone> date # Check time in that timezone
-
Multi-instance: wrong instance handling resource
# Check which instance should handle this resource kubectl logs -n 5spot-system -l app=5spot-controller | grep <resource-name>
Solution:
- Ensure
enabled: true - Verify timezone is correct
- Check controller instance distribution
Symptoms:
- Error events on ScheduledMachine
- CAPI Machine not being created
Possible Causes:
-
Invalid bootstrapRef or infrastructureRef
kubectl get scheduledmachine <name> -o jsonpath='{.spec.bootstrapRef}' kubectl get <kind> <name> -n <namespace> # Verify reference exists
-
CAPI provider not ready
kubectl get pods -n capi-system kubectl get pods -n capi-kubeadm-bootstrap-system
Solution:
- Verify references point to existing resources
- Check CAPI provider health
- Review CAPI controller logs
Symptoms:
- Repeated error events on a
ScheduledMachine - Logs show
retry_countclimbing andbackoff_secsgrowing (30 → 60 → 120 → 240 → 300)
Cause: The controller uses bounded exponential back-off. Each consecutive failure doubles the retry delay up to 300 s (5 min). The counter resets after a successful reconciliation.
# Watch the retry_count and backoff_secs fields
kubectl logs -n 5spot-system -l app=5spot-controller -f | \
jq -c 'select(.fields.resource == "<machine-name>") | {retry: .fields.retry_count, backoff: .fields.backoff_secs, error: .fields.error}'Solution:
- Check the underlying error causing repeated failures (CAPI, schedule, validation)
- Once the root cause is fixed, the next successful reconciliation resets the counter
- If the resource is stuck at max backoff (300 s), fix the underlying issue and patch the resource to trigger an immediate reconcile:
kubectl annotate scheduledmachine <name> 5spot.finos.org/force-reconcile="$(date -u +%s)" --overwrite
Cause: Multi-instance deployment where this resource is assigned to a different instance.
Solution: This is expected behavior. Each instance handles a subset of resources.
Cause: Invalid schedule configuration.
Solution: Check schedule syntax:
- Days:
mon-fri, notmonday-friday - Hours:
9-17, not9:00-17:00 - Timezone: Valid IANA name like
America/New_York
Cause: CAPI couldn't create the machine.
Solution:
- Check CAPI logs:
kubectl logs -n capi-system -l control-plane=controller-manager - Verify infrastructure provider is configured
- Check bootstrap template validity
# Operator version
kubectl get deployment -n 5spot-system 5spot-controller -o jsonpath='{.spec.template.spec.containers[0].image}'
# Full controller logs
kubectl logs -n 5spot-system -l app=5spot-controller --all-containers > controller-logs.txt
# ScheduledMachine YAML
kubectl get scheduledmachine <name> -o yaml > scheduledmachine.yaml
# Events
kubectl get events -A --sort-by='.lastTimestamp' > events.txtWhen filing a GitHub issue, include:
- 5-Spot version
- Kubernetes version
- CAPI version
- Operator logs (sensitive data redacted)
- ScheduledMachine YAML
- Expected vs actual behavior
- Configuration - Operator configuration
- Monitoring - Metrics and health checks
- Machine Lifecycle - Understanding phases