Skip to main content
RunBook Academy

LinuxLXIII · Cluster Time, DNS and Identity DependenciesDependency mapping

Mapping cluster dependencies - finding what you depend on

Advanced⏱ ~13 minsssystemdchrony

What you'll learn

  • Discover external dependencies from the running system
  • Classify a dependency as hard, soft or bootstrap-only
  • Record the blast radius and time-to-impact of each dependency
  • Identify dependencies that are shared by every node

Prerequisites

Verified against Ubuntu 24.04 LTS · Debian 12 (Bookworm) · RHEL 9.x · Rocky Linux 9.x · AlmaLinux 9.x · Linux kernel 6.1 LTS / 6.6 LTS · systemd 255+ · OpenSSH 8.7p1 (RHEL 9) / 9.6p1 (Ubuntu 24.04) · nftables 1.0.x · chrony 4.x · Pacemaker 2.1.x · Corosync 3.1.x · 2026-08-11

Not yet marked complete on this device.

The previous three lessons each took one dependency and showed what its failure does. This one asks the prior question: how do you know what your cluster depends on at all?

The answer is not “ask the team”. A cluster acquires dependencies through package defaults, PAM stacks, resource agents and someone’s convenient hostname, and none of those get written down. They have to be read off the running system.

A cluster removes internal single points of failure and adds external ones

That is the trade the design made, whether or not anyone said it out loud. Three nodes means no single node failure takes the service down. It also means three machines that all resolve the same names, trust the same CA, authenticate against the same directory, and get their time from the same source.

The internal redundancy is visible and celebrated. The external dependencies are invisible until one of them fails on all three nodes in the same second - at which point the diagnosis is linux-failure-cluster-and-dependencies, and the lesson is that simultaneity was the clue.

Discovering them from the running system

Six places, each of which reliably hides something.

1. What the node is actually talking to

The most honest inventory is the set of connections the node holds in steady state:

Read-only / Safeevery peer here is a dependency somebody has to own
# ss -tunp state established
Netid Recv-Q Send-Q  Local Address:Port    Peer Address:Port  Process
tcp        0      0  192.0.2.11:41022      192.0.2.30:389     users:(("sssd_be",pid=1188,fd=17))
tcp        0      0  192.0.2.11:55310      192.0.2.40:3260    users:(("iscsid",pid=901,fd=9))
tcp        0      0  192.0.2.11:39944      203.0.113.9:443    users:(("rsyslogd",pid=1042,fd=8))
udp        0      0  192.0.2.11:123        192.0.2.20:123     users:(("chronyd",pid=812,fd=6))

Illustrative output

Run it on every node, over a full day, and compare. Connections that appear only during the backup window or only at certificate renewal time are exactly the ones missing from the documentation.

2. Name resolution and identity

# Which sources answer which lookups
grep -E '^(hosts|passwd|group|shadow|netgroup):' /etc/nsswitch.conf

# Where DNS actually goes
resolvectl status || cat /etc/resolv.conf

# How the cluster resolves its own peers - the critical one
getent hosts node1 node2 node3

If getent hosts for a peer answers from DNS rather than from /etc/hosts, cluster membership depends on DNS. That is a finding, and linux-dns-cluster-failure-impact explains what it costs.

3. Time

chronyc sources
chronyc tracking

Note whether every node points at the same single upstream. A shared time source is a shared dependency, and one that fails by drifting rather than by stopping - which is worse, because nothing alerts.

4. What systemd thinks has to exist first

# What must be running before this unit
systemctl list-dependencies --after pacemaker.service

# What breaks if this unit fails
systemctl list-dependencies --reverse corosync.service

Ordering directives encode dependencies that nobody documented elsewhere. A unit with After=nss-lookup.target is telling you it expects name resolution to work.

5. What the cluster configuration names

# Peer addresses or names in corosync
sudo corosync-cmapctl | grep nodelist

# Hostnames, URLs and paths embedded in resource agents
sudo pcs resource config
sudo pcs stonith config

Fence devices are the ones people forget. A fence_ipmilan pointing at a BMC hostname makes fencing - the last line of defence against corruption - depend on DNS.

6. Certificates and their chains

# Expiry of everything in a directory
for f in /etc/pki/tls/certs/*.crt; do
  printf '%s: ' "$f"; openssl x509 -noout -enddate -in "$f"
done

A certificate is a dependency on a CA, on a renewal process, and on a clock. All three can fail independently.

Classifying what you find

Three classes, and the class determines what you do about it:

ClassDefinitionExample
HardThe service stops when it is goneThe shared LUN; the fence device path
SoftThe service degrades but continuesCentral log shipping; the metrics endpoint
Bootstrap-onlyNeeded to start, not to keep runningThe package repository; the config management server

The bootstrap class is where the surprises live. A dependency that is only needed at start is invisible during normal operation and absolutely required during a recovery - which is the moment you are most likely to be missing it. A cluster that cannot form without its config management server is a cluster that cannot be rebuilt during that server’s outage.

Recording it

The output of this exercise is a register with one row per dependency, and four columns that make it actionable:

DependencyClassTime to impactBlast radius
DNS (192.0.2.53)Hard for fencing, soft for peers (/etc/hosts)Immediate for fencingAll nodes
NTP (192.0.2.20)Soft, hard after ~5 min skewMinutes to hoursAll nodes
LDAP (192.0.2.30)Soft while cached, hard after cache expiryCache lifetimeOperator login on all nodes
Shared LUNHardImmediateAll nodes
BMC networkHard for recovery onlyAt next fenceFencing everywhere
Package repoBootstrap-onlyAt next rebuildRebuilds and patching

Time to impact is the column that earns its place. It converts a list into a priority order: anything with immediate impact and a fleet-wide blast radius is where redundancy or removal is worth paying for, and anything measured in days can wait.

Blast radius answers the question that matters during an incident. A dependency listed as “all nodes” is one whose failure will not look like a dependency failure at all - it will look like the cluster died.

Two things to look for specifically

Shared fate. A dependency hosted on the cluster that depends on it. The DNS server running as a cluster resource, the certificate authority on a node, the config management server that manages itself. These work perfectly until a cold start, when nothing can begin because everything is waiting for something else. Circular dependencies are covered in linux-designing-around-dependency-failures.

Single instances behind a name. A resolver, an NTP server or an LDAP host that looks redundant because it is reached by a hostname, and resolves to one address. The name creates an impression of abstraction that the deployment does not have. getent hosts and chronyc sources settle it in one command each.

Knowledge check

Knowledge check · 5 questions

  1. Q1. What is the most reliable way to discover what a cluster node depends on?

  2. Q2. A dependency classified as soft can still cause an outage if it stays unavailable long enough.

  3. Q3. Which findings would make cluster membership or recovery depend on DNS? Select all that apply.

  4. Q4. Why does the bootstrap-only class deserve particular attention?

  5. Q5. Running the dependency discovery on all three nodes produces different results on node3: a different resolver and an extra established connection nobody recognises. What have you found?

Passing score: 75%. Answers are checked in this browser.