kubernetes/kops · error

providerID not set for node %s

Error message

providerID not set for node %s

What it means

IdentifyNode queries Scaleway for server info using the node's providerID and requires node.Spec.ProviderID to be set. This error is thrown when the Node has an empty ProviderID, so the Scaleway server cannot be determined.

Source

Thrown at pkg/nodeidentity/scaleway/identify.go:75

		scw.WithProfile(profile),
		scw.WithUserAgent(scaleway.KopsUserAgentPrefix+kopsv.Version),
	)
	if err != nil {
		return nil, fmt.Errorf("creating client for Scaleway NodeIdentifier: %w", err)
	}

	return &nodeIdentifier{
		client:       scwClient,
		cache:        expirationcache.NewTTLStore(stringKeyFunc, cacheTTL),
		cacheEnabled: cacheNodeidentityInfo,
	}, nil
}

// IdentifyNode queries Scaleway for the node identify 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, "scaleway://") {
		return nil, fmt.Errorf("providerID %q not recognized for node %s", providerID, node.Name)
	}

	serverID := strings.TrimPrefix(providerID, "scaleway://")

	// If caching is enabled try pulling nodeidentity.Info from cache before doing a Scaleway 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 the Scaleway cloud-controller-manager is deployed and setting providerIDs on Nodes
  2. Confirm kubelet/cloud bootstrap populates spec.providerID with 'scaleway://<server-id>'
  3. Re-run or restart the CCM so existing Nodes are patched with their providerID

Example fix

// before
# node has spec.providerID: ""
// after
# scaleway CCM sets: spec.providerID: "scaleway://fr-par-1/<server-uuid>"
Defensive patterns

Strategy: validation

Validate before calling

if node.Spec.ProviderID == "" {
    return fmt.Errorf("skip IdentifyNode: node %s has empty providerID", node.Name)
}

Type guard

func hasProviderID(n *corev1.Node) bool {
    return n != nil && n.Spec.ProviderID != ""
}

Try / catch

info, err := identifier.IdentifyNode(ctx, node)
if err != nil && strings.Contains(err.Error(), "providerID not set") {
    return requeueAfter(ctx, node, time.Minute) // wait for CCM to set providerID
}

Prevention

When it happens

Trigger: IdentifyNode is called for a Node whose Spec.ProviderID is "" — the Scaleway CCM or kubelet bootstrap never set it, or the node registered before providerID assignment.

Common situations: Nodes joined without the Scaleway cloud controller running, freshly registered nodes processed too early, or clusters bootstrapped with providerID disabled/misconfigured.

Related errors


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