kubernetes/kops · error

error building loader: %v

Error message

error building loader: %v

What it means

Run() assembles a Loader with dozens of model builders (kubelet, containerd, networking, etc.) and calls loader.Build() to produce the task map. If any builder errors while generating its tasks (e.g. it fails to render templates, read config, or resolve assets), nodeup wraps it as "error building loader". This is a model/task-generation failure, not a runtime task-execution failure.

Source

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

	loader.Builders = append(loader.Builders, &model.WarmPoolBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &model.PrefixBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &model.NerdctlBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &model.CrictlBuilder{NodeupModelContext: modelContext})
	// Cloud-specific configuration
	loader.Builders = append(loader.Builders, &model.AzureBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &model.LinodeBuilder{NodeupModelContext: modelContext})

	loader.Builders = append(loader.Builders, &networking.CommonBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &networking.CalicoBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &networking.CiliumBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &networking.KindnetBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &networking.AmazonVPCRoutedENIBuilder{NodeupModelContext: modelContext})
	loader.Builders = append(loader.Builders, &networking.KuberouterBuilder{NodeupModelContext: modelContext})

	loader.Builders = append(loader.Builders, &model.BootstrapClientBuilder{NodeupModelContext: modelContext})
	taskMap, err := loader.Build()
	if err != nil {
		return fmt.Errorf("error building loader: %v", err)
	}

	for _, image := range nodeupConfig.Images[architecture] {
		if len(image.Sources) == 0 {
			return fmt.Errorf("image has no sources: %v", image)
		}
		u, err := url.Parse(image.Sources[0])
		if err != nil {
			return fmt.Errorf("invalid image source URL %q: %w", image.Sources[0], err)
		}
		key := "SideloadImage/" + path.Base(u.Path)
		if _, ok := taskMap[key]; ok {
			return fmt.Errorf("duplicate image task %q", key)
		}
		taskMap[key] = &nodetasks.LoadImageTask{
			Sources: image.Sources,
			Hash:    image.Hash,
		}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Read the wrapped inner error (the %v suffix) — it names the specific builder or task that failed
  2. Re-run `kops get cluster --full` / `kops replace` to regenerate a consistent nodeup config
  3. Verify the keystore/secretstore VFS paths are readable from the node
  4. Confirm the nodeup binary version matches the kops control-plane version that produced nodeupconfig
Defensive patterns

Strategy: try-catch

Try / catch

if err := nodeupCmd.Run(ctx); err != nil {
    if strings.Contains(err.Error(), "error building loader") {
        log.Fatalf("nodeup model build failed: %v — inspect inner error and regenerate config", err)
    }
    return err
}

Prevention

When it happens

Trigger: loader.Build() returns an error after registering all builders — any Builder.Build() inside returns non-nil (bad NodeupModelContext state, unreadable keystore/secretstore data, invalid networking config, template render failure).

Common situations: Corrupt or missing keystore/secretstore VFS data; a networking option (Cilium/Calico/AmazonVPC) configured inconsistently in the cluster spec; nodeup config referencing assets that cannot be resolved; mismatch between cluster spec and nodeup config after an upgrade.

Related errors


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