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
- Inspect the wrapped inner error to find which resource read failed.
- Verify nodeup assets/templates exist and are readable in the kOps build.
- 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
- Ensure nodeup assets are embedded/built correctly
- Check file permissions of backing nodeup resources
- Use stock model templates to construct UserData
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
- reading actual user-data: %w
- reading expected user-data: %w
- error writing to output: %v
- reading existing keyset: %v
- reading Cilium IPSec config from stdin: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/7f4f0a7eaf7888f7.
Report an issue: GitHub.