Skip to content
- Agent pod
CrashLoopBackOff on lvmthin: partition or disk
missing, or dm_thin_pool not loaded. Check
kubectl logs -n miroir-system -l app.kubernetes.io/component=agent
and lsmod | grep dm_thin on the node. On a multi-pool node the
agent only exits when every pool fails setup; a single bad pool is
logged and quarantined (its volumes error, the other pools keep
serving) and shows up in the MiroirNode status as a per-pool
message.
- Agent pod
CrashLoopBackOff on loopfile: baseDir isn’t
reflink-capable. The agent refuses to start (single-pool node) so
the failure shows up immediately.
- Agent pod
CrashLoopBackOff after a node change: the DRBD
kernel module may be below the agent’s floor
(see Requirements); the agent refuses to start
rather than render options the module rejects. The agent log names
the probed version and the floor.
- PVC stays
Pending: every node with a MiroirNode is missing
or full. kubectl describe pvc shows the controller’s reason.
- Replicated volume stuck in
Degraded: one leg isn’t
UpToDate. kubectl describe miroirvolume <name> shows per-node
status; usually a transient DRBD sync. If it outlasts the sync, with
the Inconsistent leg parked WFBitMapT (or Established) toward
an UpToDate peer and zero out-of-sync on both sides, DRBD 9.3.4
ended the resync on the source without the target noticing
(LINBIT/drbd#148; seen
after a rolling node upgrade with a diskless Primary writing in
#576). The
Inconsistent leg’s agent cycles the connection within a couple of
poll cycles and emits StuckResyncRecovered, forcing the disconnect
if a read-only opener pins the device (the kernel refuses a graceful
one with Need access to UpToDate data); the re-run handshake starts
the resync. The agent holds off while a Primary exists that this leg
cannot see: that is an ordinary unstable resync, which DRBD re-runs
itself once the Primary is back in view.
- Replicated volume stuck
Connecting, no split-brain: a
host-network tenant (commonly the Ceph mgr dashboard) occupies the
DRBD replication port; dmesg shows
Failed to initiate connection, err=-98. Set drbd.portBase (e.g.
7100) to move miroir’s range; existing volumes keep their ports.
Full forensics in
#148.
The same err=-98 with no fixed tenant on the port means the range
overlaps the kernel’s ephemeral ports (net.ipv4.ip_local_port_range
widened to start below drbd.portBase): any outbound host-network
socket can then hold a replication port, and the peer parks
StandAlone until the next drbdadm adjust (issue
#501). Either
keep the ephemeral range above miroir’s ports or reserve them with
net.ipv4.ip_local_reserved_ports.
MiroirVolumeOutOfSync firing while everything reads healthy:
out-of-sync bits toward a peer with no resync draining them. With the
connection Connected and both disks UpToDate, this is one of two
things. A stale bitmap — bits stranded by a refused clear during peer
teardown, left on a newly promoted Primary toward a Secondary after a
failover, left between two Secondaries after a connectivity blip while
the Primary stays clean toward both, or a resync DRBD armed and
abandoned after a rapid promote/demote — is detected and self-healed
as long as the volume has a live Primary: the agent cycles the
affected peer connection within a couple of poll cycles and emits a
StuckResyncRecovered event; the re-run handshake discards the bitmap
(identical data moves nothing) or starts the resync it called for. A
drbdadm verify finding (lastVerifyOutOfSyncBytes non-zero in the
coordinator’s status slot, VerifyOutOfSync event) is a
genuine data difference and is deliberately left manual — auto-resyncing
would destroy the evidence of which leg was wrong. The same hold applies
while a verify is in flight (verifyStartedAt set on the coordinator’s
slot until its result is recorded), since the kernel may already hold
findings no status field accounts for. Inspect first, then
find the affected peer with
drbdsetup status <res> --verbose --statistics on the alerting node
(the connection whose out-of-sync is non-zero) and cycle it:
drbdsetup disconnect <res> <peer-node-id> followed by
drbdsetup connect <res> <peer-node-id> resyncs the flagged blocks
from the UpToDate side.
- Resync activity on every kopiur backup: kopiur’s staged PVC
inherits the source PVC’s StorageClass, so a replicated volume gets
a replicated (and therefore syncing) staging volume once per backup
cycle. Point
spec.staging.storageClassName at a replicas: "1"
class naming the same pool, per
Stage kopiur backups unreplicated.
- RWX
MiroirVolume stuck deleting, Device is held open: a
still-running gateway is the live opener. The controller scales the
share Deployment to zero itself when the volume is deleted, so check
kubectl get deploy -n miroir-system miroir-share-<volume> first. If
it is still at 1 replica (controller not running, or a release from
before it did this), scale it to zero or delete it so the agent’s
teardown finalizer can finish. If it is already at 0 but the gateway
pod stays Terminating, the pod is wedged on the device itself and
the Deployment is no longer the lever: inspect the DRBD resource on
that node as for a stuck RWO volume. See
ReadWriteMany (RWX).