Fractal Techware

Alert runbooks /

CoreDNSForwardHealthcheckFailures

The CoreDNS forward plugin keeps failing its health checks against at least one upstream resolver.

   
Severity warning
Source CoreDNS prometheus plugin, forward plugin metrics
Key metric coredns_proxy_healthcheck_failures_total (labels to, proxy_name)

What it means

When a forwarded query fails, the forward plugin starts health-checking that upstream in the background (a query for . by default) until it responds again, and marks it down while checks fail. The alert fires when failures for an upstream continue over a sustained window.

With several upstreams, CoreDNS routes around the broken one, so impact may be limited to extra latency. With a single upstream, or when all are failing, external name resolution breaks and CoreDNS falls back to trying upstreams at random.

Common causes

First checks

  1. Which upstream is failing and how often:
    sum by (to) (rate(coredns_proxy_healthcheck_failures_total[5m]))
    
  2. Check the configured upstreams:
    kubectl -n kube-system get configmap coredns -o jsonpath='{.data.Corefile}' | grep -A3 forward
    

    If it forwards to /etc/resolv.conf, look at that file on the nodes.

  3. Query the upstream from a pod on the same network as CoreDNS:
    kubectl run dnstest --rm -it --restart=Never --image=busybox:1.36 -- nslookup example.com <upstream-ip>
    
  4. Check CoreDNS logs for forward errors:
    kubectl -n kube-system logs -l k8s-app=kube-dns --tail=100 | grep -iE "forward|unhealthy|i/o timeout"
    

Fixing it

Restore reachability (firewall, ACL) or replace the upstream IP in the coredns ConfigMap; the reload plugin picks up changes without a restart. Keep at least two independent upstreams. If nodes use a local stub resolver, forward to real resolver addresses instead.