kubernetes/kops · error

reading user-data for instance group %q: %w

Error message

reading user-data for instance group %q: %w

What it means

HCloudClusterConfig reads the ServerGroup task's UserData resource into bytes via fi.ResourceAsBytes to embed it in the cluster config. If reading the resource fails (underlying reader error), this error wraps it with the instance group name.

Source

Thrown at upup/pkg/fi/cloudup/template_functions.go:1208

		task, err := tf.Task("ServerGroup", ig.Name)
		if err != nil {
			return "", fmt.Errorf("finding server group task for instance group %q: %w", ig.Name, err)
		}

		serverGroup, ok := task.(*hetznertasks.ServerGroup)
		if !ok {
			return "", fmt.Errorf("server group task for instance group %q has unexpected type %T", ig.Name, task)
		}

		nodeLabels, err := nodelabels.BuildNodeLabels(tf.Cluster, ig)
		if err != nil {
			return "", fmt.Errorf("building node labels for instance group %q: %w", ig.Name, err)
		}

		userDataBytes, err := fi.ResourceAsBytes(serverGroup.UserData)
		if err != nil {
			return "", fmt.Errorf("reading user-data for instance group %q: %w", ig.Name, err)
		}

		var taints []corev1.Taint
		for _, taintSpec := range ig.Spec.Taints {
			parsed, err := util.ParseTaint(taintSpec)
			if err != nil {
				return "", fmt.Errorf("parsing taints for instance group %q: %w", ig.Name, err)
			}
			taints = append(taints, corev1.Taint{
				Key:    parsed["key"],
				Value:  parsed["value"],
				Effect: corev1.TaintEffect(parsed["effect"]),
			})
		}

		// Copy the server labels and add the user-data hash.
		serverLabels := make(map[string]string, len(serverGroup.Labels)+1)
		for key, value := range serverGroup.Labels {

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect the wrapped inner error to find which resource read failed.
  2. Verify nodeup assets/templates exist and are readable in the kOps build.
  3. Regenerate/rebuild tasks with stock Hetzner model templates.

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

// Go: verify the UserData resource is present before reading
if serverGroup.UserData == nil {
    return "", fmt.Errorf("instance group %q: ServerGroup has no UserData", ig.Name)
}

Try / catch

// Go
userDataBytes, err := fi.ResourceAsBytes(serverGroup.UserData)
if err != nil {
    return "", fmt.Errorf("reading user-data for instance group %q: %w", ig.Name, err)
}

Prevention

When it happens

Trigger: fi.ResourceAsBytes(serverGroup.UserData) fails — the UserData resource's underlying reader returns an error, e.g. failed to open/read the nodeup script/template that backs the resource.

Common situations: Missing or unreadable nodeup source file in the model assets; I/O error reading embedded resources; corrupted/incorrectly built task UserData (custom templates wiring a broken resource).

Related errors


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