kubernetes/kops · error

error querying for disk %q: %v

Error message

error querying for disk %q: %v

What it means

In Instance.Find, when Disks().Get on the boot disk fails with an error that is NOT NotFound (as opposed to the 'disk not found' branch), kOps wraps it as 'error querying for disk'. This represents an API-level failure querying the disk rather than its absence.

Source

Thrown at upup/pkg/fi/cloudup/gcetasks/instance.go:123

	for _, serviceAccount := range r.ServiceAccounts {
		for _, scope := range serviceAccount.Scopes {
			actual.Scopes = append(actual.Scopes, scopeToShortForm(scope))
		}
	}

	actual.Disks = make(map[string]*Disk)
	for i, disk := range r.Disks {
		if i == 0 {
			source := disk.Source

			// TODO: Parse source URL instead of assuming same project/zone?
			name := lastComponent(source)
			d, err := cloud.Compute().Disks().Get(cloud.Project(), *e.Zone, name)
			if err != nil {
				if gce.IsNotFound(err) {
					return nil, fmt.Errorf("disk not found %q: %v", source, err)
				}
				return nil, fmt.Errorf("error querying for disk %q: %v", source, err)
			}

			image, err := ShortenImageURL(cloud.Project(), d.SourceImage)
			if err != nil {
				return nil, fmt.Errorf("error parsing source image URL: %v", err)
			}
			actual.Image = new(image)
		} else {
			url, err := gce.ParseGoogleCloudURL(disk.Source)
			if err != nil {
				return nil, fmt.Errorf("unable to parse disk source URL: %q", disk.Source)
			}

			actual.Disks[disk.DeviceName] = &Disk{Name: &url.Name}
		}
	}

	if r.Metadata != nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped %v error to identify the API cause
  2. Grant compute.viewer (includes compute.disks.get) to the kops service account
  3. Verify Compute Engine API is enabled for the project
  4. Retry on transient 429/5xx errors
Defensive patterns

Strategy: retry

Validate before calling

// Confirm API access and IAM before deep refresh
_, err := cloud.Compute().Disks().List(cloud.Project(), *e.Zone).PageSize(1).Do()
if err != nil {
	var ge *googleapi.Error
	if errors.As(err, &ge) && ge.Code == 403 { return fmt.Errorf("grant compute.disks.get to the kops SA") }
	return err
}

Type guard

func isRetryableAPIErr(err error) bool {
	var ge *googleapi.Error
	return errors.As(err, &ge) && (ge.Code == 429 || ge.Code >= 500)
}

Try / catch

d, err := cloud.Compute().Disks().Get(cloud.Project(), *e.Zone, name)
if err != nil {
	if gce.IsNotFound(err) { return nil, fmt.Errorf("disk not found %q: %v", source, err) }
	if isRetryableAPIErr(err) { return nil, retry.WithBackoff(err) }
	return nil, fmt.Errorf("error querying for disk %q: %v", source, err)
}

Prevention

When it happens

Trigger: Disks().Get(project, zone, name) returns a non-NotFound error: IAM permission denied (compute.disks.get), Compute Engine API disabled, invalid zone, rate limiting, or transient network/API failure.

Common situations: kops service account missing compute.disks.get permission, Compute Engine API not fully enabled, regional outage or 429 throttling during `kops update cluster --refresh`/`kops get --deep`.

Related errors


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