kubernetes/kops · error

error building cinder client: %w

Error message

error building cinder client: %w

What it means

buildClients (upup/pkg/fi/cloudup/openstack/cloud.go:386) constructs the Cinder block-storage v3 service client with openstack.NewBlockStorageV3, using EndpointOpts{Type: "volumev3", Region: region}. Failure here means gophercloud could not resolve a suitable volumev3 endpoint in the authenticated service catalog for that region. This wraps with %w so the underlying gophercloud ErrEndpointNotFound or similar is preserved for errors.Is/As checks.

Source

Thrown at upup/pkg/fi/cloudup/openstack/cloud.go:386

	if cluster != nil {
		hasDNS := cluster.PublishesDNSRecords()
		tags := map[string]string{
			TagClusterName: cluster.Name,
		}
		return buildClients(provider, tags, cluster.Spec.CloudProvider.Openstack, config, region, hasDNS)
	}
	// used when no cluster is available
	return buildClients(provider, nil, nil, config, region, false)
}

func buildClients(provider *gophercloud.ProviderClient, tags map[string]string, spec *kops.OpenstackSpec, config vfs.OpenstackConfig, region string, hasDNS bool) (OpenstackCloud, error) {
	cinderClient, err := openstack.NewBlockStorageV3(provider, gophercloud.EndpointOpts{
		Type:   "volumev3",
		Region: region,
	})
	if err != nil {
		return nil, fmt.Errorf("error building cinder client: %w", err)
	}

	neutronClient, err := openstack.NewNetworkV2(provider, gophercloud.EndpointOpts{
		Type:   "network",
		Region: region,
	})
	if err != nil {
		return nil, fmt.Errorf("error building neutron client: %w", err)
	}

	novaClient, err := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{
		Type:   "compute",
		Region: region,
	})
	if err != nil {
		return nil, fmt.Errorf("error building nova client: %w", err)
	}
	// 2.47 is the minimum version where the compute API /server/details returns flavor names

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Check the catalog: `openstack endpoint list --service volumev3 --region <region>`; ensure a matching endpoint exists
  2. Fix OS_REGION_NAME so it exactly matches a region that has a volumev3 endpoint
  3. If the cloud only offers v2, register a volumev3 endpoint or upgrade Cinder; kops requires BlockStorageV3
  4. Verify the catalog endpoint interface (public/admin/internal) is reachable from the client
Defensive patterns

Strategy: validation

Validate before calling

endpoints, err := catalogEndpoints(token, "volumev3")
if err != nil || len(endpoints) == 0 {
    return fmt.Errorf("no volumev3 endpoint for region %q", region)
}
return nil

Prevention

When it happens

Trigger: The Keystone service catalog has no volumev3 endpoint in the target region; the region passed to EndpointOpts does not match any endpoint's region attribute; Cinder v3 is not deployed (only v2/v1 present); catalog entries have a type other than 'volumev3'.

Common situations: Old OpenStack releases exposing only volumev2; region name case mismatch (OS_REGION_NAME 'regionone' vs catalog 'RegionOne'); broken service catalog after a cloud upgrade; kops pointed at a region with no block storage service.

Related errors


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