Crossplane composite resource "not ready" timeout in CI
Crossplane reports a composite resource Ready only after all its managed resources are created and healthy at the provider. When a managed resource is failing, the XR stays Ready=False and a CI kubectl wait times out.
What this error means
A pipeline waits on a claim/XR with kubectl wait --for=condition=Ready and fails after the timeout because the resource is stuck at Ready=False or Synced=False.
error: timed out waiting for the condition on xpostgresqlinstances/db-xyz
# kubectl describe shows: Synced=True, Ready=False
# Managed resource RDSInstance: cannot create: AccessDeniedCommon causes
A managed resource fails at the provider
A backing resource (an RDS instance, a bucket) fails to create because of provider credentials, quota, or an invalid field, so the XR never becomes Ready.
The wait timeout is shorter than provisioning
Cloud resources can take minutes to provision; a short kubectl wait --timeout gives up before they are ready.
How to fix it
Inspect the managed resources
- Describe the XR and the managed resources it owns to find the failing one.
- Read its
Synced/Readyconditions and event message (often a provider error). - Fix the provider config or field, then re-reconcile.
kubectl describe xpostgresqlinstance db-xyz
kubectl get managed -o wideGive provisioning enough time
Raise the wait timeout to match real cloud provisioning durations so CI does not give up early.
kubectl wait --for=condition=Ready xpostgresqlinstance/db-xyz --timeout=900sHow to prevent it
- Verify ProviderConfig credentials before applying claims.
- Set wait timeouts that match real provisioning times.
- Check both Synced and Ready conditions when debugging.