kubernetes/kops · error

providerID %q not recognized for node %s

Error message

providerID %q not recognized for node %s

What it means

IdentifyNode only recognizes providerIDs with the 'scaleway://' prefix, extracting the server ID from the remainder. This error is thrown when a node has a providerID in some other scheme, so it cannot be mapped to a Scaleway server.

Source

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

	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
		}
	}

	server, err := i.getServer(ctx, serverID)
	if err != nil {
		return nil, err

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the node's providerID starts with 'scaleway://' (kubectl get node <name> -o jsonpath='{.spec.providerID}')
  2. Ensure only Scaleway nodes are routed to the Scaleway nodeidentifier; handle other clouds with their own identifier
  3. Fix whatever component writes the providerID so it emits 'scaleway://<zone>/<server-id>'

Example fix

// before
spec.providerID: "11111111-2222-3333-4444-555555555555"
// after
spec.providerID: "scaleway://fr-par-1/11111111-2222-3333-4444-555555555555"
Defensive patterns

Strategy: validation

Validate before calling

if !strings.HasPrefix(node.Spec.ProviderID, "scaleway://") {
    return fmt.Errorf("node %s providerID %q is not a scaleway providerID", node.Name, node.Spec.ProviderID)
}

Type guard

func isScalewayProviderID(pid string) bool {
    return strings.HasPrefix(pid, "scaleway://") && len(strings.TrimPrefix(pid, "scaleway://")) > 0
}

Try / catch

info, err := identifier.IdentifyNode(ctx, node)
if err != nil && strings.Contains(err.Error(), "not recognized") {
    return dispatchByIdProviderPrefix(ctx, node) // route to the right identifier
}

Prevention

When it happens

Trigger: node.Spec.ProviderID is non-empty but doesn't start with 'scaleway://' — e.g. a bare server UUID, or a providerID from another cloud ('aws://...', 'linode://...') on a node fed to the Scaleway identifier.

Common situations: Mixed/foreign nodes in the cluster, custom tooling writing providerIDs without the scheme prefix, or a node provisioned by a different cloud provider being processed by the Scaleway identifier.

Related errors


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