cilium/cilium · error
No address found
Error message
No address found
What it means
firstGlobalAddr enumerates the node's network interfaces and addresses to find a usable global-scope IP (v4 or v6). This error is returned when, after scanning all interfaces and retrying across scopes, no address satisfies addrUsableAsNodeIP. It is the sentinel meaning "this node has no suitable IP for node addressing".
Source
Thrown at pkg/node/address_linux.go:116
}
// First, if a device is specified, fall back to anything wider
// than link (site, custom, ...) before trying all devices.
if linkScopeMax != unix.RT_SCOPE_SITE {
linkScopeMax = unix.RT_SCOPE_SITE
goto retryScope
}
// Fall back with retry for all interfaces with full scope again
// (which then goes back to lower scope again for all interfaces
// before we give up completely).
if link != nil {
linkScopeMax = unix.RT_SCOPE_UNIVERSE
link = nil
goto retryInterface
}
return nil, fmt.Errorf("No address found")
}
func addrUsableAsNodeIP(a netlink.Addr, isPreferredIP bool, ipsToExclude []net.IP, linkScopeMax, ipLen int) bool {
if a.Scope > linkScopeMax {
return false
}
if ip.ListContainsIP(ipsToExclude, a.IP) {
return false
}
if len(a.IP) < ipLen {
return false
}
if a.Flags&unix.IFA_F_SECONDARY > 0 && !isPreferredIP {
return false
}
if a.Flags&(unix.IFA_F_TENTATIVE|unix.IFA_F_DADFAILED) != 0 {
return false
}View on GitHub (pinned to ac7b90affa)
Solutions
- Check `ip -4 addr` / `ip -6 addr` on the node for a global-scope address on an up interface.
- Bring up the intended interface and ensure it has a properly configured address (no dadfailed/tentative for v6).
- Set an explicit node IP via configuration (e.g. cilium-agent --ipv4-node / node-ip config) instead of auto-detection.
- Verify ipsToExclude isn't filtering out the only valid address; check k8s node annotations used for exclusions.
- Run inside a network namespace that has global addresses (not a bare loopback-only netns).
Example fix
// before
ip, err := FirstGlobalV6Addr() // IPv6-only request on IPv4-only host -> "No address found"
// after
// configure a global IPv6 address, or fall back:
ip, err := FirstGlobalV6Addr()
if err != nil {
ip, err = FirstGlobalV4Addr()
} Defensive patterns
Strategy: fallback
Validate before calling
out, _ := exec.Command("ip", "-o", "-4", "addr", "show", "scope", "global").Output()
if len(out) == 0 {
return errors.New("node has no global-scope address; set node IP explicitly")
} Try / catch
ip, err := FirstGlobalV4Addr()
if err != nil {
if err.Error() == "No address found" {
ip = configuredNodeIP // fallback from config or k8s node object
} else {
return err
}
} Prevention
- Always configure an explicit node IP in containerized/loopback-only environments.
- Verify `ip addr scope global` output during node provisioning.
- Keep requested interfaces up with valid addresses (watch for IPv6 dadfailed).
- Audit exclusion lists so they don't filter out the only usable IP.
When it happens
Trigger: FirstGlobalV4Addr or FirstGlobalV6Addr called on a node whose interfaces have only link-local (scope link/host), loopback, excluded, or otherwise non-usable addresses for the requested family.
Common situations: Node with only a loopback interface; interfaces down or addresses in tentative/dadfailed state; all candidate IPs excluded by ipsToExclude; IPv6 requested on an IPv4-only node (or vice versa); running in a container/netns without global-scope addresses.
Related errors
- unable to lookup netkit peer link: %w
- failed to delete stale xfrm policy spi (%d): %w
- no IPv4 address assigned to interface
- no interface with %s IPv4 assigned to
- no IPv6 address assigned to interface
AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31).
Data as JSON: /api/errors/66a0e255646d53ef.
Report an issue: GitHub.