{"record":{"id":"3d1f2005a9c2f9d6","repo":"kubernetes/kops","slug":"providerid-not-set-for-node-s","errorCode":null,"errorMessage":"providerID not set for node %s","messagePattern":"providerID not set for node (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/nodeidentity/hetzner/identify.go","lineNumber":72,"sourceCode":"\t}\n\topts := []hcloud.ClientOption{\n\t\thcloud.WithToken(hcloudToken),\n\t\thcloud.WithApplication(\"kops\", version.Version),\n\t}\n\thcloudClient := hcloud.NewClient(opts...)\n\n\treturn &nodeIdentifier{\n\t\tclient:       hcloudClient,\n\t\tcache:        expirationcache.NewTTLStore(stringKeyFunc, cacheTTL),\n\t\tcacheEnabled: cacheNodeidentityInfo,\n\t}, nil\n}\n\n// IdentifyNode queries Hetzner Cloud for the node identity information\nfunc (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {\n\tproviderID := node.Spec.ProviderID\n\tif providerID == \"\" {\n\t\treturn nil, fmt.Errorf(\"providerID not set for node %s\", node.Name)\n\t}\n\tif !strings.HasPrefix(providerID, \"hcloud://\") {\n\t\treturn nil, fmt.Errorf(\"providerID %q not recognized for node %s\", providerID, node.Name)\n\t}\n\n\tserverID := strings.TrimPrefix(providerID, \"hcloud://\")\n\n\t// If caching is enabled try pulling nodeidentity.Info from cache before doing a Hetzner Cloud API call.\n\tif i.cacheEnabled {\n\t\tobj, exists, err := i.cache.GetByKey(serverID)\n\t\tif err != nil {\n\t\t\tklog.Warningf(\"Nodeidentity info cache lookup failure: %v\", err)\n\t\t}\n\t\tif exists {\n\t\t\treturn obj.(*nodeidentity.Info), nil\n\t\t}\n\t}\n","sourceCodeStart":54,"sourceCodeEnd":90,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/nodeidentity/hetzner/identify.go#L54-L90","documentation":"IdentifyNode requires the Node's spec.providerID to resolve its Hetzner server; an empty providerID means the kubelet never reported one, so no server lookup is possible. kops throws this immediately before any API call.","triggerScenarios":"node.Spec.ProviderID == \"\" for the Node passed to IdentifyNode — typically a kubelet started without --cloud-provider=hcloud / cloud-provider-external not reporting the provider ID, or a Node object created before cloud integration.","commonSituations":"CSIMigration/cloud-provider-external (hcloud-cloud-controller-manager) not running; kubelet flags missing provider-id; cluster migrated from another provider; manually registered (static) nodes.","solutions":["Ensure hcloud-cloud-controller-manager is running so providerIDs get set","Set the kubelet --provider-id=hcloud://<server-id> via the kops instance group config","Delete the affected Node object and let it re-register with a proper providerID"],"exampleFix":"// before: kubelet without provider id -> this error\n// after (kops InstanceGroup spec)\nspec:\n  kubelet:\n    flagOverride:\n      provider-id: \"hcloud://$(curl -s http://169.254.169.254/hetzner/v1/metadata/instance-id)\"","handlingStrategy":"validation","validationCode":"node, _ := client.CoreV1().Nodes().Get(ctx, name, metav1.GetOptions{})\nif node.Spec.ProviderID == \"\" { /* skip or fix kubelet flags */ }","typeGuard":"func hasProviderID(n *corev1.Node) bool { return n != nil && n.Spec.ProviderID != \"\" }","tryCatchPattern":"info, err := IdentifyNode(ctx, node)\nif err != nil && strings.Contains(err.Error(), \"providerID not set\") {\n  // wait for CCM to populate providerID, requeue\n}","preventionTips":["Deploy hcloud-cloud-controller-manager before joining nodes","Set kubelet --provider-id in the kops InstanceGroup spec","Alert on Nodes with empty providerID"],"tags":["hetzner","provider-id","node-identity","kubelet"],"backgroundTag":"missing-provider-id","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"}