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 'openstack://' prefix, since the instance ID/UUID is taken from the remainder of that string. This error is thrown when a node has a providerID but it does not use the expected OpenStack scheme.

Source

Thrown at pkg/nodeidentity/openstack/identify.go:101

	if err != nil {
		return nil, fmt.Errorf("error building nova client: %v", err)
	}

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

// IdentifyNode queries OpenStack 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 was not set for node %s", node.Name)
	}
	if !strings.HasPrefix(providerID, "openstack://") {
		return nil, fmt.Errorf("providerID %q not recognized for node %s", providerID, node.Name)
	}

	instanceID := strings.TrimPrefix(providerID, "openstack://")
	// instanceid looks like its openstack:/// but no idea is that really correct like that?
	// this supports now both openstack:// and openstack:/// format

	instanceID = strings.TrimPrefix(instanceID, "/")

	// 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(instanceID)
		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. Verify the node's providerID starts with 'openstack://' (kubectl get node <name> -o jsonpath='{.spec.providerID}')
  2. Ensure the node actually belongs to the OpenStack cluster and isn't foreign/foreign-prefixed
  3. Fix the component writing the providerID so it emits the canonical 'openstack://<instance-id>' format

Example fix

// before
spec.providerID: "openstack-abc-123"
// after
spec.providerID: "openstack://abc-123"
Defensive patterns

Strategy: validation

Validate before calling

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

Type guard

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

Try / catch

info, err := identifier.IdentifyNode(ctx, node)
if err != nil && strings.Contains(err.Error(), "not recognized") {
    return routeToCorrectIdentifier(ctx, node) // dispatch by actual provider prefix
}

Prevention

When it happens

Trigger: node.Spec.ProviderID is non-empty but lacks the 'openstack://' prefix — e.g. 'openstack:///' is fine, but 'aws:///i-abc', 'openstack-123', or a bare UUID will fail strings.HasPrefix and throw.

Common situations: Nodes provisioned by a different cloud than the identifier being used, providerIDs written in a nonstandard format by custom tooling, or copy-pasted/templated providerIDs missing the scheme.

Related errors


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