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
- Verify the node's providerID starts with 'openstack://' (kubectl get node <name> -o jsonpath='{.spec.providerID}')
- Ensure the node actually belongs to the OpenStack cluster and isn't foreign/foreign-prefixed
- 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
- Dispatch node identification by providerID prefix before calling a provider-specific identifier
- Enforce the canonical 'openstack://<id>' format wherever providerIDs are written
- Audit Node objects for foreign-scheme providerIDs in mixed clusters
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
- providerID was not set for node %s
- providerID was not set for node %s
- providerID %q not recognized for node %s
- invalid instance id %q: %w
- unable to find region
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/adfcf15e82f8f3cc.
Report an issue: GitHub.