{"record":{"id":"ad368b56de9b0216","repo":"kubernetes/kops","slug":"apiserver-nodes-requires-the-apiservernodes-featur","errorCode":null,"errorMessage":"apiserver nodes requires the APIServerNodes feature flag to be enabled","messagePattern":"apiserver nodes requires the APIServerNodes feature flag to be enabled","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/new_cluster.go","lineNumber":541,"sourceCode":"\t\t// TODO: Clean up\n\t\tif g.IsControlPlane() {\n\t\t\tif g.Spec.MachineType == \"\" {\n\t\t\t\tg.Spec.MachineType, err = defaultMachineType(cloud, cluster, ig)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error assigning default machine type for control plane: %v\", err)\n\t\t\t\t}\n\n\t\t\t}\n\t\t} else if g.Spec.Role.HasBastion() {\n\t\t\tif g.Spec.MachineType == \"\" {\n\t\t\t\tg.Spec.MachineType, err = defaultMachineType(cloud, cluster, g)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error assigning default machine type for bastions: %v\", err)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif g.IsAPIServerOnly() && !featureflag.APIServerNodes.Enabled() {\n\t\t\t\treturn nil, fmt.Errorf(\"apiserver nodes requires the APIServerNodes feature flag to be enabled\")\n\t\t\t}\n\t\t\tif !featureflag.ExperimentalRoles.Enabled() {\n\t\t\t\tswitch {\n\t\t\t\tcase g.Spec.Role.HasEtcd():\n\t\t\t\t\treturn nil, fmt.Errorf(\"etcd nodes requires the ExperimentalRoles feature flag to be enabled\")\n\t\t\t\tcase g.Spec.Role.HasScheduler():\n\t\t\t\t\treturn nil, fmt.Errorf(\"scheduler nodes requires the ExperimentalRoles feature flag to be enabled\")\n\t\t\t\tcase g.Spec.Role.HasKubeControllerManager():\n\t\t\t\t\treturn nil, fmt.Errorf(\"kube-controller-manager nodes requires the ExperimentalRoles feature flag to be enabled\")\n\t\t\t\t}\n\t\t\t}\n\t\t\tif g.Spec.MachineType == \"\" {\n\t\t\t\tg.Spec.MachineType, err = defaultMachineType(cloud, cluster, g)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, fmt.Errorf(\"error assigning default machine type for nodes: %v\", err)\n\t\t\t\t}\n\t\t\t}\n","sourceCodeStart":523,"sourceCodeEnd":559,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/new_cluster.go#L523-L559","documentation":"kops refuses to create dedicated API-server-only node groups unless the APIServerNodes feature flag is explicitly enabled. During instance-group validation in NewCluster, an APIServerOnly group encountered without the flag aborts creation.","triggerScenarios":"Adding an instance group with role APIServer or passing `--api-server-nodes` style configs without `export KOPS_FEATURE_FLAGS=APIServerNodes`, then running `kops create cluster`.","commonSituations":"Operators trying the dedicated API server nodes feature; CI pipelines where the feature flag env var is not exported; kops versions where APIServerNodes is not yet default-on.","solutions":["Enable the feature flag: `export KOPS_FEATURE_FLAGS=APIServerNodes` before running the command.","Upgrade kops to a release where dedicated API server nodes are GA (no flag needed).","If not intentionally using API-server-only nodes, set the instance group role to Node/Bastion instead."],"exampleFix":"// before\nkops create cluster --name=example.com   # IG role=APIServer, flag unset\n// after\nexport KOPS_FEATURE_FLAGS=APIServerNodes\nkops create cluster --name=example.com","handlingStrategy":"validation","validationCode":"func preflight(role string) error {\n    if role == \"APIServer\" && os.Getenv(\"KOPS_FEATURE_FLAGS\") != \"APIServerNodes\" {\n        return errors.New(\"APIServerNodes feature flag required for apiserver-only IGs\")\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":"_, err := NewCluster(opt, cluster, zoneMap)\nif err != nil {\n    if strings.Contains(err.Error(), \"APIServerNodes feature flag\") {\n        os.Setenv(\"KOPS_FEATURE_FLAGS\", \"APIServerNodes\")\n        // retry once\n    }\n    return err\n}","preventionTips":["Export KOPS_FEATURE_FLAGS in CI before kops commands","Check kops release notes for feature graduation","Use fallback: run the component on control-plane nodes instead"],"tags":["feature-flag","apiserver","instance-group","kops"],"backgroundTag":"feature-flag-not-enabled","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"}