{"record":{"id":"59698f24e1d84e99","repo":"kubernetes/kops","slug":"no-zones-found-in-instance-groups-in-cluster-q","errorCode":null,"errorMessage":"no zones found in instance groups in cluster %q","messagePattern":"no zones found in instance groups in cluster %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/commands/toolbox/clusterapi/generate_machinedeployment.go","lineNumber":167,"sourceCode":"\tif len(zones) == 0 || instanceType == \"\" || image == \"\" {\n\t\tinstanceGroups, err := clientset.InstanceGroupsFor(cluster).List(ctx, metav1.ListOptions{})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif len(instanceGroups.Items) == 0 {\n\t\t\treturn fmt.Errorf(\"no instance groups found in cluster %q\", options.ClusterName)\n\t\t}\n\n\t\tif len(zones) == 0 {\n\t\t\tallZones := sets.New[string]()\n\t\t\tfor _, ig := range instanceGroups.Items {\n\t\t\t\tfor _, z := range ig.Spec.Zones {\n\t\t\t\t\tallZones.Insert(z)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif allZones.Len() == 0 {\n\t\t\t\treturn fmt.Errorf(\"no zones found in instance groups in cluster %q\", options.ClusterName)\n\t\t\t}\n\n\t\t\tzones = sets.List(allZones)\n\t\t\tlog.Info(\"selected zones\", \"zones\", zones)\n\t\t}\n\n\t\tif instanceType == \"\" {\n\t\t\tinstanceTypes := sets.New[string]()\n\t\t\tfor _, ig := range instanceGroups.Items {\n\t\t\t\tif ig.Spec.MachineType != \"\" {\n\t\t\t\t\tinstanceTypes.Insert(ig.Spec.MachineType)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif instanceTypes.Len() == 0 {\n\t\t\t\treturn fmt.Errorf(\"no instance types found in instance groups in cluster %q\", options.ClusterName)\n\t\t\t}\n\t\t\tif instanceTypes.Len() > 1 {\n\t\t\t\tklog.Warningf(\"multiple instance types found in instance groups in cluster %q; using an arbitrary instance type\", options.ClusterName)","sourceCodeStart":149,"sourceCodeEnd":185,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/pkg/commands/toolbox/clusterapi/generate_machinedeployment.go#L149-L185","documentation":"After finding instance groups, the command unions ig.Spec.Zones to choose target zones; if all instance groups have empty Zones it returns 'no zones found in instance groups in cluster %q'. The generated MachineDeployment must be placed in at least one zone.","triggerScenarios":"All InstanceGroups in the cluster have empty spec.zones — e.g. hand-written IG manifests without zones, or IGs edited to remove zones, while zones were not otherwise derivable.","commonSituations":"Importing cluster configs without zone fields; editing IGs with a script that drops zones; region-scoped configs intended for a different scheduler.","solutions":["Set zones on each instance group: `kops edit instancegroup nodes` and add spec.zones entries.","Recreate IGs via `kops update cluster` from a cluster spec with valid zones.","Verify with `kops get ig -oyaml` that each group lists at least one zone."],"exampleFix":"// before: instance group spec\nmetadata:\n  name: nodes\nspec: {}\n// after\nmetadata:\n  name: nodes\nspec:\n  machineType: t3.medium\n  zones:\n  - us-east-1a\n  - us-east-1b","handlingStrategy":"validation","validationCode":"zones := sets.New[string]()\nfor _, ig := range igs.Items {\n\tzones.Insert(ig.Spec.Zones...)\n}\nif zones.Len() == 0 {\n\treturn fmt.Errorf(\"all instance groups lack spec.zones; add zones before generating\")\n}","typeGuard":"func igHasZones(ig *api.InstanceGroup) bool { return ig != nil && len(ig.Spec.Zones) > 0 }","tryCatchPattern":"if err := RunGenerateMachineDeployment(ctx, f, out, options); err != nil {\n\tif strings.Contains(err.Error(), \"no zones found in instance groups\") {\n\t\treturn fmt.Errorf(\"set spec.zones on instance groups, then retry: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Require zones in every IG template used by automation.","Diff IG YAML after scripted edits to ensure zones weren't dropped.","Validate IGs (zones present) as a CI preflight for cluster-api workflows."],"tags":["kops","cluster-api","zones","instance-groups"],"backgroundTag":"empty-instance-groups","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"}