kubernetes/kops · error
providerID not set for node %s
Error message
providerID not set for node %s
What it means
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.
Source
Thrown at pkg/nodeidentity/hetzner/identify.go:72
}
opts := []hcloud.ClientOption{
hcloud.WithToken(hcloudToken),
hcloud.WithApplication("kops", version.Version),
}
hcloudClient := hcloud.NewClient(opts...)
return &nodeIdentifier{
client: hcloudClient,
cache: expirationcache.NewTTLStore(stringKeyFunc, cacheTTL),
cacheEnabled: cacheNodeidentityInfo,
}, nil
}
// IdentifyNode queries Hetzner Cloud for the node identity information
func (i *nodeIdentifier) IdentifyNode(ctx context.Context, node *corev1.Node) (*nodeidentity.Info, error) {
providerID := node.Spec.ProviderID
if providerID == "" {
return nil, fmt.Errorf("providerID not set for node %s", node.Name)
}
if !strings.HasPrefix(providerID, "hcloud://") {
return nil, fmt.Errorf("providerID %q not recognized for node %s", providerID, node.Name)
}
serverID := strings.TrimPrefix(providerID, "hcloud://")
// If caching is enabled try pulling nodeidentity.Info from cache before doing a Hetzner Cloud API call.
if i.cacheEnabled {
obj, exists, err := i.cache.GetByKey(serverID)
if err != nil {
klog.Warningf("Nodeidentity info cache lookup failure: %v", err)
}
if exists {
return obj.(*nodeidentity.Info), nil
}
}
View on GitHub (pinned to 4c8573c808)
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
Example fix
// before: kubelet without provider id -> this error
// after (kops InstanceGroup spec)
spec:
kubelet:
flagOverride:
provider-id: "hcloud://$(curl -s http://169.254.169.254/hetzner/v1/metadata/instance-id)" Defensive patterns
Strategy: validation
Validate before calling
node, _ := client.CoreV1().Nodes().Get(ctx, name, metav1.GetOptions{})
if node.Spec.ProviderID == "" { /* skip or fix kubelet flags */ } Type guard
func hasProviderID(n *corev1.Node) bool { return n != nil && n.Spec.ProviderID != "" } Try / catch
info, err := IdentifyNode(ctx, node)
if err != nil && strings.Contains(err.Error(), "providerID not set") {
// wait for CCM to populate providerID, requeue
} Prevention
- Deploy hcloud-cloud-controller-manager before joining nodes
- Set kubelet --provider-id in the kops InstanceGroup spec
- Alert on Nodes with empty providerID
When it happens
Trigger: 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.
Common situations: CSIMigration/cloud-provider-external (hcloud-cloud-controller-manager) not running; kubelet flags missing provider-id; cluster migrated from another provider; manually registered (static) nodes.
Related errors
- providerID %q not recognized for node %q
- providerID %q not recognized for node %s
- failed to convert server ID %q to int: %w
- error building metal node identifier: %w
- error building linode node identifier: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/3d1f2005a9c2f9d6.
Report an issue: GitHub.