kubernetes/kops · error
unknown providerID : %s
Error message
unknown providerID : %s
What it means
getVMTags expects a providerID with the 'azure://' scheme (e.g. azure:///subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Compute/virtualMachines/<vm>). If the providerID lacks this prefix it cannot be an Azure resource ID, so the error 'unknown providerID' is thrown before parsing.
Source
Thrown at pkg/nodeidentity/azure/client.go:72
vmClient, err := compute.NewVirtualMachinesClient(metadata.SubscriptionID, cred, nil)
if err != nil {
return nil, fmt.Errorf("creating VMs client: %w", err)
}
vmssClient, err := compute.NewVirtualMachineScaleSetVMsClient(metadata.SubscriptionID, cred, nil)
if err != nil {
return nil, fmt.Errorf("creating VMSS VMs client: %w", err)
}
return &client{
vmClient: vmClient,
vmssClient: vmssClient,
}, nil
}
func (c *client) getVMTags(ctx context.Context, providerID string) (map[string]*string, error) {
if !strings.HasPrefix(providerID, "azure://") {
return nil, fmt.Errorf("unknown providerID : %s", providerID)
}
res, err := arm.ParseResourceID(strings.TrimPrefix(providerID, "azure://"))
if err != nil {
return nil, fmt.Errorf("error parsing providerID: %v", err)
}
switch res.ResourceType.String() {
case "Microsoft.Compute/virtualMachines":
resp, err := c.vmClient.Get(ctx, res.ResourceGroupName, res.Name, nil)
if err != nil {
return nil, fmt.Errorf("getting VM: %w", err)
}
return resp.VirtualMachine.Tags, nil
case "Microsoft.Compute/virtualMachineScaleSets/virtualMachines":
resp, err := c.vmssClient.Get(ctx, res.ResourceGroupName, res.Parent.Name, res.Name, nil)
if err != nil {
return nil, fmt.Errorf("getting VMSS VM: %w", err)View on GitHub (pinned to 4c8573c808)
Solutions
- Verify node.Spec.ProviderID starts with 'azure://' — inspect with kubectl get node <name> -o jsonpath='{.spec.providerID}'
- Ensure the Azure cloud controller manager is running and labeling nodes with proper providerIDs
- Delete/replace the mislabeled node object so the cloud provider recreates it with a valid providerID
- If you control the caller, replicate the same strings.HasPrefix(providerID, "azure://") guard that IdentifyNode performs before calling getVMTags
Example fix
// before (caller passes providerID unchecked)
tags, err := c.getVMTags(ctx, node.Spec.ProviderID)
// after (guard with same prefix check as IdentifyNode)
pid := node.Spec.ProviderID
if !strings.HasPrefix(pid, "azure://") {
return nil, fmt.Errorf("providerID %q not recognized for node %q", pid, node.Name)
}
tags, err := c.getVMTags(ctx, pid) Defensive patterns
Strategy: validation
Validate before calling
func isValidAzureProviderID(pid string) bool {
return strings.HasPrefix(pid, "azure://")
} Type guard
func isAzureProviderID(pid string) bool {
return strings.HasPrefix(pid, "azure://")
} Try / catch
tags, err := getVMTags(ctx, pid)
if err != nil && strings.HasPrefix(err.Error(), "unknown providerID") {
// providerID is not azure; route to the correct cloud's identifier
} Prevention
- Check node.Spec.ProviderID scheme before calling Azure-specific code
- Ensure the Azure cloud controller manager sets providerIDs
- Watch for manually edited node specs with wrong schemes
When it happens
Trigger: getVMTags (via IdentifyNode) is called with node.Spec.ProviderID that does not start with 'azure://' — e.g. an empty-looking, GCE-style ('gce://'), AWS-style ('aws://'), or otherwise malformed providerID slipped through the caller's prefix check.
Common situations: Node object was not created by the Azure cloud provider (imported/foreign cluster state); cloud-controller-manager failed to set providerID; providerID set manually with wrong scheme; mixed-provider clusters.
Related errors
- providerID not set for node %q
- --azure-subscription-id is required
- invalid Azure Blob location; expected azureblob://<account>/
- error parsing providerID: %v
- unsupported resource type %q for %q
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/c55ab098b1f0e03b.
Report an issue: GitHub.