Logo

Personal Ops Runbook

Personal runbook covering infrastructure operations for Cloud, Kubernetes, OpenStack, and Ceph environments. Includes deployment and teardown procedures, node management, cluster monitoring setup, and incident response workflows compiled from day-to-day operational work. Intended strictly for personal reference — configurations and scripts are environment-specific and not guaranteed to work as-is elsewhere.

Runbook: ceph-exporter mất metric (container Up nhưng không export perf counter)

Phạm vi: Cluster Ceph deploy bằng cephadm/ceph orch, ceph-exporter port 9926 Mức độ: Trung bình — không ảnh hưởng data path, nhưng làm mù hệ thống giám sát OSD/daemon trên host bị lỗi Cập nhật lần cuối: 2026-08 (case VSTOR-HAN02, node OSD-21/22/23/25/71/72/73)


1. Triệu chứng

  • Grafana/Prometheus thiếu metric ceph_bluestore_*, ceph_osd_*... của toàn bộ daemon trên một số host, trong khi host khác vẫn đầy đủ.
  • ceph orch ps --daemon-type ceph-exporter báo running, container podman ps báo Up bình thường → trạng thái Up không đồng nghĩa exporter hoạt động.
  • Prometheus target vẫn có thể UP (exporter trả lời HTTP) nhưng nội dung rỗng.

2. Nhận diện nhanh (5 phút)

Bước 1 — Quét số metric từng host (chạy từ MON):

for h in $(ceph orch ps --daemon-type ceph-exporter -f json \
  | python3 -c "import json,sys; print(' '.join(d['hostname'] for d in json.load(sys.stdin)))"); do
  echo -n "$h: "
  curl -s --connect-timeout 3 $h:9926/metrics | grep -c "^ceph_"
done

Đọc kết quả:

Kết quả Ý nghĩa Đi tới
Vài nghìn dòng Bình thường
1 (chỉ có ceph_exporter_scrape_time) Exporter "mù" — không thấy admin socket Mục 3
0 Không kết nối được — exporter chết hoặc firewall Mục 4

Dấu hiệu phụ trợ: cột MEM USE trong ceph orch ps — exporter khỏe thường ăn ~30M+ (scrape thật), exporter mù chỉ ~8M. scrape_time < 0.01s cũng là dấu hiệu mù (scrape thật trên host nhiều OSD mất lâu hơn nhiều).

3. Bệnh 1: Exporter mù (trả về 1 metric)

3.1 Nguyên nhân gốc

File unit.run của daemon (sinh một lần duy nhất lúc deploy, KHÔNG tự cập nhật khi upgrade cluster) bị thiếu dòng bind mount thư mục admin socket:

-v /var/run/ceph/<fsid>:/var/run/ceph:z

Không có mount này, bên trong container đường dẫn /var/run/ceph chỉ là thư mục overlay rỗng — exporter chạy với --sock-dir=/var/run/ceph/ nhưng không thấy socket .asok nào của OSD/daemon → chỉ export đúng metric về chính nó.

Vì unit.run "đóng băng" theo thời điểm deploy, lỗi tồn tại âm thầm hàng tháng/năm: restart container không sửa được (systemd chạy lại đúng file unit.run lỗi).

3.2 Xác nhận chẩn đoán

# (a) Trong container có thấy socket không? (kỳ vọng: node bệnh chỉ có socket của chính exporter)
podman exec ceph-<fsid>-ceph-exporter-$(hostname) ls -la /var/run/ceph/

# (b) unit.run có dòng mount không? (kỳ vọng: node bệnh KHÔNG có)
grep -o '\-v [^ ]*run/ceph[^ ]*' /var/lib/ceph/<fsid>/ceph-exporter.$(hostname)/unit.run

# (c) Đối chứng với một host khỏe — phải thấy:
# -v /var/run/ceph/<fsid>:/var/run/ceph:z

Ghi chú: hậu tố :z là SELinux relabel option (shared), vô nghĩa trên Ubuntu/AppArmor — điểm khác biệt cần soi là có hay không cả dòng mount, không phải đuôi :z.

3.3 Fix

Restart KHÔNG đủ. Phải redeploy để cephadm regenerate unit.run:

# Thử 1 node trước
ceph orch daemon redeploy ceph-exporter.<HOSTNAME>
sleep 90

# Verify 3 tầng
grep -o '\-v [^ ]*run/ceph[^ ]*' /var/lib/ceph/<fsid>/ceph-exporter.<HOSTNAME>/unit.run   # phải có mount
curl -s localhost:9926/metrics | grep -c "^ceph_"                                          # kỳ vọng nghìn+
curl -s localhost:9926/metrics | grep ceph_daemon_socket_up | head                          # các daemon = 1

# OK thì redeploy hàng loạt các host bệnh còn lại
for h in <HOST1> <HOST2> ...; do ceph orch daemon redeploy ceph-exporter.$h; done

Redeploy exporter an toàn tuyệt đối với data path — không ảnh hưởng OSD/MON/client IO.

Nếu redeploy xong unit.run vẫn thiếu mount → escalate: so sánh version cephadm mgr đang dùng, kiểm tra Ceph tracker, thu thập unit.run của node khỏe + bệnh để đối chiếu.

4. Bệnh 2: Không kết nối được port 9926 (trả về 0)

Đây là bệnh khác, thường ở tầng mạng. Phân xử trên chính host bệnh:

curl -s localhost:9926/metrics | grep -c "^ceph_"   # localhost có metric không?
ss -tlnp | grep 9926                                 # exporter có listen 0.0.0.0 không?
localhost ss listen Kết luận Xử lý
Có metric Firewall chặn giữa Prometheus/MON và host Mở port 9926 (iptables/nft/security group); hay gặp với batch host mới khác VLAN
1 metric Host bị cả 2 bệnh — mù + firewall Redeploy (mục 3) VÀ mở firewall
Không trả lời Không Exporter process chết trong container podman logs exporter, rồi redeploy

Lưu ý case thực tế: node 71/72/73 (batch NVMe mới) dính đồng thời cả 2 bệnh — sau redeploy nhớ test lại từ MON, không chỉ localhost.

5. Phòng ngừa & phát hiện sớm

5.1 Alert canh exporter mù

Exporter khỏe luôn export ceph_daemon_socket_up{ceph_daemon=..., hostname=...} cho từng daemon local. Exporter mù không có metric này:

# Exporter target UP nhưng không báo cáo daemon nào → mù
- alert: CephExporterBlind
  expr: |
    (up{job="ceph-exporter"} == 1)
    unless on(instance) (count by (instance) (ceph_daemon_socket_up) > 0)
  for: 15m
  labels: {severity: warning}
  annotations:
    summary: "ceph-exporter trên {{ $labels.instance }} đang chạy nhưng không scrape được daemon nào (nghi thiếu mount /var/run/ceph  xem runbook)"

# Daemon có socket nhưng không phản hồi
- alert: CephDaemonSocketDown
  expr: ceph_daemon_socket_up == 0
  for: 10m
  labels: {severity: warning}

5.2 Checklist sau các sự kiện vận hành

Chạy lệnh quét ở Mục 2 sau khi:

  • [ ] Add host mới vào cluster (kiểm tra cả metric lẫn kết nối port 9926 xuyên VLAN)
  • [ ] Upgrade cluster (unit.run của daemon cũ KHÔNG được regenerate — cân nhắc redeploy exporter toàn bộ sau major upgrade)
  • [ ] Redeploy/reconfig hàng loạt daemon

5.3 Bài học từ case gốc

Lỗi tồn tại 13+ tháng không bị phát hiện vì mọi tín hiệu bề mặt đều xanh (container Up, orch ps running, Prometheus target UP). Chỉ lộ ra khi cần đối chiếu perf counter giữa các OSD trong một cuộc điều tra slow ops. Đừng tin "Up" — hãy đo nội dung endpoint.


Phụ lục: Tham chiếu nhanh

# Số metric mỗi host           → mục 2
curl -s <host>:9926/metrics | grep -c "^ceph_"

# Socket trong container       → 3.2a
podman exec ceph-<fsid>-ceph-exporter-$(hostname) ls /var/run/ceph/

# Mount trong unit.run         → 3.2b
grep -o '\-v [^ ]*run/ceph[^ ]*' /var/lib/ceph/<fsid>/ceph-exporter.$(hostname)/unit.run

# Fix                          → 3.3
ceph orch daemon redeploy ceph-exporter.<HOSTNAME>

Từ khóa tra cứu: ceph-exporter, 9926, scrape_time, unit.run, bind mount, /var/run/ceph, asok, blind exporter, cephadm redeploy