kubernetes/kops · error

unable to determine gcp region for cluster

Error message

unable to determine gcp region for cluster

What it means

applyGCPCluster could not derive a region for the GCPCluster object: after iterating the cluster's subnets, no usable region was found (subnet regions empty or the loop produced nothing) — the sibling checks for missing project and conflicting multiple regions are separate errors.

Source

Thrown at pkg/controllers/clusterapi/cluster_controller.go:128

func (s *clusterScope) applyGCPCluster(ctx context.Context, kube client.Client) error {
	// This is because of network tags in cloud-provider-gcp
	// TODO: cloud-provider-gcp should not assume cluster name is a valid prefix
	name := gce.SafeClusterName(s.Cluster.GetName())

	gcpProject := s.Cluster.Spec.Project
	if gcpProject == "" {
		return fmt.Errorf("unable to determine gcp project for cluster")
	}
	gcpRegion := ""
	for _, subnet := range s.Cluster.Spec.Subnets {
		if gcpRegion == "" {
			gcpRegion = subnet.Region
		} else if gcpRegion != subnet.Region {
			return fmt.Errorf("found multiple gcp regions for cluster")
		}
	}
	if gcpRegion == "" {
		return fmt.Errorf("unable to determine gcp region for cluster")
	}

	// TODO: Sync with LinkToNetwork
	gcpNetworkName := s.Cluster.Spec.NetworkID
	if gcpNetworkName == "" {
		gcpNetworkName = gce.SafeTruncatedClusterName(s.Cluster.ObjectMeta.Name, 63)
	}
	if gcpNetworkName == "" {
		return fmt.Errorf("unable to determine gcp network for cluster")
	}

	obj := map[string]any{
		"apiVersion": "infrastructure.cluster.x-k8s.io/v1beta1",
		"kind":       "GCPCluster",
		"metadata": map[string]any{
			"name":      name,
			"namespace": s.namespace(),
		},

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Set region on every subnet in spec.subnets
  2. Ensure at least one subnet exists in the cluster spec
  3. Re-run reconciliation after applying the corrected manifest

Example fix

// before
subnets:
- name: us-west1
  type: Private
// after
subnets:
- name: us-west1
  type: Private
  region: us-west1
Defensive patterns

Strategy: validation

Validate before calling

if len(cluster.Spec.Subnets) == 0 {
	return fmt.Errorf("cluster %s: at least one subnet with region required", cluster.Name)
}
for _, s := range cluster.Spec.Subnets {
	if s.Region == "" { return fmt.Errorf("subnet %s missing region", s.Name) }
}

Prevention

When it happens

Trigger: clusterScope.Apply() on a GCP cluster where the subnets loop ends with gcpRegion still empty (no subnets, or none with region populated).

Common situations: Cluster manifests generated without subnet region fields; subnets defined with only names/CIDRs; utility or topology subnets (e.g. only a bastion subnet) left without region.

Related errors


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