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
- Check the wrapped Octavia status: 404 means delete stale state and let kops recreate the member
- Verify the loadbalancer is ACTIVE (fix PENDING_* states via `openstack loadbalancer failover` if needed)
- Confirm the Weight value is within Octavia's valid range (0-256)
- 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
- Keep member weights within Octavia's 0-256 range
- Do not delete Octavia members manually while kops tracks them
- Resolve PENDING loadbalancer states before re-running updates
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
- Failed to create member: %v
- failed to build load balancer client: %w
- 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/39e77256dd09cf4b.
Report an issue: GitHub.