<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Consul Operations Guides on Netdata</title><link>https://www.netdata.cloud/guides/consul/</link><description>Recent content in Consul Operations Guides on Netdata</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.netdata.cloud/guides/consul/index.xml" rel="self" type="application/rss+xml"/><item><title>Consul "ACL not found": requests rejected after a token or policy change</title><link>https://www.netdata.cloud/guides/consul/consul-acl-not-found/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-acl-not-found/</guid><description>&lt;p>&amp;ldquo;ACL not found&amp;rdquo; appears as HTTP 403 responses carrying &amp;ldquo;ACL not found&amp;rdquo; or &amp;ldquo;token does not exist: ACL not found&amp;rdquo;. It surfaces in agent and server logs, sidecar injector output, and as failed service registrations, health check updates, or KV writes. The blast radius depends on which token is missing: a single application token breaks one service; a replication or agent token can break an entire datacenter&amp;rsquo;s authorization pipeline.&lt;/p>
&lt;p>The message is frequently misread. &amp;ldquo;ACL not found&amp;rdquo; does not mean the token has the wrong permissions. It means the Consul server receiving the request has no record of the token&amp;rsquo;s SecretID. The token was deleted, never created in this datacenter, or has not yet arrived via ACL replication. The fix path is completely different from &amp;ldquo;Permission denied&amp;rdquo;, which indicates the token is known but lacks a specific right.&lt;/p></description></item><item><title>Consul "No cluster leader": every write is failing</title><link>https://www.netdata.cloud/guides/consul/consul-no-cluster-leader/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-no-cluster-leader/</guid><description>&lt;p>When Consul cannot elect a Raft leader, every write fails. The error surfaces to clients as &lt;code>rpc error making call: No cluster leader&lt;/code>, sometimes as &lt;code>no known leader&lt;/code>. Service registrations hang, KV writes return errors, sessions and ACL tokens cannot be created, and health check state stops reaching the catalog.&lt;/p>
&lt;p>Only stale reads continue to work: stale-mode API queries and DNS lookups (which default to &lt;code>allow_stale&lt;/code>) &lt;!-- TODO: verify exact Consul version where DNS allow_stale defaulted to true --> return whatever the responding server last committed. Default and consistent reads fail because they require a leader, which can surface differently to callers depending on their read mode.&lt;/p></description></item><item><title>Consul "too many open files": file descriptor exhaustion on servers</title><link>https://www.netdata.cloud/guides/consul/consul-too-many-open-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-too-many-open-files/</guid><description>&lt;p>When a Consul server hits its file descriptor ceiling, every consumer that needs a new FD fails immediately: RPC connections are refused, DNS listeners stop accepting queries, xDS streams to Envoy sidecars cannot open, and outbound health-check connections fail. Gossip probes time out and the failure detection protocol marks otherwise healthy peers as suspect or failed. A healthy-looking cluster a minute ago is now generating cascading pages.&lt;/p>
&lt;p>File descriptor exhaustion is not graceful degradation. Each socket, pipe, and file handle counts against a hard kernel limit. Once that limit is reached, every syscall that creates a new FD (&lt;code>accept&lt;/code>, &lt;code>socket&lt;/code>, &lt;code>open&lt;/code>, &lt;code>pipe&lt;/code>, &lt;code>epoll_create&lt;/code>) returns &lt;code>EMFILE&lt;/code>, regardless of available CPU, memory, or network capacity. &lt;!-- TODO: verify whether Consul's accept loops genuinely do not re-arm after EMFILE, or whether they retry once FDs free up. The claim that affected code paths stay broken until restart may be too strong for Go's net.Listener pattern, but the practical reality is that enough subsystems fail simultaneously that the server does not recover on its own. --> A &lt;code>consul reload&lt;/code> either fails outright (it needs FDs to read config and re-open listeners) or succeeds but leaves the server half-functional. Recovery requires raising the limit and restarting the process.&lt;/p></description></item><item><title>Consul ACL resolution latency: token cache thrashing on every request</title><link>https://www.netdata.cloud/guides/consul/consul-acl-resolution-latency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-acl-resolution-latency/</guid><description>&lt;p>Every authenticated Consul request pays an ACL resolution tax. When that tax is sub-millisecond, nobody notices. When the token cache cannot hold the working set, every request becomes a miss and that tax multiplies across DNS lookups, HTTP API calls, RPC forwarding, and Connect intention evaluation. The cluster keeps answering, but slowly, and the slowness is uniform across every authenticated path.&lt;/p>
&lt;p>The primary signal is &lt;code>consul.acl.ResolveToken&lt;/code> (a summary timer, milliseconds). Healthy cached resolution is sub-millisecond; a cold miss against the authoritative datacenter costs low single-digit milliseconds. Sustained values above ~10ms are TICKET-worthy: ACL resolution sits on the hot path of every authenticated operation. It surfaces as elevated DNS latency, slow HTTP API responses, and stretched Connect sidecar handshakes long before any single subsystem fails.&lt;/p></description></item><item><title>Consul anti-entropy not syncing: local agent state and the catalog drifting apart</title><link>https://www.netdata.cloud/guides/consul/consul-catalog-staleness-anti-entropy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-catalog-staleness-anti-entropy/</guid><description>&lt;p>A service is registered on the local agent. The health check is passing locally. But &lt;code>dig myservice.service.consul&lt;/code> returns nothing, the load balancer has no targets, and the catalog API shows no instances. The servers have a leader, gossip is healthy, Raft metrics look normal. The problem is between the agent and the catalog.&lt;/p>
&lt;p>Consul&amp;rsquo;s catalog is authoritative on the servers. Each agent maintains its own local state (registered services, health checks, node metadata) and periodically reconciles that state with the server catalog through a background process called anti-entropy sync. The agent treats its local view as authoritative and pushes changes to the catalog. When this sync fails, the catalog retains the last-known state it received from that agent. A service registered locally never appears cluster-wide. A service deregistered locally continues to show up in DNS and API queries.&lt;/p></description></item><item><title>Consul blocking query accumulation: leaked watches that pile up goroutines</title><link>https://www.netdata.cloud/guides/consul/consul-blocking-query-accumulation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-blocking-query-accumulation/</guid><description>&lt;p>Goroutine count on your Consul servers is creeping upward. File descriptor usage follows the same trajectory. Neither reverses during quiet periods. Eventually the server hits its FD limit or goroutine scheduling overhead degrades everything: new connections are refused, health checks stop reaching the catalog, anti-entropy sync stalls, and the cluster cascades.&lt;/p>
&lt;p>The culprit is leaked blocking queries. Consul&amp;rsquo;s watch mechanism and any client using the HTTP long-polling API (&lt;code>?index=&lt;/code> and &lt;code>?wait=&lt;/code> parameters) holds a goroutine and an FD on the server for up to the wait timeout (5 minutes default, 10 minutes maximum). A fleet of consul-template instances, application-level watchers, or service mesh control planes can open thousands of concurrent blocking queries. This is fine when queries are properly opened and closed. The leak starts when they are not: a client crashes without cleanly closing its connection, a consul-template bug prevents goroutine cleanup, a watch configuration exceeds the server&amp;rsquo;s tracking capacity, or a go-memdb WatchSet bug causes goroutine proliferation.&lt;/p></description></item><item><title>Consul catalog bloat: too many services and checks slowing everything down</title><link>https://www.netdata.cloud/guides/consul/consul-catalog-bloat/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-catalog-bloat/</guid><description>&lt;p>DNS latency is creeping up. API calls to &lt;code>/v1/catalog/services&lt;/code> take longer than they used to. Server restarts that used to take 20 seconds now take minutes. The Raft snapshot on disk keeps growing, and so does server RSS. No single failure point, no stack trace, no page. Just a slow, compounding drag on everything Consul does.&lt;/p>
&lt;p>This is catalog bloat. Registered service instances and health checks grow the in-memory state store, the on-disk Raft snapshot, anti-entropy reconciliation work, and catalog-scan latency for every DNS and API query. The cost compounds week over week until a snapshot creation tips a leader election, a restart takes long enough to miss a deploy window, or DNS p99 crosses the threshold where applications time out on service discovery.&lt;/p></description></item><item><title>Consul catalog poisoning: services registered from unknown nodes</title><link>https://www.netdata.cloud/guides/consul/consul-catalog-poisoning-unknown-registration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-catalog-poisoning-unknown-registration/</guid><description>&lt;p>A service instance appears in your catalog on a node you have never deployed. Its &lt;code>ServiceAddress&lt;/code> points somewhere you do not control. That is catalog poisoning: a registration that did not come from your infrastructure.&lt;/p>
&lt;p>Without strict ACLs, any process that can reach the Consul HTTP API can call the registration endpoints and add an instance for any service name. Consumers resolving discovery through Consul DNS or the catalog and health APIs will route a fraction of their traffic to that address. In a non-Connect deployment there is nothing in the data path that verifies the instance is what it claims to be.&lt;/p></description></item><item><title>Consul client rpc failed: agents alive but the catalog is going stale</title><link>https://www.netdata.cloud/guides/consul/consul-client-rpc-failed/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-client-rpc-failed/</guid><description>&lt;p>A client agent&amp;rsquo;s &lt;code>consul.client.rpc.failed&lt;/code> counter ticks up. The agent process is running, gossip reports the node as &lt;code>alive&lt;/code>, local health checks execute on schedule, and &lt;code>consul members&lt;/code> lists the node as healthy. The server cluster looks fine: leadership is stable, Raft commit times are normal, and there is no election noise. Nothing on the standard dashboard is red.&lt;/p>
&lt;p>The catalog is going stale anyway.&lt;/p>
&lt;p>Consul runs two independent network paths between an agent and the server cluster. Gossip membership flows over LAN Serf (TCP and UDP port 8301). State updates flow over the server RPC pipeline (TCP port 8300). The first can be perfectly healthy while the second is broken, and most dashboards only watch the first. Anti-entropy sync runs on a fixed interval&lt;!-- TODO: verify the default anti-entropy sync interval in current Consul releases; historically it has changed --> and pushes local agent state to the server catalog over RPC. When RPC fails, the catalog stops receiving updates from that agent but keeps serving whatever it last knew. Consumers (DNS, HTTP API, load balancer integrations, service mesh sidecars) keep getting answers, just progressively wrong ones.&lt;/p></description></item><item><title>Consul Connect "no healthy upstream": Envoy has no endpoints to route to</title><link>https://www.netdata.cloud/guides/consul/consul-envoy-no-healthy-upstream/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-envoy-no-healthy-upstream/</guid><description>&lt;p>When an application in a Consul Connect mesh receives HTTP 503 with &lt;code>response_flags=UH&lt;/code> in the Envoy access log, Envoy&amp;rsquo;s router rejected the request because it had zero eligible endpoints for the upstream cluster. The downstream service is fine, the network is fine, and the request never left the sidecar. Somewhere between the Envoy admin port, the local Consul agent, the Consul servers, and the upstream instances, the endpoint set has gone empty, all-unhealthy, or silently ejected.&lt;/p></description></item><item><title>Consul Connect CA rotation failure: a root roll that never finished</title><link>https://www.netdata.cloud/guides/consul/consul-connect-ca-rotation-failure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-connect-ca-rotation-failure/</guid><description>&lt;p>Consul Connect CA root rotation promotes a new root, cross-signs the new intermediate against the old root, lets both roots coexist while leaf certificates roll over, and retires the old root only after the last leaf signed by it expires. When that rollout never completes, the first thing you notice is intermittent mTLS failures between specific service pairs, hours after the rotation was triggered, with no obvious network or config change to blame.&lt;/p></description></item><item><title>Consul Connect certificate expired: mTLS handshakes failing across the mesh</title><link>https://www.netdata.cloud/guides/consul/consul-connect-certificate-expiry/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-connect-certificate-expiry/</guid><description>&lt;p>Consul Connect relies on short-lived leaf certificates for service-to-service mTLS. When those certificates expire without rotating, the failure is cliff-edged: handshakes that worked seconds ago start failing, Envoy logs fill with TLS errors, and dependent services stop communicating. The blast radius grows over minutes to hours as each leaf certificate reaches its own expiry independently.&lt;/p>
&lt;p>The first symptom is usually intermittent: a specific upstream starts returning connection resets or 5xx errors. As more leaves expire, failures fan out across service pairs until the mesh is broadly broken. Expiry alone is a countdown with no early warning. The signal that matters earlier is renewal success: are leaves actually being re-issued, or is the rotation pipeline silently broken while the clock runs out?&lt;/p></description></item><item><title>Consul critical health checks spiking: real outage or broken checks?</title><link>https://www.netdata.cloud/guides/consul/consul-service-critical-health-checks/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-service-critical-health-checks/</guid><description>&lt;p>The alert fires when &lt;code>/v1/health/state/critical&lt;/code> jumps from single digits to dozens or hundreds of checks in minutes. The page says &amp;ldquo;services are unhealthy,&amp;rdquo; but that is ambiguous: either real services are down, or the checks themselves are broken. Pick the wrong fork and you burn an hour on the wrong dependency.&lt;/p>
&lt;p>The first decision is not &amp;ldquo;what failed.&amp;rdquo; It is &amp;ldquo;is this a service-level event, a node-level event, or a monitoring-level event?&amp;rdquo; The cheapest signal is the check &lt;code>Output&lt;/code> text field, which carries the raw error from check execution. It holds strings like &lt;code>connection refused&lt;/code>, &lt;code>i/o timeout&lt;/code>, &lt;code>certificate has expired&lt;/code>. That field usually resolves the diagnosis in seconds, and most teams ignore it until their second or third incident.&lt;/p></description></item><item><title>Consul cross-datacenter query failure: prepared-query failover masking a DC outage</title><link>https://www.netdata.cloud/guides/consul/consul-cross-dc-query-failure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-cross-dc-query-failure/</guid><description>&lt;p>A Consul prepared query with cross-DC failover does exactly what it was configured to do: it silently forwards lookups to a remote DC when local results are empty. Consumers receive valid service discovery results, applications keep connecting, and no error fires. The local DC may have zero healthy instances, and nobody on the consumer side knows.&lt;/p>
&lt;p>The DNS response is identical whether nodes came from the local DC or a remote one. There is no EDNS flag, no source record, no indicator in the answer. Receiving results does not mean local health.&lt;/p></description></item><item><title>Consul DeregisterCriticalServiceAfter: instances vanishing from the catalog</title><link>https://www.netdata.cloud/guides/consul/consul-deregister-critical-service-after/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-deregister-critical-service-after/</guid><description>&lt;p>A service that was merely slow to recover has disappeared from the Consul catalog. Healthy-instance count dropped to zero. DNS returns empty results. Load balancers have no targets. Yet the service process is running, the host is up, and the Consul agent on that host is healthy and gossiping. DCSA did exactly what you configured.&lt;/p>
&lt;p>&lt;code>DeregisterCriticalServiceAfter&lt;/code> (DCSA) is an agent-side reaper that removes a service instance and its checks from the catalog once the check has been critical for a configured duration. It is deliberate garbage collection for stale entries. Leave it unset and critical checks plus their output strings accumulate unbounded in the state store, growing memory and slowing snapshots.&lt;/p></description></item><item><title>Consul DNS latency high: slow lookups stalling connections and failovers</title><link>https://www.netdata.cloud/guides/consul/consul-dns-latency-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-dns-latency-high/</guid><description>&lt;p>Slow Consul DNS lookups rarely look like a DNS problem at first. Applications see connection timeouts, retries, and slow startup. Load balancers see health check flapping. Service mesh sidecars see upstream resolution failures. The DNS layer is invisible to most teams until &lt;code>consul.dns.domain_query&lt;/code> crosses the page threshold.&lt;/p>
&lt;p>The first decision in a Consul DNS latency incident is structural: is the slowness in the server cluster (Raft, disk, catalog size) or in the DNS path itself (TTL, agent CPU, query complexity, downstream resolvers)? The signals are all in agent telemetry, but you have to know which ones to correlate.&lt;/p></description></item><item><title>Consul DNS SERVFAIL: service discovery is broken for your applications</title><link>https://www.netdata.cloud/guides/consul/consul-dns-servfail/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-dns-servfail/</guid><description>&lt;p>SERVFAIL from Consul&amp;rsquo;s DNS interface on port 8600 means service discovery is broken for every application resolving names through it. Applications see connection refused, timeouts, and cascading failovers. The symptom is broad, but the root cause lives along one of four layers: the downstream resolver (if present), the Consul agent&amp;rsquo;s built-in DNS server, the agent-to-server RPC channel, or the server&amp;rsquo;s catalog state.&lt;/p>
&lt;p>NXDOMAIN is a related but distinct signal. SERVFAIL means the resolver could not complete the query: server overload, timeout, unreachable upstream, or internal error. NXDOMAIN means the query completed but the name does not exist in the catalog. Both break discovery, but they point to different layers. Conflating them during an incident wastes time.&lt;/p></description></item><item><title>Consul Go GC pauses: stop-the-world stalls that disturb Raft timing</title><link>https://www.netdata.cloud/guides/consul/consul-gc-pause-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-gc-pause-high/</guid><description>&lt;p>Consul servers are Go binaries, and Go&amp;rsquo;s garbage collector still has stop-the-world phases despite doing most of its work concurrently. On a server with a large live heap and a high allocation rate, those pauses can stretch into hundreds of milliseconds. The Raft leader sends heartbeats from a goroutine in the same process. When a pause runs long enough, the leader stops heartbeating; followers see &lt;code>consul.raft.leader.lastContact&lt;/code> climbing toward the election timeout and start a new election. Writes block for the duration.&lt;/p></description></item><item><title>Consul goroutine count climbing: the leak behind slow resource exhaustion</title><link>https://www.netdata.cloud/guides/consul/consul-goroutine-leak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-goroutine-leak/</guid><description>&lt;p>&lt;code>consul.runtime.num_goroutines&lt;/code> is a gauge of how many concurrent operations the process is juggling: every blocking query, every gRPC or xDS stream, every health check handler runs inside a goroutine. In a healthy cluster the number is baseline-dependent but flat. When it creeps upward hour over hour, something is spawning goroutines and not cleaning them up.&lt;/p>
&lt;p>The absolute number is a distraction. A medium cluster idles between a few hundred and 20,000 goroutines; a large Connect deployment legitimately runs higher. The trend is the signal. Monotonic growth without a matching increase in services, watchers, or sidecar count is a leak, regardless of where the number sits.&lt;/p></description></item><item><title>Consul gossip encryption key mismatch: a botched keyring rotation splits the pool</title><link>https://www.netdata.cloud/guides/consul/consul-gossip-encryption-key-mismatch/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-gossip-encryption-key-mismatch/</guid><description>&lt;p>You rotated the gossip encryption key. Nodes are dropping from the member list, showing as &amp;ldquo;failed&amp;rdquo; or &amp;ldquo;suspect&amp;rdquo; to peers, and service discovery is degrading. The network is fine. The agents are running. Raft may even be stable. But the gossip pool has split.&lt;/p>
&lt;p>The root cause is at the protocol layer. Consul&amp;rsquo;s Serf gossip protocol encrypts every message with a symmetric key. When nodes hold different keys, they cannot decrypt each other&amp;rsquo;s gossip messages. Each side sees the other as unresponsive, and failure detection kicks in. This looks exactly like a network partition, but pings between the affected hosts succeed.&lt;/p></description></item><item><title>Consul gossip flapping: nodes oscillating between alive, suspect, and failed</title><link>https://www.netdata.cloud/guides/consul/consul-gossip-flapping-suspect-nodes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-gossip-flapping-suspect-nodes/</guid><description>&lt;p>When Consul nodes rapidly flip between alive, suspect, and failed in the gossip pool, every state transition fires a membership event that downstream consumers react to. Load balancers pull endpoints in and out, consul-template reloads configurations, and Envoy sidecars receive new xDS endpoint pushes. A flapping node generates more operational noise than a cleanly failed one.&lt;/p>
&lt;p>The Serf gossip protocol converges under stable network conditions. Under packet loss, CPU starvation, or partial partitions, it oscillates instead. The symptom appears in &lt;code>consul members&lt;/code> as nodes cycling between alive, suspect, and failed; in Serf metrics as spikes in &lt;code>consul.serf.lan.member.flaps&lt;/code>; and in downstream systems as configuration reload storms that track the flap cadence.&lt;/p></description></item><item><title>Consul gossip storm after mass recovery: rejoin floods and anti-entropy spikes</title><link>https://www.netdata.cloud/guides/consul/consul-gossip-storm-mass-recovery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-gossip-storm-mass-recovery/</guid><description>&lt;p>After a mass recovery event (AZ healing, partition recovery, fleet-wide rolling restart), dozens or hundreds of Consul agents rejoin the LAN gossip pool in a compressed window. Each returning agent generates member-join events that every other member processes, and triggers anti-entropy sync to reconcile its local service registrations against the server catalog. The coordinated spike hits Serf message queues, catalog registration writes, and Raft commits simultaneously.&lt;/p>
&lt;p>Most clusters absorb the spike and recover within minutes. The risk is write volume pushing Raft commitTime toward the election timeout. Once followers cannot reach the leader within the election window, they start new elections, cascading a transient burst into leader thrashing and repeated write outages.&lt;/p></description></item><item><title>Consul health check flapping: the passing/critical oscillation that churns the catalog</title><link>https://www.netdata.cloud/guides/consul/consul-health-check-flapping/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-health-check-flapping/</guid><description>&lt;p>Every health check state transition is a catalog write. The client agent runs the check locally, detects a status change, and pushes the update to the leader. The leader commits a Raft log entry, the FSM applies it, per-service caches invalidate, blocking queries watching that service return, and every downstream consumer (load balancer, Envoy control plane, consul-template, DNS resolver) re-evaluates. One flapping check is an annoyance. A dozen flapping in unison saturates the Raft write pipeline and looks indistinguishable from a registration storm.&lt;/p></description></item><item><title>Consul intention denied: service-to-service traffic blocked by policy</title><link>https://www.netdata.cloud/guides/consul/consul-intention-denied-connection/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-intention-denied-connection/</guid><description>&lt;p>Service A can no longer reach service B. Envoy sidecars log 403 responses or connection resets. The Consul server cluster looks healthy: leader stable, Raft committing, gossip intact, certificates within their lifetime. Traffic that worked an hour ago is now blocked.&lt;/p>
&lt;p>This is almost always policy, not infrastructure. Consul Connect intentions are the mesh authorization layer, evaluated at connection establishment and enforced by Envoy RBAC filters. When an intention denies a connection, the data plane is doing exactly what it was configured to do. The diagnostic job is to determine whether the denial is correct (policy working as designed) or a misconfiguration: wrong identity, missing allow, precedence mistake, or stale cache.&lt;/p></description></item><item><title>Consul KV store saturation: using the KV store as a database</title><link>https://www.netdata.cloud/guides/consul/consul-kv-store-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-kv-store-saturation/</guid><description>&lt;p>Consul KV writes are slow. Raft commit times are climbing. Service registration and health check updates lag. DNS queries for service discovery take longer than usual. This combination often points to an application treating Consul&amp;rsquo;s KV store as a general-purpose database: high-frequency writes, large values, or deep key trees.&lt;/p>
&lt;p>The problem is architectural, not a tuning issue. The KV store is part of Consul&amp;rsquo;s Raft finite state machine. Every KV write is a Raft log entry that must be committed through the leader, replicated to a quorum of servers, and applied to the in-memory state store on every server. Every KV value is included in every Raft snapshot. When an application treats the KV store as a database, the write load backs up the entire Raft pipeline, and every Consul subsystem that depends on Raft degrades with it.&lt;/p></description></item><item><title>Consul KV value too large: the 512KB limit and why approaching it hurts</title><link>https://www.netdata.cloud/guides/consul/consul-kv-value-too-large/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-kv-value-too-large/</guid><description>&lt;p>You pushed a value into Consul KV and got HTTP 413, or your server logs are filling with lines like &lt;code>Request body(524401 bytes) too large, max size: 524288 bytes&lt;/code>. That is the obvious failure: a single value crossed the default 512KB ceiling. The less obvious failure is that values well under the limit are still expensive, because every KV byte is replicated through Raft to every server and re-emitted in every snapshot.&lt;/p></description></item><item><title>Consul KV write latency high: every write is a Raft commit</title><link>https://www.netdata.cloud/guides/consul/consul-kv-write-latency-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-kv-write-latency-high/</guid><description>&lt;p>A KV PUT that used to return in 20ms is now taking 500ms, 2s, or timing out entirely. Applications stall on locks, configuration writes queue, and leader election alerts may be firing. Consul&amp;rsquo;s KV is not a standalone subsystem. Every KV write is a Raft log entry that must be replicated to a quorum of servers, fsynced to disk on each, and applied to the in-memory state machine before the API call returns. KV write latency is a direct reflection of Raft commit health.&lt;/p></description></item><item><title>Consul leader election storm: repeated elections and rolling write outages</title><link>https://www.netdata.cloud/guides/consul/consul-leader-election-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-leader-election-storm/</guid><description>&lt;p>Your Consul cluster has a leader. Writes are still failing. The leader keeps changing. Applications see intermittent &amp;ldquo;no cluster leader&amp;rdquo; errors, watches reconnect, DNS returns stale results, and every few seconds a different server wins an election only to lose it again.&lt;/p>
&lt;!-- TODO: verify metric type. consul.raft.state.leader appears to be a gauge (1 when leader, 0 otherwise), not a counter. This article repeatedly describes it as a counter that "increments" or "climbs." If it is a gauge, monitoring should track transitions between 0 and 1, not counter increments. Same concern applies to consul.raft.state.candidate below. -->
&lt;p>This is a leader election storm. Unlike a clean one-time failover, the cluster never stabilizes. Each election blocks all writes for one to several seconds. When elections recur faster than the recovery window, the cluster is effectively write-unavailable while technically always having &amp;ldquo;a leader.&amp;rdquo; A naive alert on &amp;ldquo;no leader&amp;rdquo; stays silent. The real signal is recurrence: leadership transitions accumulating over time, each one a brief but real outage.&lt;/p></description></item><item><title>Consul leader stable but commits stalled: writes silently failing</title><link>https://www.netdata.cloud/guides/consul/consul-stalled-commit-index/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-stalled-commit-index/</guid><description>&lt;p>You are paged for &amp;ldquo;Consul writes failing.&amp;rdquo; You check &lt;code>/v1/status/leader&lt;/code>: it returns an address. You check &lt;code>consul members&lt;/code>: all servers alive. Leadership has been stable for hours. Your &amp;ldquo;is there a leader?&amp;rdquo; alert is silent. Yet KV writes time out, service registrations hang, and sessions cannot be created.&lt;/p>
&lt;p>The leader is alive, holds leadership, and answers health probes. But its commit index is not advancing. Somewhere between the leader receiving a write and that write becoming visible in the FSM, the pipeline is stalled. The cluster is write-dead.&lt;/p></description></item><item><title>Consul lost quorum: Raft peers below the majority needed to elect a leader</title><link>https://www.netdata.cloud/guides/consul/consul-raft-peers-below-quorum/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-raft-peers-below-quorum/</guid><description>&lt;p>A Consul cluster has lost quorum when the number of voting Raft peers drops below the majority required to elect a leader. For a 3-server cluster that means fewer than 2 voters. For a 5-server cluster, fewer than 3. With no leader, every write fails: service registrations, health-check state updates, KV writes, session creation, ACL token creation. Reads served in stale mode still return data, but that data is frozen at the moment quorum was lost.&lt;/p></description></item><item><title>Consul monitoring checklist: the signals every production cluster needs</title><link>https://www.netdata.cloud/guides/consul/consul-monitoring-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-monitoring-checklist/</guid><description>&lt;p>Consul runs three subsystems concurrently: Raft consensus, Serf gossip, and a catalog state machine backed by BoltDB. Each fails independently. A monitoring setup that checks only &amp;ldquo;is there a leader&amp;rdquo; and &amp;ldquo;are all members alive&amp;rdquo; will miss the most common production incidents: slow disk causing leader churn, client agents losing RPC connectivity while gossip stays green, blocking query leaks, and Connect certificate rotation failures.&lt;/p>
&lt;p>This checklist organizes signals into four maturity levels. Each builds on the previous one and maps to specific failure patterns: leader thrashing, split brain after partition, gossip storms during mass recovery, silent catalog staleness, and KV store saturation. Use it as an audit tool. Identify which level your current monitoring reaches, then close gaps at that level before chasing the next tier.&lt;/p></description></item><item><title>Consul monitoring maturity model: from survival to expert</title><link>https://www.netdata.cloud/guides/consul/consul-monitoring-maturity-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-monitoring-maturity-model/</guid><description>&lt;p>Consul runs three independent subsystems that must all be healthy for the cluster to function: Raft consensus, Serf gossip, and the catalog state machine with its anti-entropy sync pipeline. Most teams monitor one or two well and discover the third during an incident.&lt;/p>
&lt;p>The model is cumulative. Each level adds signals to the previous one; you cannot skip to Mature without the Operational baseline in place. A team with composite-pattern detection at Expert but no client-agent RPC monitoring at Operational is blind to the most common silent failure mode: the catalog drifting from reality while every server-side metric looks healthy.&lt;/p></description></item><item><title>Consul on EBS: burst-credit exhaustion and the sudden latency cliff</title><link>https://www.netdata.cloud/guides/consul/consul-ebs-burst-credit-exhaustion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-ebs-burst-credit-exhaustion/</guid><description>&lt;p>Consul is stable. Raft commit times under 10ms, leadership steady, discovery in single-digit milliseconds. Then, with no deploy, no config change, and no traffic spike, writes start timing out. &lt;code>consul.raft.commitTime&lt;/code> jumps from 5ms to 500ms. Followers report &lt;code>lastContact&lt;/code> climbing toward the election timeout. Within seconds, the cluster elects a new leader, then another, then another. Every write fails with &amp;ldquo;no cluster leader.&amp;rdquo;&lt;/p>
&lt;p>The root cause is under Consul, in the block storage layer. AWS gp2 EBS volumes accumulate I/O burst credits when idle and spend them to sustain burst performance up to 3000 IOPS. When credits deplete, the volume drops to its baseline rate of 3 IOPS per GiB of volume size. A 100 GB gp2 volume falls from 3000 IOPS to 300 IOPS. Consul has no metric for burst credit depletion. The disk simply gets slow, and Raft, which fsyncs every log entry to disk before acknowledging it, hits a wall.&lt;/p></description></item><item><title>Consul Permission denied (403): authorized token, missing permission</title><link>https://www.netdata.cloud/guides/consul/consul-permission-denied-403/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-permission-denied-403/</guid><description>&lt;p>A 403 &amp;ldquo;Permission denied&amp;rdquo; from the Consul HTTP API means the request reached the server with a token it recognizes, but policy evaluation denied the operation. The token exists, resolves, and is not expired. It lacks the rule covering the resource being touched: a service, a KV prefix, a node, an operator endpoint. This differs from &amp;ldquo;ACL not found&amp;rdquo;, where the SecretID is unknown to the server, and the two need different responses.&lt;/p></description></item><item><title>Consul raft commitTime high: the write pipeline is slowing down</title><link>https://www.netdata.cloud/guides/consul/consul-raft-commit-time-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-raft-commit-time-high/</guid><description>&lt;p>&lt;code>consul.raft.commitTime&lt;/code> is the single best indicator of Raft health on a Consul server. It is a leader-only timer that folds disk write latency, replication latency, and FSM apply time into one number. When it climbs, every Consul write slows: service registrations queue, KV writes block, health check updates lag, and consumers downstream of the catalog start timing out. The disk-bound leader cannot get log entries committed fast enough, followers lose touch, and the next step is leader elections, during which the cluster cannot commit writes at all.&lt;/p></description></item><item><title>Consul Raft data directory full: the server that can no longer write</title><link>https://www.netdata.cloud/guides/consul/consul-raft-data-dir-disk-full/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-raft-data-dir-disk-full/</guid><description>&lt;p>The server&amp;rsquo;s &lt;code>data_dir&lt;/code> volume hits 100%. Raft cannot append to &lt;code>raft.db&lt;/code> and cannot fsync snapshot files. The server either refuses writes or crashes. If the affected server is the leader, the commit index stalls and followers drift toward an election.&lt;/p>
&lt;p>The most common cause is not disk hardware failure. It is a snapshot that keeps failing. Raft truncates its log only after a successful snapshot, so each failed attempt leaves &lt;code>raft.db&lt;/code> larger than it should be. Eventually the log fills the volume.&lt;/p></description></item><item><title>Consul raft lastContact rising: followers drifting toward an election</title><link>https://www.netdata.cloud/guides/consul/consul-raft-last-contact-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-raft-last-contact-high/</guid><description>&lt;p>&lt;code>consul.raft.leader.lastContact&lt;/code> is the predictive signal before a Raft election fires. It measures the elapsed time since the leader last successfully contacted each follower server. When this value rises, a follower is drifting toward the election timeout. Cross that threshold and the follower starts a new election: writes stall, clients see &amp;ldquo;no cluster leader&amp;rdquo; errors, and downstream consumers retry in a thundering herd.&lt;/p>
&lt;p>Most Consul metrics tell you something already broke. lastContact tells you something is about to break. A healthy cluster holds this value in the low tens of milliseconds. Trending above 200ms warrants investigation. Sustaining above 500ms means an election is imminent. The election timeout sits at approximately 1000ms with &lt;code>raft_multiplier&lt;/code> set to 1 (the production recommendation). Higher multipliers raise the timeout proportionally.&lt;/p></description></item><item><title>Consul Raft log divergence: catching a corrupt follower before it wins an election</title><link>https://www.netdata.cloud/guides/consul/consul-raft-log-divergence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-raft-log-divergence/</guid><description>&lt;p>A divergent Consul follower can gossip normally, answer Serf probes, and appear in &lt;code>consul members&lt;/code> as alive while its persisted Raft state is corrupt or inconsistent. The leader replicates to the healthy majority and clients see correct data. The divergence becomes catastrophic only when that follower wins an election and serves state the cluster never agreed on.&lt;/p>
&lt;p>Two failure modes look identical from gossip. Replication lag: a follower falls behind on commit index due to slow disk or degraded network. Raft&amp;rsquo;s Leader Completeness Property prevents a lagging follower from winning, so this is self-correcting once the bottleneck clears. Silent corruption: the follower&amp;rsquo;s log index and term match the leader&amp;rsquo;s, but the entries it applied are wrong. The up-to-date check passes, the follower can win, and the divergence surfaces as incorrect registrations, stale KV, or broken ACL state.&lt;/p></description></item><item><title>Consul registration storm: catalog churn overwhelming Raft</title><link>https://www.netdata.cloud/guides/consul/consul-catalog-churn-registration-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-catalog-churn-registration-storm/</guid><description>&lt;p>The complaint comes in as &amp;ldquo;Consul is slow.&amp;rdquo; DNS lookups lag, service discovery returns stale results, HTTP API writes take longer than usual. The cluster has a leader, gossip is healthy, no node is down. The Raft commit time metric is climbing. The root cause is often hiding in the catalog registration rate.&lt;/p>
&lt;p>Every service registration and deregistration is a Raft write. The leader appends the entry to its log, persists it (fsync), replicates to followers (who also persist), waits for quorum, and applies the entry to the in-memory state store. This is the same pipeline that handles KV writes, health-check state updates, session creation, and ACL operations. When the registration rate is high enough, it saturates the pipeline and every consumer of the consensus layer pays the cost.&lt;/p></description></item><item><title>Consul serf queue backlog: an agent falling behind on gossip</title><link>https://www.netdata.cloud/guides/consul/consul-gossip-queue-backlog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-gossip-queue-backlog/</guid><description>&lt;p>A Consul agent whose &lt;code>consul.serf.queue.Event&lt;/code>, &lt;code>consul.serf.queue.Intent&lt;/code>, or &lt;code>consul.serf.queue.Query&lt;/code> metric stays above zero is no longer keeping up with gossip. In steady state all three should read zero. Transient spikes during bulk joins, leaves, and rolling restarts are expected and self-drain within a few gossip intervals. The problem begins when the spike does not drain.&lt;/p>
&lt;p>Serf&amp;rsquo;s queue depth is the observable proxy for the node&amp;rsquo;s internal health score. A sustained non-zero value means the agent is receiving gossip faster than its event loop can process. Downstream effects start subtle: failure detection latency rises, join and leave intents propagate slowly, and the node&amp;rsquo;s own probe replies arrive late at peers. Then the feedback loop engages.&lt;/p></description></item><item><title>Consul serfHealth check failing: the node-level check behind mass deregistration</title><link>https://www.netdata.cloud/guides/consul/consul-serfhealth-check-failing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-serfhealth-check-failing/</guid><description>&lt;p>Every Consul node carries an automatic health check called &lt;code>serfHealth&lt;/code>. It is not user-defined, it cannot be removed, and it reflects the node&amp;rsquo;s membership in the Serf LAN gossip pool. When this check goes critical, Consul treats the entire node and every service registered on it as unhealthy, regardless of what individual service checks report.&lt;/p>
&lt;p>This is the most commonly misdiagnosed failure in Consul. Operators see a service &amp;ldquo;go down&amp;rdquo; across all instances on a host, investigate the service checks, and find them still passing. The services are fine. The node&amp;rsquo;s gossip membership broke, and &lt;code>serfHealth&lt;/code> cascaded that failure into every service on the node.&lt;/p></description></item><item><title>Consul server in failed state: reading consul members during an incident</title><link>https://www.netdata.cloud/guides/consul/consul-server-failed-in-gossip/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-server-failed-in-gossip/</guid><description>&lt;p>You ran &lt;code>consul members&lt;/code> during an incident and one of your servers shows &lt;code>failed&lt;/code>. Before fixing anything, understand what the status means. Gossip failure and Raft failure are separate subsystems. A server in &lt;code>failed&lt;/code> state is not answering gossip probes, but it may still be a voting Raft peer, or its agent process may still be running but starved of resources.&lt;/p>
&lt;p>The distinction that matters during an incident: gossip health is not Raft health and is not agent health. A node can be alive in gossip yet useless for consensus. A node can show &lt;code>failed&lt;/code> in gossip while its process is still running. These distinctions are the difference between a two-minute diagnosis and a misdiagnosis that makes the incident worse.&lt;/p></description></item><item><title>Consul server memory climbing toward OOM: heap, catalog, and snapshots</title><link>https://www.netdata.cloud/guides/consul/consul-server-memory-growth-oom/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-server-memory-growth-oom/</guid><description>&lt;p>A Consul server&amp;rsquo;s RSS is climbing and OOMKill is close. The cause could be legitimate catalog growth, a goroutine leak, snapshot amplification, or a runtime pathology. Memory growth in Consul usually mixes real state growth, Go runtime behavior, and at least one subsystem leaking.&lt;/p>
&lt;p>Go&amp;rsquo;s garbage collector does not return memory to the OS immediately. RSS of roughly 2x the live heap is normal and is not a leak. What you should investigate is monotonic RSS growth that survives a GC, or live heap (&lt;code>consul.runtime.alloc_bytes&lt;/code>) that does not return to a baseline after a transient event.&lt;/p></description></item><item><title>Consul service has zero healthy instances: discovery returns nothing</title><link>https://www.netdata.cloud/guides/consul/consul-service-zero-healthy-instances/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-service-zero-healthy-instances/</guid><description>&lt;p>A consumer calls &lt;code>/v1/health/service/&amp;lt;name&amp;gt;?passing=true&lt;/code> and gets &lt;code>[]&lt;/code>. DNS lookups for &lt;code>&amp;lt;name&amp;gt;.service.consul&lt;/code> return nothing. Every downstream consumer treats the service as gone. This is total unavailability for that one service, even if the rest of the Consul cluster is healthy.&lt;/p>
&lt;p>Two consumer surfaces are affected at once. API consumers see the empty array directly. DNS consumers (port 8600) get a negative response, and clients may cache it. Recovery from zero means both fixing the checks and flushing the negative caches downstream.&lt;/p></description></item><item><title>Consul session invalidation: distributed locks releasing across the cluster</title><link>https://www.netdata.cloud/guides/consul/consul-session-invalidation-lock-loss/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-session-invalidation-lock-loss/</guid><description>&lt;p>Sessions are Consul&amp;rsquo;s mechanism for binding distributed locks to node and application health. When a session is invalidated, every KV key it holds is acted on according to its &lt;code>Behavior&lt;/code>. With the default &lt;code>release&lt;/code>, the lock holder is cleared and the key&amp;rsquo;s &lt;code>ModifyIndex&lt;/code> increments. With &lt;code>delete&lt;/code>, the key is removed entirely. Every consumer watching that key reacts.&lt;/p>
&lt;p>A spike in session invalidation surfaces as a cluster-wide release of distributed locks. Leader elections fire, caches flush, configuration reloads trigger, and any logic keyed off &lt;code>ModifyIndex&lt;/code> change wakes up. The operator&amp;rsquo;s job is to identify which sessions invalidated, why, and whether the root cause is a single node, a renewal-path failure, or a gossip flap.&lt;/p></description></item><item><title>Consul slow disk causing Raft timeouts: the number-one cause of leader instability</title><link>https://www.netdata.cloud/guides/consul/consul-slow-disk-raft-timeouts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-slow-disk-raft-timeouts/</guid><description>&lt;p>Your Consul cluster is cycling through leaders. Writes fail with &amp;ldquo;no cluster leader&amp;rdquo; errors. The cluster technically has a leader at any given moment, but constant re-elections make writes effectively unavailable. The logs show &lt;code>[WARN] raft: heartbeat timeout reached, starting election&lt;/code> repeating across all servers.&lt;/p>
&lt;p>The root cause is almost always the same: slow disk I/O on the volume backing the Raft data directory. Consul&amp;rsquo;s Raft log store performs an fsync on every appended entry. When the disk cannot complete those syncs quickly enough, heartbeats and commits slow down. Followers miss their heartbeat window and start new elections. The new leader lands on the same slow storage. The cycle repeats.&lt;/p></description></item><item><title>Consul snapshot size growing: state bloat, slow restores, and commit spikes</title><link>https://www.netdata.cloud/guides/consul/consul-snapshot-size-growth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-snapshot-size-growth/</guid><description>&lt;p>Consul snapshots grow with the size of the FSM state: every registered service instance, every health check, every KV entry, every ACL token, every session. None of those individual writes looks expensive, so a team that registers a few new services per week will not see a spike in any single metric. What they get instead is a slow, monotonic climb in snapshot size that compounds across months until one day a snapshot save takes long enough to push Raft commit times past the heartbeat timeout, or a rejoined follower sits in snapshot restore long enough to fall out of the replication loop entirely.&lt;/p></description></item><item><title>Consul stale DNS queries: the agent is answering from cache</title><link>https://www.netdata.cloud/guides/consul/consul-dns-stale-queries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-dns-stale-queries/</guid><description>&lt;p>When &lt;code>consul.dns.stale_queries&lt;/code> climbs, the Consul agent is doing what it was designed to do: keep answering DNS from local state when it cannot get a fresh answer from a server. That behavior has been the DNS default since Consul 0.7. But &amp;ldquo;stale&amp;rdquo; means two very different things depending on how stale, and why.&lt;/p>
&lt;p>A stale answer two seconds old during a leader handoff is harmless availability. A stale answer five minutes old, still pointing at instances that crashed four minutes ago, is silently routing traffic to dead services. The counter alone cannot tell you which case you are in. Correlate it with agent-to-server RPC health, server health, and your consistency configuration.&lt;/p></description></item><item><title>Consul stale Raft peer: removing a failed server from the configuration</title><link>https://www.netdata.cloud/guides/consul/consul-remove-failed-raft-peer/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-remove-failed-raft-peer/</guid><description>&lt;p>A Consul server has crashed, been decommissioned, or been replaced, but its entry still sits in the Raft configuration as a voting peer. Serf gossip already marks the node &lt;code>failed&lt;/code> or &lt;code>left&lt;/code>, yet &lt;code>GET /v1/operator/raft/configuration&lt;/code> still lists it as a voter. The dead peer keeps counting toward quorum even though it will never cast another vote.&lt;/p>
&lt;p>This is not always an emergency. A healthy cluster with autopilot enabled usually self-heals within tens of seconds. It becomes an emergency when autopilot is disabled, when the cleanup window has not elapsed, or when a second failure tips the cluster below the now-inflated quorum threshold.&lt;/p></description></item><item><title>Consul TLS not fully enforced: verify_incoming, verify_outgoing, and server hostname</title><link>https://www.netdata.cloud/guides/consul/consul-tls-verify-not-enforced/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-tls-verify-not-enforced/</guid><description>&lt;p>You have CA, certificate, and key files configured for Consul. The agent starts without errors, health checks pass, services register, DNS resolves. But the cluster may still accept plaintext or unauthenticated connections because &lt;code>verify_incoming&lt;/code>, &lt;code>verify_outgoing&lt;/code>, or &lt;code>verify_server_hostname&lt;/code> are missing, set to false, or placed in the wrong configuration stanza.&lt;/p>
&lt;p>Certificate files (&lt;code>ca_file&lt;/code>, &lt;code>cert_file&lt;/code>, &lt;code>key_file&lt;/code>) do not enforce TLS on their own. Consul requires explicit verification flags to reject plaintext connections and require client certificates. Without them, any network observer between agents and servers can read the catalog, KV values, and health check results, and any process that can reach the RPC port can impersonate a Consul agent.&lt;/p></description></item><item><title>Consul WAN federation down: a datacenter missing from the WAN pool</title><link>https://www.netdata.cloud/guides/consul/consul-wan-federation-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-wan-federation-down/</guid><description>&lt;p>When an entire remote datacenter&amp;rsquo;s servers vanish from the WAN gossip pool, the symptom is usually downstream: cross-DC service lookups return empty results, prepared queries that failover across DCs stop working, and ACL or Connect CA replication between datacenters silently stalls. The Consul UI on the local DC may still look healthy because the local cluster is fine. The damage is in the federation layer.&lt;/p>
&lt;p>The canonical diagnostic signal is &lt;code>consul members -wan&lt;/code>. On any server in any federated DC, this should list every server in every federated DC. When a whole DC&amp;rsquo;s server rows are missing or stuck in &lt;code>failed&lt;/code> state, WAN federation for that DC is broken. The equivalent API call is &lt;code>/v1/agent/members?wan=true&lt;/code>.&lt;/p></description></item><item><title>Consul WAN link saturation: cross-DC latency triggering gossip suspicion</title><link>https://www.netdata.cloud/guides/consul/consul-wan-link-saturation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-wan-link-saturation/</guid><description>&lt;p>Remote datacenter servers start oscillating between alive and suspect in the WAN gossip pool. Cross-DC RPCs fail with &amp;ldquo;no path to datacenter&amp;rdquo; errors. ACL replication lag in secondary DCs climbs into seconds. Cross-DC prepared queries time out. LAN Consul signals look fine, but the federation is broken.&lt;/p>
&lt;p>The usual cause is WAN link saturation. Consul&amp;rsquo;s WAN gossip pool uses a separate, more conservative set of timing defaults than LAN, but it is still vulnerable to high or spiking RTT. When the inter-DC link saturates, gossip probes time out, remote servers are marked suspect then failed, and WAN membership flaps. Each flap disrupts cross-DC RPC routing, which compounds the problem because RPC retries add traffic to the already-saturated link.&lt;/p></description></item><item><title>Consul xDS stream churn: Envoy sidecars running on stale configuration</title><link>https://www.netdata.cloud/guides/consul/consul-xds-stream-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-xds-stream-errors/</guid><description>&lt;p>Each Envoy sidecar in a Consul Connect mesh holds a long-lived gRPC xDS stream to a Consul server. That stream is the control plane: endpoint lists, intentions, and mTLS certificate rotations all flow across it. When the stream is healthy, the data plane converges within seconds of a catalog change. When it breaks or churns, the sidecar falls back to whatever Envoy cached last.&lt;/p>
&lt;p>The dangerous part is not the disconnect. Envoy keeps its last-known-good configuration when the management server disappears. Traffic flows, health checks pass, and nothing in the data plane alarms. What you get is silent staleness: routes to endpoints removed minutes ago, certificates that have already rotated on the server, intentions that no longer match policy. The first visible symptom is usually a customer-facing incident, not a Consul alert.&lt;/p></description></item><item><title>How Consul actually works in production: a mental model for operators</title><link>https://www.netdata.cloud/guides/consul/consul-how-it-works-in-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/consul/consul-how-it-works-in-production/</guid><description>&lt;p>Most Consul incidents are debugged with the wrong mental model. Operators check &lt;code>consul members&lt;/code>, see all nodes alive, conclude the cluster is healthy, and miss that Raft has no leader or that the catalog is stale by minutes. Consul runs three concurrent subsystems with different failure modes, signals, and consistency guarantees. Most monitoring collapses them into one &amp;ldquo;is Consul up?&amp;rdquo; check.&lt;/p>
&lt;p>The three subsystems are Raft consensus (the brain), Serf gossip (the nervous system), and the catalog plus anti-entropy (the truth). With Connect enabled, a fourth layer adds a certificate authority, xDS configuration distribution, and intention enforcement. Each operates independently, and understanding that independence is the single most important thing an operator can learn.&lt;/p></description></item></channel></rss>