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
- Read the wrapped %v error to identify the API cause
- Grant compute.viewer (includes compute.disks.get) to the kops service account
- Verify Compute Engine API is enabled for the project
- 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
- Enable the Compute Engine API and verify IAM (compute.viewer) before kops runs
- Retry transient 429/5xx with exponential backoff
- Check status.cloud.google.com for Compute Engine incidents before large refreshes
- Reproduce with the equivalent gcloud command to isolate credentials vs code
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
- error fetching GCE instance: %w
- error fetching GCE instance group template %q: %v
- error fetching GCE managed instance group %q: %v
- error getting ForwardingRule %q: %w
- error getting TargetPool %q: %w
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/801cf45c0e1c9f82.
Report an issue: GitHub.