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

  1. Check `ip -4 addr` / `ip -6 addr` on the node for a global-scope address on an up interface.
  2. Bring up the intended interface and ensure it has a properly configured address (no dadfailed/tentative for v6).
  3. Set an explicit node IP via configuration (e.g. cilium-agent --ipv4-node / node-ip config) instead of auto-detection.
  4. Verify ipsToExclude isn't filtering out the only valid address; check k8s node annotations used for exclusions.
  5. 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

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


AI-assisted analysis of cilium/cilium@ac7b90affa (2026-08-31). Data as JSON: /api/errors/66a0e255646d53ef. Report an issue: GitHub.