kubernetes/kops · critical
ConfigBase or ConfigServer is required
Error message
ConfigBase or ConfigServer is required
What it means
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.
Source
Thrown at upup/pkg/fi/nodeup/command.go:130
var configBase vfs.Path
// If we're using a config server instead of vfs, nodeConfig will hold our configuration
var nodeConfig *nodeup.NodeConfig
if bootConfig.ConfigServer != nil && len(bootConfig.ConfigServer.Servers) > 0 {
response, err := getNodeConfigFromServers(ctx, &bootConfig, region)
if err != nil {
return fmt.Errorf("failed to get node config from server: %w", err)
}
nodeConfig = response.NodeConfig
} else if fi.ValueOf(bootConfig.ConfigBase) != "" {
var err error
configBase, err = vfs.Context.BuildVfsPath(*bootConfig.ConfigBase)
if err != nil {
return fmt.Errorf("cannot parse ConfigBase %q: %v", *bootConfig.ConfigBase, err)
}
} else {
return fmt.Errorf("ConfigBase or ConfigServer is required")
}
var nodeupConfig nodeup.Config
var nodeupConfigHash [32]byte
switch {
case nodeConfig != nil:
if err := utils.YamlUnmarshal([]byte(nodeConfig.NodeupConfig), &nodeupConfig); err != nil {
return fmt.Errorf("error parsing BootConfig config response: %v", err)
}
nodeupConfigHash = sha256.Sum256([]byte(nodeConfig.NodeupConfig))
if nodeupConfig.CAs == nil {
nodeupConfig.CAs = make(map[string]string)
}
nodeupConfig.CAs[fi.CertificateIDCA] = bootConfig.ConfigServer.CACertificates
case bootConfig.InstanceGroupName != "":
nodeupConfigLocation := configBase.Join("igconfig", bootConfig.InstanceGroupRole.ToLowerString(), bootConfig.InstanceGroupName, "nodeupconfig.yaml")
b, err := nodeupConfigLocation.ReadFile(ctx)View on GitHub (pinned to 4c8573c808)
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.
Example fix
// before: nodeup started with neither source
BootConfig{ClusterName: "c1", InstanceGroupName: "nodes"}
// after
BootConfig{ClusterName: "c1", InstanceGroupName: "nodes", ConfigBase: fi.PtrTo("s3://my-bucket/clusters.example.com")} Defensive patterns
Strategy: validation
Prevention
- Always generate node bootstrap config via 'kops update cluster'
When it happens
Trigger: 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().
Common situations: 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.
Related errors
- unsupported cloud provider for authenticator %q
- building nodeConfig for instanceGroup: %w
- parsing path for kops-channels manifest %s: %w
- no keypairID for %q
- cannot parse ConfigBase %q: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/9e02e88a3101d560.
Report an issue: GitHub.