{"record":{"id":"9e02e88a3101d560","repo":"kubernetes/kops","slug":"configbase-or-configserver-is-required","errorCode":null,"errorMessage":"ConfigBase or ConfigServer is required","messagePattern":"ConfigBase or ConfigServer is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"upup/pkg/fi/nodeup/command.go","lineNumber":130,"sourceCode":"\tvar configBase vfs.Path\n\n\t// If we're using a config server instead of vfs, nodeConfig will hold our configuration\n\tvar nodeConfig *nodeup.NodeConfig\n\n\tif bootConfig.ConfigServer != nil && len(bootConfig.ConfigServer.Servers) > 0 {\n\t\tresponse, err := getNodeConfigFromServers(ctx, &bootConfig, region)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"failed to get node config from server: %w\", err)\n\t\t}\n\t\tnodeConfig = response.NodeConfig\n\t} else if fi.ValueOf(bootConfig.ConfigBase) != \"\" {\n\t\tvar err error\n\t\tconfigBase, err = vfs.Context.BuildVfsPath(*bootConfig.ConfigBase)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"cannot parse ConfigBase %q: %v\", *bootConfig.ConfigBase, err)\n\t\t}\n\t} else {\n\t\treturn fmt.Errorf(\"ConfigBase or ConfigServer is required\")\n\t}\n\n\tvar nodeupConfig nodeup.Config\n\tvar nodeupConfigHash [32]byte\n\tswitch {\n\tcase nodeConfig != nil:\n\t\tif err := utils.YamlUnmarshal([]byte(nodeConfig.NodeupConfig), &nodeupConfig); err != nil {\n\t\t\treturn fmt.Errorf(\"error parsing BootConfig config response: %v\", err)\n\t\t}\n\t\tnodeupConfigHash = sha256.Sum256([]byte(nodeConfig.NodeupConfig))\n\t\tif nodeupConfig.CAs == nil {\n\t\t\tnodeupConfig.CAs = make(map[string]string)\n\t\t}\n\t\tnodeupConfig.CAs[fi.CertificateIDCA] = bootConfig.ConfigServer.CACertificates\n\tcase bootConfig.InstanceGroupName != \"\":\n\t\tnodeupConfigLocation := configBase.Join(\"igconfig\", bootConfig.InstanceGroupRole.ToLowerString(), bootConfig.InstanceGroupName, \"nodeupconfig.yaml\")\n\n\t\tb, err := nodeupConfigLocation.ReadFile(ctx)","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/nodeup/command.go#L112-L148","documentation":"Run() requires exactly one source of node configuration: either ConfigServer (with at least one server) or ConfigBase. If neither is set (or ConfigServer exists but has an empty Servers list), the node has no way to locate its configuration and nodeup aborts immediately.","triggerScenarios":"NodeUp invoked with a BootConfig where ConfigBase == \"\" and ConfigServer == nil (or ConfigServer.Servers is empty) — the else branch of the config-source selection in Run().","commonSituations":"Hand-running nodeup on a node with an incomplete -conf-store/--config arguments set, a cloud-init/ignition template missing the ConfigBase injection, or kops cluster spec missing the config-server feature flag so neither field is populated.","solutions":["Set bootConfig.ConfigBase to the cluster's VFS state path (e.g. s3://bucket/clusters.example.com) when using VFS mode.","Or configure bootConfig.ConfigServer with at least one entry in Servers plus CACertificates when using config-server mode.","Regenerate the node bootstrap/user-data via 'kops update cluster' so the correct fields are injected.","Check the nodeup systemd unit / command-line flags actually pass --config-base or --config-server."],"exampleFix":"// before: nodeup started with neither source\nBootConfig{ClusterName: \"c1\", InstanceGroupName: \"nodes\"}\n// after\nBootConfig{ClusterName: \"c1\", InstanceGroupName: \"nodes\", ConfigBase: fi.PtrTo(\"s3://my-bucket/clusters.example.com\")}","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always generate node bootstrap config via 'kops update cluster'"],"tags":["go","nodeup","configuration","bootstrap"],"backgroundTag":"missing-config-source","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"}