kubernetes/kops · error
Fail to get pool with ID: %s: %v
Error message
Fail to get pool with ID: %s: %v
What it means
When the listener has no inline Pools, kOps fetches the listener's default pool by ID via cloud.GetPool. This error means that Octavia API lookup failed, so the listener's pool cannot be resolved during Find.
Source
Thrown at upup/pkg/fi/cloudup/openstacktasks/lblistener.go:85
AllowedCIDRs: listener.AllowedCIDRs,
Lifecycle: lifecycle,
}
if len(listener.Pools) > 0 {
for _, pool := range listener.Pools {
poolTask, err := NewLBPoolTaskFromCloud(cloud, lifecycle, &pool, find.Pool)
if err != nil {
return nil, fmt.Errorf("NewLBListenerTaskFromCloud: Failed to create new LBListener task for pool %s: %v", pool.Name, err)
} else {
listenerTask.Pool = poolTask
// TODO: Support Multiple?
break
}
}
} else {
pool, err := cloud.GetPool(listener.DefaultPoolID)
if err != nil {
return nil, fmt.Errorf("Fail to get pool with ID: %s: %v", listener.DefaultPoolID, err)
}
poolTask, err := NewLBPoolTaskFromCloud(cloud, lifecycle, pool, find.Pool)
if err != nil {
return nil, fmt.Errorf("NewLBListenerTaskFromCloud: Failed to create new LBListener task for pool %s: %v", pool.Name, err)
}
listenerTask.Pool = poolTask
}
if find != nil {
// Update all search terms
find.ID = listenerTask.ID
find.Name = listenerTask.Name
find.Pool = listenerTask.Pool
}
return listenerTask, nil
}
func (s *LBListener) Find(context *fi.CloudupContext) (*LBListener, error) {
if s.Name == nil {View on GitHub (pinned to 4c8573c808)
Solutions
- Check the inner error: 404 means the pool was deleted — recreate it via `kops update cluster` (delete listener or fix kops state) or restore the pool
- Verify visibility/permissions: `openstack loadbalancer pool show <id>` with the same credentials
- Retry after confirming the Octavia API is healthy
Example fix
// before: pool deleted out-of-band openstack loadbalancer pool delete <pool-id> kops update cluster // -> Fail to get pool with ID ...: 404 // after: recreate pool or let kops rebuild kops delete cluster --name c --yes # or recreate pool matching cluster spec kops update cluster --name c --yes
Defensive patterns
Strategy: validation
Validate before calling
// Ensure the listener's default pool exists before updating pool_id=$(openstack loadbalancer listener show $LISTENER_ID -f value -c pools | head -1) openstack loadbalancer pool show $pool_id >/dev/null || echo 'default pool missing — recreate via kops'
Prevention
- Never delete Octavia pools out-of-band while kops manages the cluster
- Use the same project/credentials for manual inspection as kOps uses
- Diff cloud state with `kops toolbox dump` after any manual Octavia change
When it happens
Trigger: Find → NewLBListenerTaskFromCloud where listener.DefaultPoolID is set but GetPool returns an error — the default pool was deleted directly in OpenStack (404) or the API call failed (403/network).
Common situations: Manual `openstack loadbalancer pool delete` while kops still expects it; credentials cannot read the pool; Octavia endpoint temporarily unavailable during `kops update cluster`.
Related errors
- failed to build load balancer client: %w
- cluster configured to use octavia, but router was not config
- error building lb client: %w
- loadbalancer API versions not found
- GetApiIngressStatus: Failed to list openstack loadbalancers:
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/2bac36b55a9c716d.
Report an issue: GitHub.