derailed/k9s · error
invalid label selector: %w
Error message
invalid label selector: %w
What it means
After the label selector template renders successfully, the result is parsed with labels.Parse() from apimachinery. Parsing failed, meaning the rendered string is not valid Kubernetes label selector grammar (=, !=, in, notin, exists operators with proper quoting).
Source
Thrown at internal/view/custom_jump.go:64
v = NewBrowser(targetGVR)
if mv.enterFn != nil {
v.GetTable().SetEnterFn(mv.enterFn)
}
}
} else {
v = NewScaleExtender(NewOwnerExtender(NewBrowser(targetGVR)))
}
// Build label selector if specified
var labelSel labels.Selector
if rule.LabelSelector != "" {
labelStr, labelErr := applyTemplate(rule.LabelSelector, sourceObj)
if labelErr != nil {
return fmt.Errorf("failed to process label selector template: %w", labelErr)
}
labelSel, labelErr = labels.Parse(labelStr)
if labelErr != nil {
return fmt.Errorf("invalid label selector: %w", labelErr)
}
}
// Set label selector if we have one
if labelSel != nil {
v.SetLabelSelector(labelSel, true)
}
// Build field selector if specified
var fieldSel string
if rule.FieldSelector != "" {
var fieldErr error
fieldSel, fieldErr = applyTemplate(rule.FieldSelector, sourceObj)
if fieldErr != nil {
return fmt.Errorf("failed to process field selector template: %w", fieldErr)
}
}
View on GitHub (pinned to 2d3ccc6ba2)
Solutions
- Dry-run the exact rendered string: kubectl get pods -l '<rendered selector>'
- Fix the grammar: single key=value pairs joined by commas, set-based operators (in/notin) with parenthesized value lists
- If the template can render empty, guard it — an empty labelSelector entry should stay empty (which is skipped) rather than emit stray text
Example fix
// before
labelSelector: "{{ .metadata.labels.app }}" // renders to bare value 'myapp' — invalid
// after
labelSelector: "app={{ .metadata.labels.app }}" // renders to 'app=myapp' — valid Defensive patterns
Strategy: validation
Validate before calling
// validate selector grammar the same way k9s will, before shipping the rule
sel, err := labels.Parse(renderedSelector)
if err != nil {
return fmt.Errorf("selector %q is not valid k8s label-selector syntax: %w", renderedSelector, err)
}
_ = sel Prevention
- Test every selector with kubectl get pods -l '<selector>' before putting it in k9s config
- Never let a template render to an empty or bare value; templates belong on the value side of key=value
- Remember field-selector syntax (metadata.name=x) is invalid in labelSelector — use the fieldSelector key for that
When it happens
Trigger: A template that expands to an empty string, injects whitespace/quotes in the wrong place, or produces something like 'app=foo bar' or 'app in (a,b' — e.g. a label value containing characters that break the key=value pair.
Common situations: Label values with spaces or '=' inside; field-selector syntax (metadata.name=x) mistakenly put under labelSelector; template rendering to empty because the referenced label exists but is empty.
Related errors
- failed to process label selector template: %w
- k9s config file %q load failed: %w
- duplicate input name %q
- default value %q for input %q is not a valid option
- default value %q for bool input %q must be "true" or "false"
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/c4cd0ef13a349d2d.
Report an issue: GitHub.