kubernetes/kops · error

on Akamai (Linode), subnets must include Regions

Error message

on Akamai (Linode), subnets must include Regions

What it means

kops's BuildCloud initializes the cloud provider for a cluster. For the Akamai (Linode) provider, kops derives the Linode region from the first subnet that has a Region set; every subnet declaration is expected to carry a region because Linode has no zone-level abstraction. If no subnet specifies a region, kops cannot construct a Linode cloud client and aborts with this error.

Source

Thrown at upup/pkg/fi/cloudup/utils.go:219

			cloud = scwCloud
		}
	case kops.CloudProviderMetal:
		metalCloud, err := metal.NewCloud()
		if err != nil {
			return nil, fmt.Errorf("error initializing Metal cloud: %w", err)
		}
		cloud = metalCloud

	case kops.CloudProviderLinode:
		for _, subnet := range cluster.Spec.Networking.Subnets {
			if subnet.Region != "" {
				region = subnet.Region
				break
			}
		}
		if region == "" {
			return nil, fmt.Errorf("on Akamai (Linode), subnets must include Regions")
		}

		linodeCloud, err := linode.NewCloud(region)
		if err != nil {
			return nil, fmt.Errorf("error initializing Akamai (Linode) cloud: %w", err)
		}

		cloud = linodeCloud
	default:
		return nil, fmt.Errorf("unknown CloudProvider %q", cluster.GetCloudProvider())
	}
	return cloud, nil
}

func FindDNSHostedZone(dns dnsprovider.Interface, clusterDNSName string, dnsType kops.DNSType) (string, error) {
	klog.V(2).Infof("Querying for all DNS zones to find match for %q", clusterDNSName)

	clusterDNSName = "." + strings.TrimSuffix(clusterDNSName, ".")

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Set `region:` (a Linode region slug such as us-east or eu-west) on at least one — ideally all — subnets in cluster.spec.networking.subnets.
  2. Regenerate the manifest with `kops create cluster --cloud linode --zones us-east ...` so kops fills regions automatically.
  3. Verify the cluster spec: `kops get cluster <name> -o yaml` and confirm each subnet has a non-empty region before re-running.

Example fix

# before
subnets:
- name: main
  cidr: 10.0.1.0/24
# after
subnets:
- name: main
  cidr: 10.0.1.0/24
  region: us-east
Defensive patterns

Strategy: validation

Validate before calling

for _, s := range cluster.Spec.Networking.Subnets {
    if s.Region == "" {
        return fmt.Errorf("subnet %q: Linode requires region", s.Name)
    }
}

Prevention

When it happens

Trigger: Running `kops create cluster`, `kops update cluster`, `kops create ig`, `kops delete cluster`, or `kops delete instance` where cluster.Spec.CloudProvider is linode/akamai and every entry in cluster.spec.networking.subnets has an empty region field (or there are no subnets).

Common situations: Hand-written cluster manifests that omit `region:` on subnets (e.g. copying an AWS example that uses only `zone:` or CIDR fields); tooling that generates subnets without the Linode-specific region key; upgrading older configs where region was optional for another provider.

Related errors


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