kubernetes/kops · error
listing server preferred resources: %w
Error message
listing server preferred resources: %w
What it means
The discovery client's ServerPreferredResources() call is wrapped with "listing server preferred resources: %w", but only when the error is NOT a *discovery.ErrGroupDiscoveryFailed. Partial group-discovery failures are tolerated (logged as a warning) because the dump can proceed with the groups it did discover; total failure (network, auth, no reachable server) returns this error.
Source
Thrown at pkg/dump/resourcedumper.go:118
return fmt.Errorf("creating clientset: %w", err)
}
namespaces, err := clientSet.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
return fmt.Errorf("listing namespaces: %w", err)
}
discoveryClient, err := discovery.NewDiscoveryClientForConfig(d.k8sConfig)
if err != nil {
return fmt.Errorf("creating discovery client: %w", err)
}
resourceLists, err := discoveryClient.ServerPreferredResources()
var discoveryErr *discovery.ErrGroupDiscoveryFailed
if errors.As(err, &discoveryErr) {
klog.Warningf("using incomplete list of API groups: %v", discoveryErr)
} else if err != nil {
return fmt.Errorf("listing server preferred resources: %w", err)
}
gvrNamespaces, err := getGVRNamespaces(resourceLists, namespaces.Items)
if err != nil {
return fmt.Errorf("getting GVR namespaces: %w", err)
}
jobs := make(chan gvrNamespace, len(gvrNamespaces))
results := make(chan resourceDumpResult, len(gvrNamespaces))
for i := 0; i < resourceDumpConcurrency; i++ {
go d.dumpGVRNamespaces(ctx, jobs, results)
}
var dumpErr error
for _, gvrn := range gvrNamespaces {
jobs <- gvrnView on GitHub (pinned to 4c8573c808)
Solutions
- Check API server health (kubectl get --raw /apis) and network path.
- Re-check auth: kubectl auth can-i get --all and ensure the discovery API is permitted.
- Retry the dump; discovery is a single GET pair and transient outages resolve it.
- If ErrGroupDiscoveryFailed is logged instead, address the failing group's aggregated API server (install/fix the CRD or aggregation layer).
Defensive patterns
Strategy: try-catch
Validate before calling
disc, err := discovery.NewDiscoveryClientForConfig(cfg)
if err != nil { return err }
if _, err := disc.ServerVersion(); err != nil {
return fmt.Errorf("discovery endpoint unreachable: %w", err)
} Type guard
func isPartialDiscoveryFailed(err error) bool {
var gdf *discovery.ErrGroupDiscoveryFailed
// partial failure is tolerated by DumpResources; only total failure returns
return errors.As(err, &gdf)
} Try / catch
if err := dumper.DumpResources(ctx); err != nil {
if k8sErrors.IsUnauthorized(err) || k8sErrors.IsForbidden(err) {
// auth problem on discovery endpoints — fix credentials/RBAC
} else if strings.Contains(err.Error(), "listing server preferred resources") {
// total discovery failure: check apiserver health, then retry
}
return err
} Prevention
- Verify `kubectl get --raw /apis` succeeds with the same credentials before dumping.
- Treat klog warnings about incomplete API groups as early signals of aggregated-apiserver problems.
- Keep aggregated API servers and CRDs healthy so discovery doesn't degrade.
- Retry total discovery failures with backoff; they are usually transient.
When it happens
Trigger: The /apis and /api discovery endpoints are entirely unreachable or rejected: connection failure, 401/403, context cancellation, or a server that cannot serve discovery at all. Aggregated-apiserver outages alone produce ErrGroupDiscoveryFailed, which is NOT this error.
Common situations: API server briefly down mid-dump; RBAC identity can list namespaces but cannot hit discovery endpoints; heavily aggregated clusters where a non-ErrGroupDiscoveryFailed error surfaces; TLS intercepting proxies breaking the discovery response.
Related errors
- error querying kubernetes version: %v
- listing namespaces: %w
- unable to find resource for %s: %w
- cannot parse kubernetes version %q
- error building corev1 client: %v
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/cdda121abb01aa1a.
Report an issue: GitHub.