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

  1. Verify node.Spec.ProviderID starts with 'azure://' — inspect with kubectl get node <name> -o jsonpath='{.spec.providerID}'
  2. Ensure the Azure cloud controller manager is running and labeling nodes with proper providerIDs
  3. Delete/replace the mislabeled node object so the cloud provider recreates it with a valid providerID
  4. 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

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


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