kubernetes/kops · error

Failed to update member: %v

Error message

Failed to update member: %v

What it means

On the update path (a != nil), RenderOpenstack calls Cloud.UpdateMemberInPool to apply changed member options (currently Weight). If Octavia rejects the member update, kOps wraps the error with this message and the member keeps its old settings.

Source

Thrown at upup/pkg/fi/cloudup/openstacktasks/poolassociation.go:194

			}

			member, err := t.Cloud.AssociateToPool(&server, fi.ValueOf(e.Pool.ID), v2pools.CreateMemberOpts{
				Name:         fi.ValueOf(e.Name),
				ProtocolPort: fi.ValueOf(e.ProtocolPort),
				SubnetID:     fi.ValueOf(e.Pool.Loadbalancer.VipSubnet),
				Address:      memberAddress,
			})
			if err != nil {
				return fmt.Errorf("Failed to create member: %v", err)
			}
			e.ID = new(member.ID)
		}
	} else {
		_, err := t.Cloud.UpdateMemberInPool(fi.ValueOf(a.Pool.ID), fi.ValueOf(a.ID), v2pools.UpdateMemberOpts{
			Weight: e.Weight,
		})
		if err != nil {
			return fmt.Errorf("Failed to update member: %v", err)
		}
	}
	return nil
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the wrapped Octavia status: 404 means delete stale state and let kops recreate the member
  2. Verify the loadbalancer is ACTIVE (fix PENDING_* states via `openstack loadbalancer failover` if needed)
  3. Confirm the Weight value is within Octavia's valid range (0-256)
  4. Retry after transient 5xx; re-authenticate on 401

Example fix

// before
weight: fi.Int32(999) // outside Octavia range
// after
weight: fi.Int32(128)
Defensive patterns

Strategy: try-catch

Validate before calling

// confirm member still exists before update
out, err := exec.Command("openstack", "loadbalancer", "member", "list", poolID).Output()
if err != nil || !bytes.Contains(out, []byte(memberID)) {
	return fmt.Errorf("member %s missing; let kops recreate it", memberID)
}

Type guard

func isValidOctaviaWeight(w int32) bool { return w >= 0 && w <= 256 }

Try / catch

_, err := t.Cloud.UpdateMemberInPool(poolID, memberID, v2pools.UpdateMemberOpts{Weight: e.Weight})
if err != nil {
	var gerr gophercloud.ErrUnexpectedResponseCode
	if errors.As(err, &gerr) {
		switch gerr.Actual {
		case 404: // member gone: clear stale ID so kops recreates
		case 409: // LB pending: wait/failover then retry
		}
	}
	return fmt.Errorf("Failed to update member: %v", err)
}

Prevention

When it happens

Trigger: t.Cloud.UpdateMemberInPool(poolID, memberID, UpdateMemberOpts{Weight: ...}) errors: member ID no longer exists (404, deleted out-of-band), loadbalancer in PENDING state (409), invalid weight value, or Octavia API 401/403/5xx.

Common situations: Member removed manually while kops still tracks its ID; loadbalancer stuck PENDING from a concurrent operation; weight set outside Octavia's accepted range in the cluster spec; token expiry during a long reconcile.

Related errors


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