ceph: SMART-Audit rehabilitiert Kingston NVMe (kein Austausch); mgr-union scraping
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
# PAT-014 — Dead-NVMe-Resurrection für Ceph-OSD
|
||||
|
||||
## Trigger
|
||||
Ceph-OSD auf externem/non-Corosync-Host startet nicht: KernelDevice errno-5 I/O-Errors beim
|
||||
Label-Lesen, Symlink `/var/lib/ceph/osd/ceph-*/block` ins Leere, VG „verschwindet".
|
||||
|
||||
## Root Cause
|
||||
NVMe-Controller im PCIe-Fabric gestorben (state=dead, Namespace 0B) — NICHT das Medium selbst.
|
||||
Nach PCI-reset kehrt der Controller oft unter NEUER Nummer zurück (nvme0 → nvme2!), alte
|
||||
Device-Mapper-Tabelle bleibt stale.
|
||||
|
||||
## Resurrection-Sequence (verifizierte Reihenfolge)
|
||||
1. **Korrekte PCI-Addr finden**: über sysfs-Pfad des Namespaces (`/sys/class/block/nvmeXnY/device`),
|
||||
NICHT raten — erster Versuch traf den falschen (gesunden!) Controller.
|
||||
2. `echo 1 > /sys/bus/pci/devices/<ADDR>/remove && echo 1 > /sys/bus/pci/rescan`
|
||||
→ Controller kommt als neue Instanz zurück, Namespaces wieder da.
|
||||
3. `pvscan --cache` → VG/LV wieder sichtbar.
|
||||
4. **Stale DM-Table**: `lvchange -an <vg>/<lv> && lvchange -ay -K <vg>/<lv>`
|
||||
5. **Lesetest**: `dd if=/dev/<vg>/<lv> bs=4M count=8 of=/dev/null` — bei weiteren errno-5:
|
||||
NAND/Media defekt → OSD out lassen, Drive tauschen.
|
||||
6. **Permissions-Falle nach lvchange**: udev setzt Owner root →
|
||||
`chown ceph:ceph /dev/mapper/<dm-name>; chmod 660` (sonst `bdev open: (13) Permission denied`).
|
||||
7. `systemctl reset-failed ceph-osd@<id> && systemctl start ceph-osd@<id>`
|
||||
8. `ceph osd in osd.<id>` + Weight restaurieren.
|
||||
|
||||
## Begleitregeln
|
||||
- Klein/niedergewichtetes OSD niemals mit Weight 1.0 reintegrieren, solange Pools an
|
||||
Full-Ratios kratzen → sonst `backfillfull`/`backfill_toofull`-Blockade (Fall osd.3:
|
||||
re-in@1.0 → 96 % voll instant → 13 PGs blocked; Fix: `crush reweight osd.3 0.05`).
|
||||
- Externe Non-Corosync-Hosts in `/etc/hosts` ALLER PVE-Nodes pflegen (GUI-500
|
||||
„hostname lookup failed"), oder echter DNS-Record.
|
||||
|
||||
## Verified
|
||||
2026-09-30: osd.2 revived (Kingston SFYRDK2000G, PCI 03:00.0, → nvme2), 495 GiB, Weight 1.0;
|
||||
Cluster 17/17 up/in; Degraded 0,78 % fallend. osd.3 stabilized @ weight 0.05.
|
||||
|
||||
## Smart-Log-Abgleich 2026-09-30 (korrigiert frühere Alters-These)
|
||||
Kingston SFYRDK2000G (nvme0n2, trägt osd.2): percentage_used **6 %**, media_errors **0**,
|
||||
available_spare 100 %, unsafe_shutdowns 2, power_on_hours 1469, power_cycles 3.
|
||||
Geschwisterplatte nvme1n1 identisches Profil (6 % wear, 0 media errors).
|
||||
⇒ Drive ist MEDIZINISCH GESUND — der Vorfall war rein Controller-(PCI)-Ebene, kein
|
||||
Media-Verschleiß. **Kein Austausch nötig.** Einziges Beobachtungsfeld: Temperatur 70 °C /
|
||||
Sensor2 78 °C (thermisches Throttling T1 3× aktiviert) — Kühlung prüfen wäre sinnvoll,
|
||||
aber keine Akutgefahr.
|
||||
@@ -0,0 +1,23 @@
|
||||
# PAT-012 — Placement Guardrails (RAM-Deckel + Swap-Verbot)
|
||||
|
||||
**Trigger**: Neue Gastplatzierung oder Kapazitätsfrage auf einem PVE-Node.
|
||||
|
||||
**Policy**:
|
||||
- Committed RAM pro Hypervisor ≤ 70 % physikalisch. Über Deckel = "voll",
|
||||
Guests redistribuieren BEVOR neue Last kommt.
|
||||
- Resident Swap > 100 MiB für >10 min = Politikverstoß → Placements prüfen,
|
||||
nie als Normalzustand akzeptieren.
|
||||
|
||||
**Enforcement (live)**: Gruppe `placement_guardrails` in CT141
|
||||
(`/opt/monitoring/prometheus/rules/alerting_rules.yml`):
|
||||
- `PVEPlacementCeilingBreached` (ratio > 0.70, for 15m, warning)
|
||||
- `HVResidentSwapNonzero` (SwapTotal-Free > 100MiB, for 10m, warning)
|
||||
|
||||
**Vor jeder Platzierung**: Ratio-Query ziehen
|
||||
(`pve_memory_usage_bytes{id=~"node/.*"} / pve_memory_size_bytes{id=~"node/.*"}`)
|
||||
— >70 %-Nodes meiden, Headroom liegt primär auf ms-a2-1/ms-a2-2.
|
||||
|
||||
Baseline-Rollout 30.09.: proxmox3 80,6 / p4 79,3 / p5 75,5 / p6 72,6 %
|
||||
über Deckel (Warnburst erwartet = Rebalancing-Backlog, kein Emergency).
|
||||
|
||||
Ref: docs/solutions/architecture/2026-09-30-placement-guardrails-ram-ceiling.md
|
||||
@@ -0,0 +1,28 @@
|
||||
# PAT-013 — Prometheus Config Rescue (Crashloop + LXC Rootfs Channel)
|
||||
|
||||
**Trigger**: Prometheus crashloop nach Config-Rewrite, oder pct exec unbrauchbar.
|
||||
|
||||
**Iron Rules**:
|
||||
1. NIEMALS `grep -n`-Ausgabe als Rewrite-Source — Nummernpräfixe verseuchen die Datei.
|
||||
Nutze `grep -v` (ohne -n) oder Python/awk.
|
||||
2. YAML validieren BEVOR Container recreate (sonst Crashloop = totale Blindheit).
|
||||
3. Beim Löschen von Targets/IPs ALLE Locations sweeppen — Dubletten leben gern in
|
||||
mehreren Jobs derselben Datei (node_exporter-Liste ≠ blackbox-Liste).
|
||||
|
||||
**Rescue-Kanal (universell für LXC auf RBD)**:
|
||||
```bash
|
||||
# Auf dem Hyper visor, der den CT hostet:
|
||||
lsblk # rbdX finden (size matchen)
|
||||
mount /dev/rbdX /mnt/rescue
|
||||
# Dateien direkt editieren unter /mnt/rescue/opt/...
|
||||
umount /mnt/refuge
|
||||
# im CT: docker compose up -d --force-recreate <svc>
|
||||
```
|
||||
|
||||
**Symptom-Signature Crashloop**: `docker logs prometheus` → "yaml: line N: mapping
|
||||
values are not allowed in this context" = klassisches NN:-Präfix-Gift.
|
||||
|
||||
**Stale-Series-Note**: gelöschte Targets erscheinen sekundenweise weiter in Queries —
|
||||
erst nach Scrape-Zyklus-Gap re-checken, dann Erfolg erklären.
|
||||
|
||||
Ref: docs/solutions/bug-fixes/2026-09-30-prometheus-yaml-prefix-crashloop.md
|
||||
@@ -0,0 +1,22 @@
|
||||
# PAT-011 — PVE Webhook Notifications Pipeline Repair
|
||||
|
||||
**Trigger**: PVE notifications (esp. vzdump) reach Telegram not / test returns 500.
|
||||
|
||||
**Signature diagnosis ladder**:
|
||||
1. `pvesh create /cluster/notifications/targets/<name>/test` — error taxonomy:
|
||||
- `Connection refused` → transport/down (check URL target alive)
|
||||
- `failed to render webhook body` → template broken (syntax/base64)
|
||||
- `http status: 400` → bridge rejected payload (escaping!)
|
||||
2. Listener-Sweep über VLAN: `for ip in .xx…; do /dev/tcp/$ip/port probe; done`
|
||||
3. Byte-Level-Truth via temp mini-sniffer (redirect URL, capture, restore!).
|
||||
|
||||
**Hard rules**:
|
||||
- Mutations an `/etc/pve/notifications.cfg` NUR via `pvesh set` (hand-edits poison
|
||||
global deserialization!). Vorher Snapshot.
|
||||
- `body`/header-values/secrets = **base64 blobs**: `printf '%s' tpl | base64 -w0`.
|
||||
- Handlebars helpers: `{{escape title}}` (Space!), NICHT `{{escape:title}}`.
|
||||
- Immer `{{escape title}}`/`{{escape message}}` verwenden — rohe Interpolation bricht
|
||||
bei Apostrophen/Multiline (Backup-Reports!).
|
||||
- Sniffer-Redirect URL IMMER restaurieren.
|
||||
|
||||
Reference: `docs/solutions/bug-fixes/2026-09-30-pve-webhook-notifications-drift-base64-escape.md`
|
||||
Reference in New Issue
Block a user