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 namesView on GitHub (pinned to 4c8573c808)
Solutions
- Check the catalog: `openstack endpoint list --service volumev3 --region <region>`; ensure a matching endpoint exists
- Fix OS_REGION_NAME so it exactly matches a region that has a volumev3 endpoint
- If the cloud only offers v2, register a volumev3 endpoint or upgrade Cinder; kops requires BlockStorageV3
- 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
- Verify `openstack endpoint list --service volumev3` before provisioning
- Match OS_REGION_NAME exactly (case-sensitive) to a region with Cinder v3
- Upgrade clouds that only expose volumev2, since kops requires v3
- Check endpoint interface (public/internal) reachability from the client network
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
- error building neutron client: %w
- error building nova client: %w
- error building glance client: %w
- failed to extract storage availability zones: %v
- Volume.RenderOpenstack: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/6777f8d1913b568e.
Report an issue: GitHub.