kubernetes/kops · error

no decernable storage availability zone could be mapped to c

Error message

no decernable storage availability zone could be mapped to compute availability zone %s

What it means

getStorageAZFromCompute (upup/pkg/fi/cloudup/openstack/availability_zone.go:75) tries to match a compute AZ name to a storage AZ of the same name; failing that, it falls back to the single storage AZ if exactly one exists. If the compute AZ name matches no Cinder AZ and the AZ list is empty or has more than one entry, it returns this error because the mapping is ambiguous.

Source

Thrown at upup/pkg/fi/cloudup/openstack/availability_zone.go:75

}

func getStorageAZFromCompute(c OpenstackCloud, computeAZ string) (*az.AvailabilityZone, error) {
	// TODO: This is less than desirable, but openstack differs here
	// Check to see if the availability zone exists.
	azList, err := c.ListAvailabilityZones(c.BlockStorageClient())
	if err != nil {
		return nil, fmt.Errorf("Volume.RenderOpenstack: %v", err)
	}
	for _, az := range azList {
		if az.ZoneName == computeAZ {
			return &az, nil
		}
	}
	// Determine if there is a meaningful storage AZ here
	if len(azList) == 1 {
		return &azList[0], nil
	}
	return nil, fmt.Errorf("no decernable storage availability zone could be mapped to compute availability zone %s", computeAZ)
}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Align Cinder availability zone names with Nova zone names (configure the storage backend's AZ to match), so the exact-match branch succeeds
  2. Ensure only one storage AZ exists if you rely on the single-AZ fallback
  3. Use matching zone names in the kops cluster spec and the OpenStack deployment; remove stale zones from Cinder
  4. Patch/redeploy with a deployment where compute and storage AZs are explicitly mapped
Defensive patterns

Strategy: validation

Validate before calling

computeAZs := novaClientZones() // e.g. from az.List(compute)
storageAZs, err := c.ListAvailabilityZones(c.BlockStorageClient())
if err != nil {
    return err
}
names := map[string]bool{}
for _, z := range storageAZs {
    names[z.ZoneName] = true
}
if len(names) != 1 && !names[computeAZ] {
    return fmt.Errorf("storage AZ for compute AZ %q unresolvable; storage AZs: %v", computeAZ, names)
}
return nil

Prevention

When it happens

Trigger: GetStorageAZFromCompute called with a computeAZ string that (a) matches no ZoneName in the Cinder AZ list and (b) the list length != 1 — e.g. compute AZ 'zone-b' exists only in Nova, while Cinder exposes 'zone-b-storage' and 'zone-c', or the list is empty.

Common situations: Clouds where Nova and Cinder AZ names diverge (common with Ceph backends that use their own AZ naming); multi-AZ deployments with several storage zones; a zone deleted from Cinder but still present in Nova; typo in the cluster spec's zone name.

Related errors


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