{"record":{"id":"caf8f7936ab0be62","repo":"kubernetes/kops","slug":"error-listing-akamai-linode-interfaces-for-insta-caf8f7","errorCode":null,"errorMessage":"error listing Akamai (Linode) interfaces for instance %q: %w","messagePattern":"error listing Akamai \\(Linode\\) interfaces for instance %q: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/linodetasks/instance.go","lineNumber":128,"sourceCode":"\t\t}\n\t\tif instance.Image != i.Image {\n\t\t\tneedsUpdate = append(needsUpdate, instance.Label)\n\t\t\tcontinue\n\t\t}\n\t\tif instance.Region != i.Region {\n\t\t\tneedsUpdate = append(needsUpdate, instance.Label)\n\t\t\tcontinue\n\t\t}\n\t\tif !hasAllTags(instance.Tags, expectedTags) {\n\t\t\tneedsUpdate = append(needsUpdate, instance.Label)\n\t\t\tcontinue\n\t\t}\n\t\tif i.Subnet == nil || i.Subnet.ID == nil {\n\t\t\treturn nil, fmt.Errorf(\"Subnet.ID is required\")\n\t\t}\n\t\tinterfaces, err := cloud.Client().ListInterfaces(c.Context(), instance.ID, nil)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"error listing Akamai (Linode) interfaces for instance %q: %w\", instance.Label, err)\n\t\t}\n\t\tif !hasExpectedInterfaces(interfaces, fi.ValueOf(i.Subnet.ID), fi.ValueOf(i.RequirePublicInterface)) {\n\t\t\tneedsUpdate = append(needsUpdate, instance.Label)\n\t\t\tcontinue\n\t\t}\n\t}\n\n\tactual := *i\n\tactual.NeedsUpdate = needsUpdate\n\tactual.Count = len(instances)\n\n\treturn &actual, nil\n}\n\nfunc (i *Instance) Run(c *fi.CloudupContext) error {\n\treturn fi.CloudupDefaultDeltaRunMethod(i, c)\n}\n","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/linodetasks/instance.go#L110-L146","documentation":"During Find, after the subnet check, the task lists the network interfaces of each existing instance via cloud.Client().ListInterfaces(ctx, instanceID, nil) to decide whether interfaces match expectations. Any API error is wrapped as 'error listing Akamai (Linode) interfaces for instance %q: %w' with the instance label. This means reconciliation could not inspect the instance's networking configuration.","triggerScenarios":"ListInterfaces returns an error: LINODE_TOKEN lacks read scope on the instance, the instance was deleted concurrently (404), API rate limiting (429), network failure to api.linode.com, or SDK paging error.","commonSituations":"Rotated/restricted API token without linodes:read scope; instance terminated by autoscaling between list and interface query; transient Linode API outage; hitting API rate limits on clusters with many instances during reconciliation.","solutions":["Check the wrapped error: 401/403 => fix LINODE_TOKEN scopes; 404 => instance vanished, re-run reconciliation; 429 => back off and retry","Verify outbound connectivity from the controller to api.linode.com","Retry the kops apply/reconcile; the error is often transient","Reduce reconciliation concurrency or add backoff if rate-limited on large clusters","Confirm the instance still exists in the Linode account (linode-cli linodes list)"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// ensure credentials and connectivity before reconcile\nif os.Getenv(\"LINODE_TOKEN\") == \"\" { return errors.New(\"LINODE_TOKEN not set\") }\nif err := checkAPIReachable(ctx); err != nil { return err }","typeGuard":null,"tryCatchPattern":"ifaces, err := cloud.Client().ListInterfaces(ctx, instanceID, nil)\nif err != nil {\n\tvar apiErr *linodego.Error\n\tif errors.As(err, &apiErr) && (apiErr.Code == 429 || apiErr.Code >= 500) {\n\t\treturn retryWithBackoff(err)\n\t}\n\treturn fmt.Errorf(\"error listing Akamai (Linode) interfaces for instance %q: %w\", label, err)\n}","preventionTips":["Retry transient API errors (429/5xx) with backoff during reconciliation","Keep LINODE_TOKEN valid with linodes:read scope","Handle 404 as instance-deleted and resync instead of failing hard","Throttle reconciliation concurrency on large clusters to avoid rate limits"],"tags":["linode","api","networking","reconciliation"],"backgroundTag":"api-request-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}