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 = loadbalancerTask

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Identify the shared pool (openstack loadbalancer pool list / pool show) and detach it from all but one load balancer.
  2. Delete the extraneous/duplicate pool if it is not managed by kops.
  3. 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.
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/20c9b641b3c60253. Report an issue: GitHub.