{"record":{"id":"ad59a2221dd630c0","repo":"kubernetes/kops","slug":"error-querying-digitalocean-droplet-id-w","errorCode":null,"errorMessage":"error querying DigitalOcean droplet ID: %w","messagePattern":"error querying DigitalOcean droplet ID: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nodeup/pkg/model/kubelet.go","lineNumber":140,"sourceCode":"\t\t\t}\n\t\t\tmetadata := imds.NewFromConfig(config)\n\t\t\tinstanceIdentity, err := metadata.GetInstanceIdentityDocument(ctx, &imds.GetInstanceIdentityDocumentInput{})\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tproviderID = fmt.Sprintf(\"aws:///%s/%s\", instanceIdentity.AvailabilityZone, instanceIdentity.InstanceID)\n\t\t} else if b.CloudProvider() == kops.CloudProviderAzure {\n\t\t\tmetadata, err := azuremetadata.QueryComputeInstanceMetadata(ctx)\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error querying Azure instance metadata: %v\", err)\n\t\t\t}\n\t\t\tproviderID = \"azure://\" + metadata.ResourceID\n\t\t} else if b.CloudProvider() == kops.CloudProviderDO {\n\t\t\t// The DO CCM resolves nodes by provider ID; its name-based fallback does not match\n\t\t\t// our IP-based node names.\n\t\t\tdropletID, err := dometadata.GetDropletID()\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error querying DigitalOcean droplet ID: %w\", err)\n\t\t\t}\n\t\t\tproviderID = \"digitalocean://\" + dropletID\n\t\t}\n\n\t\tt, err := b.buildKubeletComponentConfig(kubeletConfig, providerID)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tc.AddTask(t)\n\t}\n\n\t{\n\t\tt, err := b.buildSystemdEnvironmentFile(c.Context(), kubeletConfig)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tc.AddTask(t)","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/nodeup/pkg/model/kubelet.go#L122-L158","documentation":"Wraps a failure of the DigitalOcean metadata query during kubelet builder setup on a DO droplet: the node's provider ID cannot be determined because the droplet metadata service did not answer correctly.","triggerScenarios":"GetDropletID fails — the DigitalOcean metadata endpoint (169.254.169.254/metadata) is unreachable, times out, or returns a response without a droplet id.","commonSituations":"Metadata service blocked by firewall, running nodeup outside a real droplet (e.g. in a container/Packer build), transient DO metadata outage.","solutions":["Ensure the node can reach the DO metadata service at 169.254.169.254.","Run nodeup on an actual droplet; it cannot resolve droplet ID elsewhere.","Retry after transient metadata failures.","Check the wrapped error (uses %w) with errors.Is/As for network vs parse cause."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// before nodeup on a droplet: probe DO metadata\nbody, err := fetch(\"http://169.254.169.254/metadata/v1/id\")\nif err != nil || body == \"\" {\n    return errors.New(\"droplet metadata unavailable\")\n}","typeGuard":null,"tryCatchPattern":"err := runNodeup(ctx)\nif err != nil {\n    var doErr error\n    if errors.As(err, &doErr) && strings.Contains(err.Error(), \"droplet ID\") {\n        // error is wrapped with %w; inspect cause and retry on timeouts\n        return retryAfter(30*time.Second, err)\n    }\n    return err\n}","preventionTips":["Run nodeup only on real droplets, not images/Packer builds or containers.","Allow egress to 169.254.169.254 link-local metadata.","Treat metadata timeouts as transient and retry."],"tags":["nodeup","digitalocean","metadata","kubelet"],"backgroundTag":"instance-metadata-unreachable","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}