kubernetes/kops · error
deleting load-balancer %s: %w
Error message
deleting load-balancer %s: %w
What it means
Wrap-around error from DeleteLoadBalancer when the lb API DeleteLB call itself fails. It fires only if the preceding WaitForLb succeeded (LB exists) but deletion is rejected or errors; the LB ID and SDK error are wrapped with %w.
Source
Thrown at upup/pkg/fi/cloudup/scaleway/cloud.go:568
// We delete the load-balancer once it's in a stable state
_, err := s.lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
LBID: loadBalancer.ID,
Zone: s.zone,
})
if err != nil {
if is404Error(err) {
klog.V(8).Infof("Load-balancer %q (%s) was already deleted", loadBalancer.Name, loadBalancer.ID)
return nil
}
return fmt.Errorf("waiting for load-balancer: %w", err)
}
err = s.lbAPI.DeleteLB(&lb.ZonedAPIDeleteLBRequest{
Zone: s.zone,
LBID: loadBalancer.ID,
})
if err != nil {
return fmt.Errorf("deleting load-balancer %s: %w", loadBalancer.ID, err)
}
// We wait for the load-balancer to be deleted, then we detach its IPs
_, err = s.lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
LBID: loadBalancer.ID,
Zone: s.zone,
})
if !is404Error(err) {
return fmt.Errorf("waiting for load-balancer %s after deletion: %w", loadBalancer.ID, err)
}
for _, ip := range ipsToRelease {
err := s.lbAPI.ReleaseIP(&lb.ZonedAPIReleaseIPRequest{
Zone: s.zone,
IPID: ip.ID,
})
if err != nil {
return fmt.Errorf("deleting load-balancer IP: %w", err)
}View on GitHub (pinned to 4c8573c808)
Solutions
- Detach remaining LB backends/services/IPs first, or delete them via `scw lb backend delete` / `scw lb ip list`, then retry DeleteLB.
- Check IAM permissions for lb deletion for the kops principal.
- Verify s.zone matches the LB's zone; a mismatched zone yields not-found/invalid errors.
- Retry with backoff on 429/5xx and re-run teardown; check Scaleway status during incidents.
Defensive patterns
Strategy: validation
Validate before calling
// ensure no backends/services remain that could block LB deletion
bks, err := lb.NewZonedAPI(client).ListBackends(&lb.ZonedAPIListBackendsRequest{Zone: s.zone, LBID: lbID})
if err != nil { return err }
for _, b := range bks.Backends {
_ = lb.NewZonedAPI(client).DeleteBackend(&lb.ZonedAPIDeleteBackendRequest{Zone: s.zone, BackendID: b.ID})
} Prevention
- Grant the kops principal full lb write permissions (delete included).
- Detach private-network attachments before LB teardown.
- Run `kops delete cluster` once with adequate permissions rather than partial manual cleanup.
When it happens
Trigger: DeleteLB failure: IAM permission to delete LBs missing, LB still has attached backends/IPs the API refuses to delete, wrong zone in the delete request, API outage or rate limiting.
Common situations: kops principal has read but not delete rights on the LB service; LB has private-network attachments or leftover services blocking deletion; zone mismatch after config drift; transient API errors during cluster teardown.
Related errors
- waiting for load-balancer: %w
- failed to delete record %s: %w
- waiting for load-balancer %s after deletion: %w
- updating back-end server IPs for load-balancer %s: %w
- creating back-end for load-balancer %s: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/ac8243aa224574dc.
Report an issue: GitHub.