kubernetes/kops · error

linode subnet requires a region

Error message

linode subnet %q requires a region

What it means

Linode NetworkModelBuilder.Build() requires each cluster subnet to specify a Region, since Linode subnets/VPCs are region-scoped and instances are placed by region. An empty subnet.Region fails validation with this error, reported under the subnet's display name.

Solutions

  1. Set region on each subnet in cluster.spec.networking.subnets to a valid Linode region (e.g. us-east).
  2. Confirm the YAML key is region, not zone or location.
  3. Ensure all subnets use the same region — the builder enforces a single region per Linode cluster.
  4. Re-run kops update cluster after fixing.

Example fix

// before
- name: us-east-1a
  cidr: 10.0.0.0/24
// after
- name: us-east-1a
  region: us-east
  cidr: 10.0.0.0/24
Defensive patterns

Strategy: validation

Validate before calling

for i, s := range cluster.Spec.Networking.Subnets {
    if s.Region == "" {
        return fmt.Errorf("subnet %q missing region", s.Name)
    }
}
// also confirm all regions are identical
seen := map[string]bool{}
for _, s := range cluster.Spec.Networking.Subnets {
    seen[s.Region] = true
}
if len(seen) > 1 {
    return errors.New("all Linode subnets must be in the same region")
}

Prevention

When it happens

Trigger: A cluster.spec.networking.subnets entry for a Linode cluster with name and CIDR set but region empty or misspelled key (e.g. zones instead of region).

Common situations: Porting an AWS cluster spec where region is cluster-level rather than per-subnet; typos in YAML keys; template variables that failed to substitute the region value.

Related errors


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

Appendix: source

Thrown at pkg/model/linodemodel/network.go:52

func (b *NetworkModelBuilder) Build(c *fi.CloudupModelBuilderContext) error {
	if len(b.Cluster.Spec.Networking.Subnets) == 0 {
		return fmt.Errorf("linode VPC requires at least one subnet")
	}

	seenSubnetNames := map[string]string{}
	region := ""
	for i, subnet := range b.Cluster.Spec.Networking.Subnets {
		subnetName := subnet.Name
		if subnetName == "" {
			subnetName = fmt.Sprintf("subnet %d", i)
		}

		if subnet.Name == "" {
			return fmt.Errorf("linode subnet %q requires a name", subnetName)
		}
		if subnet.Region == "" {
			return fmt.Errorf("linode subnet %q requires a region", subnetName)
		}
		if subnet.CIDR == "" {
			return fmt.Errorf("linode subnet %q requires a CIDR", subnetName)
		}

		normalizedSubnetName := linode.NormalizeLinodeLabel(b.ClusterName() + "-" + subnet.Name)
		if previousSubnetName, found := seenSubnetNames[normalizedSubnetName]; found {
			return fmt.Errorf("linode subnets %q and %q normalize to the same label %q", previousSubnetName, subnetName, normalizedSubnetName)
		}
		seenSubnetNames[normalizedSubnetName] = subnetName

		if region == "" {
			region = subnet.Region
			continue
		}
		if subnet.Region != region {
			return fmt.Errorf("linode subnets must all use the same region; found %q and %q", region, subnet.Region)
		}

View on GitHub (pinned to 4c8573c808)