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

  1. Set bootConfig.ConfigBase to the cluster's VFS state path (e.g. s3://bucket/clusters.example.com) when using VFS mode.
  2. Or configure bootConfig.ConfigServer with at least one entry in Servers plus CACertificates when using config-server mode.
  3. Regenerate the node bootstrap/user-data via 'kops update cluster' so the correct fields are injected.
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/9e02e88a3101d560. Report an issue: GitHub.