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

  1. Detach remaining LB backends/services/IPs first, or delete them via `scw lb backend delete` / `scw lb ip list`, then retry DeleteLB.
  2. Check IAM permissions for lb deletion for the kops principal.
  3. Verify s.zone matches the LB's zone; a mismatched zone yields not-found/invalid errors.
  4. 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

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


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