tailscale/tailscale · error

failed to watch IPN bus: %w

Error message

failed to watch IPN bus: %w

What it means

Opening an IPN bus watch with initial netmap failed at the start of health monitoring, so the proxy's readiness endpoint can never observe the node's addresses; monitoring returns the error to the caller.

Source

Thrown at kube/health/healthz.go:65

	} else {
		http.Error(w, "node currently has no tailscale IPs", http.StatusServiceUnavailable)
	}
}

func (h *Healthz) Update(healthy bool) {
	h.Lock()
	defer h.Unlock()

	if h.hasAddrs != healthy {
		h.logger("Setting healthy %v", healthy)
	}
	h.hasAddrs = healthy
}

func (h *Healthz) MonitorHealth(ctx context.Context, lc *local.Client) error {
	w, err := lc.WatchIPNBus(ctx, ipn.NotifyInitialNetMap)
	if err != nil {
		return fmt.Errorf("failed to watch IPN bus: %w", err)
	}

	for {
		n, err := w.Next()
		if err != nil {
			return err
		}

		if self := n.SelfChange; self != nil {
			h.Update(len(self.Addresses) != 0)
		}
	}
}

// RegisterHealthHandlers registers a simple health handler at /healthz.
// A containerized tailscale instance is considered healthy if
// it has at least one tailnet IP address.
func RegisterHealthHandlers(mux *http.ServeMux, podIPv4, podIPv6 string, logger logger.Logf) *Healthz {

View on GitHub (pinned to 6e0912f979)

Solutions

  1. Watching the IPN bus for health checks failed; verify tailscaled is up and the local API socket is accessible.
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at kube/health/healthz.go:65 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of tailscale/tailscale@6e0912f979 (2026-08-18). Data as JSON: /api/errors/07f3d2f211c9122c. Report an issue: GitHub.