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

  1. Ensure hcloud-cloud-controller-manager is running so providerIDs get set
  2. Set the kubelet --provider-id=hcloud://<server-id> via the kops instance group config
  3. 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

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


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