kubernetes/kops · error

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

Error message

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

What it means

deleteVPC removes the cluster's Linode VPC. Any DeleteVPC failure other than not-found (which is treated as success) is wrapped with the VPC name and ID. It indicates the Linode API refused or failed the VPC deletion call.

Source

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

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

	return nil
}

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

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

	return nil
}

// deleteSubnet deletes an Akamai (Linode) VPC subnet.
func deleteSubnet(vpcID int, cloud fi.Cloud, tracker *resources.Resource) error {
	c := cloud.(cloudlinode.LinodeCloud)
	subnetID, err := parseTrackerIntID(tracker)
	if err != nil {
		return err
	}

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

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Ensure all subnets and instances in the VPC are deleted first (kops does this in dependency order; retry if interrupted)
  2. Use an API token with write access
  3. Retry the delete after partial failures
  4. Remove lingering VPC interfaces via Linode Cloud Manager if needed
  5. Check the wrapped error's HTTP status for the exact cause
Defensive patterns

Strategy: validation

Validate before calling

// Confirm the VPC has no attached resources before deletion
subnets, err := c.Client().ListVPCSubnets(ctx, vpcID, nil)
// also confirm no compute instances remain attached to VPC interfaces

Type guard

func isVPCInUse(err error) bool { c := linodego.ErrCode(err); return c == 400 || c == 409 }

Try / catch

if err := c.Client().DeleteVPC(ctx, vpcID); err != nil {
	if linodego.IsNotFound(err) { return nil }
	if isVPCInUse(err) { /* delete subnets/instances first, then retry */ }
	return fmt.Errorf("error deleting Akamai (Linode) VPC %s(%s): %w", tracker.Name, tracker.ID, err)
}

Prevention

When it happens

Trigger: c.Client().DeleteVPC(ctx, vpcID) fails: token lacks write scopes, VPC still has attached resources (subnets/instances/interfaces) preventing deletion, network error, or rate limit.

Common situations: Deleting a VPC before its subnets/instances are torn down; using a read-only token during 'kops delete cluster'; orphaned VPC with lingering Linode interfaces attached.

Related errors


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