kubernetes/kops · error
Openstack cloud pools with multiple loadbalancers not yet su
Error message
Openstack cloud pools with multiple loadbalancers not yet supported!
What it means
NewLBPoolTaskFromCloud rejects Octavia pools that reference more than one load balancer. kOps assumes a 1:1 pool-to-loadbalancer mapping when reconstructing task state during find/refresh. A shared pool attached to multiple LBs cannot be modeled, so it fails fast instead of producing wrong state.
Source
Thrown at upup/pkg/fi/cloudup/openstacktasks/lbpool.go:55
func (e *LBPool) GetDependencies(tasks map[string]fi.CloudupTask) []fi.CloudupTask {
var deps []fi.CloudupTask
for _, task := range tasks {
if _, ok := task.(*LB); ok {
deps = append(deps, task)
}
}
return deps
}
var _ fi.CompareWithID = (*LBPool)(nil)
func (s *LBPool) CompareWithID() *string {
return s.ID
}
func NewLBPoolTaskFromCloud(cloud openstack.OpenstackCloud, lifecycle fi.Lifecycle, pool *v2pools.Pool, find *LBPool) (*LBPool, error) {
if len(pool.Loadbalancers) > 1 {
return nil, fmt.Errorf("Openstack cloud pools with multiple loadbalancers not yet supported!")
}
a := &LBPool{
ID: new(pool.ID),
Name: new(pool.Name),
Lifecycle: lifecycle,
}
if len(pool.Loadbalancers) == 1 {
lbID := pool.Loadbalancers[0]
lb, err := cloud.GetLB(lbID.ID)
if err != nil {
return nil, fmt.Errorf("NewLBPoolTaskFromCloud: Failed to get lb with id %s: %v", lbID.ID, err)
}
loadbalancerTask, err := NewLBTaskFromCloud(cloud, lifecycle, lb, nil)
if err != nil {
return nil, err
}
a.Loadbalancer = loadbalancerTaskView on GitHub (pinned to 4c8573c808)
Solutions
- Identify the shared pool (openstack loadbalancer pool list / pool show) and detach it from all but one load balancer.
- Delete the extraneous/duplicate pool if it is not managed by kops.
- Scope the search: set the pool's ID in the task state or ensure pool names are unique so the listing does not surface shared pools.
- If the sharing is intentional, manage that pool outside kops (avoid name collisions) since kOps does not support it.
Example fix
// before: pool shared across two LBs $ openstack loadbalancer pool show web-pool # loadbalancers: [lb-1, lb-2] // after: detach from the second LB $ openstack loadbalancer member remove lb-2 web-pool <member-id> $ openstack loadbalancer pool delete --wait # or recreate dedicated pool per LB
Defensive patterns
Strategy: validation
Validate before calling
pool := octaviaPoolShow(poolID)
if len(pool.Loadbalancers) > 1 {
return fmt.Errorf("pool %s is shared across %d load balancers; detach extras before running kops", poolID, len(pool.Loadbalancers))
} Try / catch
if err := importPoolsFromCloud(); err != nil {
if strings.Contains(err.Error(), "multiple loadbalancers not yet supported") {
// fall back to manual pool management outside kops
return managePoolExternally()
}
return err
} Prevention
- Keep a strict 1:1 mapping of pools to load balancers in the OpenStack project.
- Name pools uniquely and only via kops-managed workflows.
- Audit the project for manually shared pools before kops updates.
When it happens
Trigger: During Find (or NewLBListenerTaskFromCloud) the pool listing (GET /v2/lbaas/pools) returns a pool whose loadbalancers array has length > 1 — i.e. the same pool is attached to two or more Octavia load balancers.
Common situations: Operators manually shared a pool across load balancers in the OpenStack console/CLI; leftover pools from previous cluster versions; pools created by other tooling inside the kops-managed project that happen to match name/ID filters.
Related errors
- Multiple pools found for name %s
- error creating LB pool: %v
- failed to build load balancer client: %w
- cluster configured to use octavia, but router was not config
- error building lb client: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/20c9b641b3c60253.
Report an issue: GitHub.