kubernetes/kops · error

error deleting Akamai (Linode) instance %s(%s): %w

Error message

error deleting Akamai (Linode) instance %s(%s): %w

What it means

deleteInstance deletes a Linode compute instance belonging to the cluster. Failures other than not-found (treated as success) are wrapped with the instance name and ID. This aborts cleanup of that instance.

Source

Thrown at pkg/resources/linode/resources.go:341

		return fmt.Errorf("error deleting Akamai (Linode) subnet %s(%s): %w", tracker.Name, tracker.ID, err)
	}

	return nil
}

// deleteInstance deletes an Akamai (Linode) instance.
func deleteInstance(cloud fi.Cloud, tracker *resources.Resource) error {
	c := cloud.(cloudlinode.LinodeCloud)
	instanceID, err := parseTrackerIntID(tracker)
	if err != nil {
		return err
	}

	if err := c.Client().DeleteInstance(context.Background(), instanceID); err != nil {
		if linodego.IsNotFound(err) {
			return nil
		}
		return fmt.Errorf("error deleting Akamai (Linode) instance %s(%s): %w", tracker.Name, tracker.ID, err)
	}

	return nil
}

// deleteVolume deletes an Akamai (Linode) block storage volume.
func deleteVolume(cloud fi.Cloud, tracker *resources.Resource) error {
	c := cloud.(cloudlinode.LinodeCloud)
	volumeID, err := parseTrackerIntID(tracker)
	if err != nil {
		return err
	}

	if err := c.Client().DeleteVolume(context.Background(), volumeID); err != nil {
		if linodego.IsNotFound(err) {
			return nil
		}
		return fmt.Errorf("error deleting Akamai (Linode) volume %s(%s): %w", tracker.Name, tracker.ID, err)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Retry 'kops delete cluster'; not-found instances are skipped
  2. Detach and delete attached volumes before the instance
  3. Use a full read/write API token
  4. Check for Linode API 429s and back off
  5. Manually delete the Linode from Cloud Manager if the API keeps refusing, then re-run kops delete
Defensive patterns

Strategy: retry

Validate before calling

inst, err := c.Client().GetInstance(ctx, instanceID)
// if err is nil, detach volumes / confirm instance state before DeleteInstance

Type guard

func isNotFound(err error) bool { return linodego.IsNotFound(err) }

Try / catch

if err := c.Client().DeleteInstance(ctx, instanceID); err != nil {
	if linodego.IsNotFound(err) { return nil }
	if linodego.ErrCode(err) == 429 { /* backoff and retry */ }
	return fmt.Errorf("error deleting Akamai (Linode) instance %s(%s): %w", tracker.Name, tracker.ID, err)
}

Prevention

When it happens

Trigger: c.Client().DeleteInstance(ctx, instanceID) fails: token lacks write scopes, instance has protected resources (e.g., attached volumes with deletion protection), network error, or rate limit during bulk deletion.

Common situations: Shutting down an instance with attached block storage volumes first is required; read-only token during delete; API rate limiting when deleting many instances; instance already being deleted by another process (may surface as conflict).

Related errors


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