kubernetes/kops · error

error querying Azure instance metadata: %v

Error message

error querying Azure instance metadata: %v

What it means

For Azure clusters, Build queries Azure instance metadata via azuremetadata.QueryComputeInstanceMetadata to build the providerID. Network or payload failures from the Azure IMDS are wrapped with this message.

Source

Thrown at nodeup/pkg/model/kubelet.go:132

	{
		// Set the provider ID to help speed node registration on large clusters
		var providerID string
		if b.CloudProvider() == kops.CloudProviderAWS {
			config, err := awsconfig.LoadDefaultConfig(ctx)
			if err != nil {
				return fmt.Errorf("error loading AWS config: %v", err)
			}
			metadata := imds.NewFromConfig(config)
			instanceIdentity, err := metadata.GetInstanceIdentityDocument(ctx, &imds.GetInstanceIdentityDocumentInput{})
			if err != nil {
				return err
			}
			providerID = fmt.Sprintf("aws:///%s/%s", instanceIdentity.AvailabilityZone, instanceIdentity.InstanceID)
		} else if b.CloudProvider() == kops.CloudProviderAzure {
			metadata, err := azuremetadata.QueryComputeInstanceMetadata(ctx)
			if err != nil {
				return fmt.Errorf("error querying Azure instance metadata: %v", err)
			}
			providerID = "azure://" + metadata.ResourceID
		} else if b.CloudProvider() == kops.CloudProviderDO {
			// The DO CCM resolves nodes by provider ID; its name-based fallback does not match
			// our IP-based node names.
			dropletID, err := dometadata.GetDropletID()
			if err != nil {
				return fmt.Errorf("error querying DigitalOcean droplet ID: %w", err)
			}
			providerID = "digitalocean://" + dropletID
		}

		t, err := b.buildKubeletComponentConfig(kubeletConfig, providerID)
		if err != nil {
			return err
		}

		c.AddTask(t)

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Verify the VM can reach 169.254.169.254 (no NSG/firewall blocking IMDS).
  2. Retry nodeup; Azure IMDS can be transiently throttled or unavailable.
  3. Check that the VM agent / Azure provider components are healthy on the node.
  4. Inspect the wrapped inner error for HTTP status or parse details.
Defensive patterns

Strategy: retry

Validate before calling

// before nodeup: probe Azure IMDS
resp, err := http.Get("http://169.254.169.254/metadata/instance?api-version=2021-02-01")
if err != nil || resp.StatusCode != 200 {
    return errors.New("azure IMDS not reachable")
}

Try / catch

if err := runNodeup(ctx); err != nil {
    if strings.Contains(err.Error(), "error querying Azure instance metadata") {
        // wait and retry; IMDS can throttle transiently
        time.Sleep(30 * time.Second)
        return runNodeup(ctx)
    }
    return err
}

Prevention

When it happens

Trigger: QueryComputeInstanceMetadata fails — the Azure Instance Metadata Service is unreachable, returns non-200, or returns an unparseable document.

Common situations: IMDS blocked by NSG/firewall rules, VM without metadata access, transient IMDS throttling/unavailability during node bootstrap.

Related errors


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