{"record":{"id":"e7ac7f2ace363fcb","repo":"kubernetes/kops","slug":"cluster-cannot-span-multiple-regions-found-zone","errorCode":null,"errorMessage":"cluster cannot span multiple regions (found zone %q, but region is %q)","messagePattern":"cluster cannot span multiple regions \\(found zone %q, but region is %q\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/hetzner/utils.go","lineNumber":43,"sourceCode":"// FindRegion determines the region from the zones specified in the cluster\nfunc FindRegion(cluster *kops.Cluster) (string, error) {\n\tvar region string\n\n\tfor _, subnet := range cluster.Spec.Networking.Subnets {\n\t\tvar zoneRegion string\n\t\tswitch subnet.Zone {\n\t\tcase \"fsn1\", \"nbg1\", \"hel1\":\n\t\t\tzoneRegion = \"eu-central\"\n\t\tcase \"ash\":\n\t\t\tzoneRegion = \"us-east\"\n\t\tcase \"hil\":\n\t\t\tzoneRegion = \"us-west\"\n\t\tdefault:\n\t\t\treturn \"\", fmt.Errorf(\"unknown zone %q for hetzner cloud, known zones are fsn1, nbg1, hel1, ash, hil\", subnet.Zone)\n\t\t}\n\n\t\tif region != \"\" && zoneRegion != region {\n\t\t\treturn \"\", fmt.Errorf(\"cluster cannot span multiple regions (found zone %q, but region is %q)\", subnet.Zone, region)\n\t\t}\n\n\t\tregion = zoneRegion\n\t}\n\n\treturn region, nil\n}\n","sourceCodeStart":25,"sourceCodeEnd":51,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/hetzner/utils.go#L25-L51","documentation":"FindRegion ensures all cluster subnets lie within a single Hetzner region (kOps Hetzner clusters cannot span regions). If a subnet's zone maps to a different region than previously seen, it aborts with this error naming the offending zone and the already-established region.","triggerScenarios":"Cluster defines subnets in zones from multiple regions, e.g. fsn1 (eu-central) plus ash (us-east), or hel1 with nbg1.","commonSituations":"Adding a subnet in a new geographic zone for HA without realizing cross-region isn't supported; copy-pasting a multi-region cluster spec from AWS/GCP.","solutions":["Make all subnets use zones in the same region (fsn1/nbg1 are both eu-central; ash/hil are both us-east... check: ash=us-east, hil=us-west so pick one).","Remove or re-zone the offending subnet via `kops edit cluster`, then `kops update cluster`.","If multi-region is truly required, create separate clusters per region."],"exampleFix":"// before\nzones: [fsn1, ash]\n// after\nzones: [fsn1, nbg1]","handlingStrategy":"validation","validationCode":"zoneRegion := map[string]string{\"fsn1\":\"eu-central\",\"nbg1\":\"eu-central\",\"hel1\":\"eu-central\",\"ash\":\"us-east\",\"hil\":\"us-west\"}\nregions := map[string]bool{}\nfor _, s := range subnets { regions[zoneRegion[s.Zone]] = true }\nif len(regions) > 1 { return fmt.Errorf(\"subnets span multiple regions: %v\", regions) }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep all cluster zones within one Hetzner region (fsn1/nbg1/hel1 or ash or hil).","Plan multi-region availability as separate clusters.","Check zone-to-region mapping before adding subnets."],"tags":["hetzner","zone","multi-region"],"backgroundTag":"cluster-spans-multiple-regions","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}