derailed/k9s · error
dialLogs - no connection to dial
Error message
dialLogs - no connection to dial
What it means
Returned by APIClient.DialLogs (internal/client/client.go:441) when getConnOK() is false. DialLogs lazily builds a dedicated clientset for log streaming (it zeroes cfg.Timeout so streaming is never cut off), but only after the connection health flag is verified. The guard mirrors Dial(): a failed connectivity check poisons every dial path until reconnection.
Source
Thrown at internal/client/client.go:441
func (a *APIClient) setClient(k kubernetes.Interface) {
a.mx.Lock()
defer a.mx.Unlock()
a.client = k
}
func (a *APIClient) getClient() kubernetes.Interface {
a.mx.RLock()
defer a.mx.RUnlock()
return a.client
}
// DialLogs returns a handle to api server for logs.
func (a *APIClient) DialLogs() (kubernetes.Interface, error) {
if !a.getConnOK() {
return nil, errors.New("dialLogs - no connection to dial")
}
if clt := a.getLogClient(); clt != nil {
return clt, nil
}
cfg, err := a.RestConfig()
if err != nil {
return nil, err
}
cfg.Timeout = 0
c, err := kubernetes.NewForConfig(cfg)
if err != nil {
return nil, err
}
a.setLogClient(c)
return a.getLogClient(), nil
}View on GitHub (pinned to 2d3ccc6ba2)
Solutions
- Call CheckConnectivity() and reconnect until it returns true, then retry DialLogs
- Fix the underlying connectivity (VPN, kubeconfig server URL, exec-credential expiry) and re-run the connection check
- Ensure the code does not cache a failed APIClient across context switches — recreate it after switching clusters
Example fix
// before
conn, err := apiClient.DialLogs()
// after
if apiClient.CheckConnectivity() {
conn, err := apiClient.DialLogs()
}
// otherwise report 'no API server connection' to the user and stop Defensive patterns
Strategy: validation
Validate before calling
if !apiClient.CheckConnectivity() {
return nil, errors.New("logs unavailable: api server down")
}
conn, err := apiClient.DialLogs() Try / catch
conn, err := apiClient.DialLogs()
if err != nil {
if strings.Contains(err.Error(), "no connection to dial") {
ui.NotifyError("Connection lost — reconnecting")
if apiClient.CheckConnectivity() {
conn, err = apiClient.DialLogs() // one retry after reconnect
}
}
} Prevention
- Check connectivity before opening log views
- Cache DialLogs' client is already done by the APIClient — avoid caching nil results yourself
- Handle laptop sleep/VPN changes by re-validating the connection when the UI regains focus
When it happens
Trigger: Invoking DialLogs() after CheckConnectivity() marked the connection down (ServerVersion probe failure, RESTConfig error, panic in the check), or before any successful connection was established in this process.
Common situations: Viewing pod logs right after the laptop wakes from sleep and the API server is temporarily unreachable; API server restart; proxy/load-balancer dropped the session; using a client that was constructed but never connected.
Related errors
- ACCESS -- No API server connection
- no connection to dial
- no connection to cached dial
- expecting a context factory
- expecting a job resource
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/a6118ac8846d04b1.
Report an issue: GitHub.