kubernetes/kops · error

error loading NodeupConfig %q: %v

Error message

error loading NodeupConfig %q: %v

What it means

In VFS mode (no config server), Run() loads the instance group's NodeupConfig from <ConfigBase>/igconfig/<role>/<instance-group>/nodeupconfig.yaml. This error is thrown when that file cannot be read from the VFS backend — missing file, wrong path, or storage access failure.

Source

Thrown at upup/pkg/fi/nodeup/command.go:150

	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)
		if err != nil {
			return fmt.Errorf("error loading NodeupConfig %q: %v", nodeupConfigLocation, err)
		}

		if err = utils.YamlUnmarshal(b, &nodeupConfig); err != nil {
			return fmt.Errorf("error parsing NodeupConfig %q: %v", nodeupConfigLocation, err)
		}
		nodeupConfigHash = sha256.Sum256(b)
	default:
		return fmt.Errorf("no instance group defined in nodeup config")
	}

	if bootConfig.NodeupConfigHash != "" {
		if want, got := bootConfig.NodeupConfigHash, base64.StdEncoding.EncodeToString(nodeupConfigHash[:]); got != want {
			return fmt.Errorf("nodeup config hash mismatch (was %q, expected %q)", got, want)
		}
	}

	err = evaluateSpec(&nodeupConfig, bootConfig.CloudProvider, region)
	if err != nil {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Run 'kops update cluster --yes' to ensure igconfig/<role>/<group>/nodeupconfig.yaml exists in the state store.
  2. Verify bootConfig.InstanceGroupName matches an existing instance group ('kops get ig') and the role spelling is correct.
  3. Check the node's IAM role / service account has read access to the state-store bucket and prefix.
  4. Confirm --state-store / ConfigBase points at the same location kops used to publish the config.
  5. If the file was deleted, restore the state store from backup or recreate the cluster configuration.

Example fix

// before: node launched for a deleted instance group
BootConfig{InstanceGroupName: "nodes-old", ...} // igconfig/kubernetes.io/role/node/nodes-old/nodeupconfig.yaml missing
// after
BootConfig{InstanceGroupName: "nodes", ...} // matches existing igconfig
Defensive patterns

Strategy: validation

Prevention

When it happens

Trigger: bootConfig.InstanceGroupName is set and the read of configBase.Join("igconfig", role, name, "nodeupconfig.yaml") fails: the object does not exist in the bucket, the bucket/path is wrong, or cloud-storage credentials/permissions deny the read.

Common situations: Instance group renamed or deleted in cluster spec but node still boots with the old name; state store bucket changed or contents deleted; IAM/SA credentials missing s3:GetObject/gs:objects.get on the state store; booting a node for an instance group whose config was never pushed ('kops update cluster' not run).

Related errors


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