Troubleshooting
This page maps the symptoms you’ll actually see to their cause. Start with the
metrics (bigfleet_ovh_*) and the structured logs — every RPC logs method,
code, and dur_ms, and lifecycle errors log at WARN.
”It’s creating real nothing” — ovh_backend=fake in production
Symptom: no instances appear in the OVH console; the startup log says
ovh_backend=fake and warns about the in-memory backend.
Cause: the provider resolved to the fake backend because --region was not
set (or --ovh-backend=auto with no region). The fake backend creates no real
instances.
Fix: set --region (and the OS_* credentials). With --ovh-backend=auto,
a set --region selects the real backend; or force it with --ovh-backend=ovh.
A machine sticks in CREATING, then goes FAILED
Cause: servers.Create succeeded but the instance never reached ACTIVE
within the Create timeout (the provider blocks on ACTIVE so Idle means reachable),
or the create itself errored.
Check:
bigfleet_ovh_api_calls_total{op="CreateServer",outcome="error"}and the WARN log line — a bad--imageUUID, an unknown flavor in the region, a missing--network, or quota exhaustion all surface here.- The instance’s status in the OVH console —
ERRORmeans the hypervisor rejected it (image/flavor/quota); the provider fails fast onERROR. last_erroron the machine (Get) carries the reason.
Fix: correct the image UUID / flavor / network, or raise the project quota.
A machine goes FAILED right after Configure
Cause: the bootstrap delivery over SSH failed. Most common reasons:
- No
--ssh-key. Without it, Configure cannot deliver the blob and fails. Set--ssh-keyand the matching--key-namekeypair. - The keypair public key isn’t authorised on the instance. Ensure
--key-namenames the OpenStack keypair whose public key the base image’s cloud user (--ssh-user, defaultubuntu) accepts. - Host-key mismatch. The presented SSH host key didn’t match the pin from
create — the connection aborts as a possible MITM. Look for
host key mismatchin the logs. Legitimately, this happens if the instance was rebuilt out of band; delete and re-create the slot. - The bootstrap hook exited non-zero. Your image’s
--bootstrap-hookfailed to join the cluster. The provider waits for the hook to succeed, so a broken join becomesFAILED(by design — not a falsely-Idle node). Check the hook’s logs on the instance; the blob is at<hook>.blob.
Fix: address the cause above; the shard re-drives Configure on the next reconcile.
FailedPrecondition errors on Create/Configure/Drain/Delete
Cause: these are fencing rejections, not bugs. A mutating RPC arrived with
a token that is not strictly newer than the per-(shard_id, machine_id) high-water mark — a zombie or
out-of-order shard. The provider reserves FAILED_PRECONDITION exclusively for
fencing.
Check: bigfleet_ovh_grpc_requests_total{code="FailedPrecondition"}. A steady
stream points at a shard epoch/sequence problem on the BigFleet side, not the
provider. A few during a failover are expected.
Inventory looks wrong after a restart
Cause: the provider was running without --state, so fence marks, the
idempotency map, inventory, and bindings were in memory only and lost on restart.
Fix: always run with --state on a PersistentVolume in production
(state.enabled=true + state.persistence.enabled=true). The FileStore is the
primary restart path; the background reconcile (--reconcile-interval) then
re-reconciles against live OpenStack truth. With --state, a kill+restart recovers
marks, ops, and bindings exactly (this is the durability lane of certification).
unknown flavor "…" at Create
Cause: the offering names a flavor that does not exist in the region (or is not
available to the project). The provider resolves flavor names to ids from
flavors.ListDetail.
Fix: use a valid OVH flavor for the region (e.g. b2-7, c2-15); list them
with openstack flavor list. The pinned table covers allocatable for common
flavors, but the real flavor must exist in the region to launch.
network "Ext-Net" not found
Cause: --network named a network that doesn’t exist in the region, or the
user can’t see it.
Fix: pass a valid network name or UUID (openstack network list), or leave
--network empty to use the project default.
Drain takes a long time / times out
Cause: kubectl drain is honouring PodDisruptionBudgets and
grace_period_seconds. The Drain timeout is generous (15m) for exactly this.
Fix: usually none needed — let it complete. If it consistently times out, inspect PDBs on the workloads; a too-strict PDB can block drain indefinitely.