{"record":{"id":"74dcc4f58b642b77","repo":"kubernetes/kops","slug":"etcdmember-s-s-did-not-specify-a-instancegroup","errorCode":null,"errorMessage":"EtcdMember %s:%s did not specify a InstanceGroup","messagePattern":"EtcdMember (.+?):(.+?) did not specify a InstanceGroup","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/populate_cluster_spec.go","lineNumber":131,"sourceCode":"\t\t//\t\treturn fmt.Errorf(\"Subnets contained a duplicate value: %v\", subnet.Name)\n\t\t//\t}\n\t\t//\tclusterSubnets[subnet.Name] = subnet\n\t\t//}\n\n\t\t// Check etcd configuration\n\t\t{\n\t\t\tfor i, etcd := range cluster.Spec.EtcdClusters {\n\t\t\t\tif etcd.Name == \"\" {\n\t\t\t\t\treturn fmt.Errorf(\"EtcdClusters #%d did not specify a Name\", i)\n\t\t\t\t}\n\n\t\t\t\tfor i, m := range etcd.Members {\n\t\t\t\t\tif m.Name == \"\" {\n\t\t\t\t\t\treturn fmt.Errorf(\"EtcdMember #%d of etcd-cluster %s did not specify a Name\", i, etcd.Name)\n\t\t\t\t\t}\n\n\t\t\t\t\tif fi.ValueOf(m.InstanceGroup) == \"\" {\n\t\t\t\t\t\treturn fmt.Errorf(\"EtcdMember %s:%s did not specify a InstanceGroup\", etcd.Name, m.Name)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tetcdInstanceGroups := make(map[string]kopsapi.EtcdMemberSpec)\n\t\t\t\tetcdNames := make(map[string]kopsapi.EtcdMemberSpec)\n\n\t\t\t\tfor _, m := range etcd.Members {\n\t\t\t\t\tif _, ok := etcdNames[m.Name]; ok {\n\t\t\t\t\t\treturn fmt.Errorf(\"EtcdMembers found with same name %q in etcd-cluster %q\", m.Name, etcd.Name)\n\t\t\t\t\t}\n\n\t\t\t\t\tinstanceGroupName := fi.ValueOf(m.InstanceGroup)\n\n\t\t\t\t\tif _, ok := etcdInstanceGroups[instanceGroupName]; ok {\n\t\t\t\t\t\tklog.Warningf(\"EtcdMembers are in the same InstanceGroup %q in etcd-cluster %q (fault-tolerance may be reduced)\", instanceGroupName, etcd.Name)\n\t\t\t\t\t}\n\n\t\t\t\t\t//if clusterSubnets[zone] == nil {","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/populate_cluster_spec.go#L113-L149","documentation":"Each etcd member must reference an InstanceGroup so kops knows which machines run that etcd member. run() throws this when fi.ValueOf(m.InstanceGroup) is empty for a member in an EtcdClusters entry. Without the instance group binding, the etcd cluster cannot be mapped onto nodes and provisioning aborts.","triggerScenarios":"PopulateClusterSpec encounters an EtcdMemberSpec with a Name but with instanceGroup unset/empty — e.g. a cluster spec where members list names but omit the instanceGroup field.","commonSituations":"Hand-written cluster manifests missing `instanceGroup:` on etcd members; renaming or deleting control-plane instance groups and forgetting to update member references; programmatic spec generation that fills name but not instanceGroup.","solutions":["Set `instanceGroup:` on every etcd member, referencing an existing control-plane instance group (e.g. `control-plane-ap-south-1a`).","Run `kops get ig` to list instance groups and match each etcd member to one control-plane group.","Ensure every etcd member maps to a distinct instance group for fault tolerance (duplicates only produce a warning, but an empty group is fatal)."],"exampleFix":"// before\nmember := kopsapi.EtcdMemberSpec{Name: \"a\"}\n// after\nmember := kopsapi.EtcdMemberSpec{Name: \"a\", InstanceGroup: fi.PtrTo(\"control-plane-ap-south-1a\")}","handlingStrategy":"validation","validationCode":"for _, etcd := range cluster.Spec.EtcdClusters {\n\tfor _, m := range etcd.Members {\n\t\tif fi.ValueOf(m.InstanceGroup) == \"\" {\n\t\t\treturn fmt.Errorf(\"etcd member %q missing instanceGroup\", m.Name)\n\t\t}\n\t}\n}","typeGuard":"func hasInstanceGroup(m kopsapi.EtcdMemberSpec) bool { return fi.ValueOf(m.InstanceGroup) != \"\" }","tryCatchPattern":null,"preventionTips":["Keep one control-plane instance group per etcd member and reference it explicitly","After renaming instance groups, grep the spec for stale member references","Generate members from instance groups programmatically so the link can't be dropped"],"tags":["etcd","cluster-spec","validation"],"backgroundTag":"missing-required-argument","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"}