아! 컨테이너 기반 또는 cephadm 배포군요!
ceph 명령어는 작동하지만 systemctl에 서비스가 없다면 컨테이너 기반 배포입니다.
# Ceph 배포 방식 확인
ceph orch host ls 2>/dev/null && echo "CEPHADM 배포"
kubectl get pods -n rook-ceph 2>/dev/null && echo "ROOK 배포"
docker ps | grep ceph && echo "DOCKER 배포"
podman ps | grep ceph && echo "PODMAN 배포"
# 실행 중인 ceph 프로세스 확인
ps aux | grep -E "ceph-mon|ceph-osd|ceph-mgr" | grep -v grep
# OSD 재시작
ceph orch daemon restart osd.0
ceph orch daemon restart osd.1
ceph orch daemon restart osd.2
# MON 재시작
ceph orch daemon restart mon.$(hostname)
# MGR 재시작
ceph orch daemon restart mgr.$(hostname)
# 모든 데몬 상태 확인
ceph orch ps
# Ceph 컨테이너 확인
docker ps | grep ceph
# OSD 컨테이너 재시작
docker restart $(docker ps | grep ceph-osd | awk '{print $1}')
# MON 컨테이너 재시작
docker restart $(docker ps | grep ceph-mon | awk '{print $1}')
# 메모리 제한으로 컨테이너 재시작
docker update --memory=2g $(docker ps | grep ceph-osd | awk '{print $1}')
# Ceph pods 확인
kubectl get pods -n rook-ceph
# OSD Pod 재시작
kubectl delete pod -n rook-ceph $(kubectl get pods -n rook-ceph | grep osd | awk '{print $1}')
# MON Pod 재시작
kubectl delete pod -n rook-ceph $(kubectl get pods -n rook-ceph | grep mon | awk '{print $1}')
# 메모리 리소스 확인
kubectl describe pod -n rook-ceph $(kubectl get pods -n rook-ceph | grep osd | head -1 | awk '{print $1}')
# 즉시 캐시 정리
sync
echo 3 > /proc/sys/vm/drop_caches
# 메모리 상태 확인
free -h
# 큰 메모리 사용 프로세스 찾기
ps aux --sort=-%mem | head -10
# cgroup 메모리 확인
find /sys/fs/cgroup -name "memory.failcnt" -exec cat {} \; 2>/dev/null | sort -nr | head -5
# OSD 메모리 사용량 줄이기
ceph config set osd osd_memory_target 1073741824 # 1GB로 줄임
ceph config set osd bluestore_cache_size 536870912 # 512MB 캐시
# 복구/백필 작업 일시 중단 (메모리 절약)
ceph osd set norecover
ceph osd set nobackfill
ceph osd set norebalance
# heartbeat 타임아웃 증가
ceph config set osd osd_heartbeat_grace 120
# 현재 매핑된 RBD 확인
rbd showmapped
# 타임아웃 설정 확인
cat /sys/bus/rbd/devices/*/timeout 2>/dev/null
# 커널 RBD 모듈 재로드 (신중히)
# sudo rmmod rbd
# sudo modprobe rbd
# 또는 RBD 디바이스 개별 재매핑
sudo rbd unmap /dev/rbd0 2>/dev/null || true
sudo rbd map <pool-name>/<image-name>
#!/bin/bash
echo "🚨 컨테이너 기반 Ceph 메모리 부족 복구"
# 1. 배포 방식 자동 감지
DEPLOY_TYPE=""
if ceph orch host ls &>/dev/null; then
DEPLOY_TYPE="cephadm"
elif kubectl get pods -n rook-ceph &>/dev/null; then
DEPLOY_TYPE="rook"
elif docker ps | grep ceph &>/dev/null; then
DEPLOY_TYPE="docker"
else
DEPLOY_TYPE="unknown"
fi
echo "감지된 배포 방식: $DEPLOY_TYPE"
# 2. 메모리 긴급 정리
echo "=== 메모리 정리 ==="
sync
echo 3 > /proc/sys/vm/drop_caches
echo "캐시 정리 완료"
# 3. Ceph 메모리 설정 조정
echo "=== Ceph 메모리 설정 ==="
ceph config set osd osd_memory_target 1073741824
ceph config set osd bluestore_cache_size 536870912
ceph config set osd osd_heartbeat_grace 120
# 복구 작업 일시 중단 (메모리 절약)
ceph osd set norecover
ceph osd set nobackfill
# 4. 배포 방식별 재시작
echo "=== 서비스 재시작 ($DEPLOY_TYPE) ==="
case $DEPLOY_TYPE in
"cephadm")
ceph orch daemon restart mgr.$(hostname) 2>/dev/null || true
sleep 10
for osd in $(ceph osd ls); do
echo "OSD.$osd 재시작..."
ceph orch daemon restart osd.$osd
sleep 30
done
;;
"rook")
kubectl delete pod -n rook-ceph -l app=rook-ceph-mgr 2>/dev/null || true
sleep 15
kubectl delete pod -n rook-ceph -l app=rook-ceph-osd --force --grace-period=0 2>/dev/null || true
;;
"docker")
docker restart $(docker ps -q --filter "name=ceph-mgr") 2>/dev/null || true
sleep 10
for container in $(docker ps -q --filter "name=ceph-osd"); do
echo "Docker OSD 컨테이너 재시작..."
docker restart $container
sleep 30
done
;;
*)
echo "⚠️ 알 수 없는 배포 방식 - 수동 재시작 필요"
;;
esac
# 5. 상태 확인
echo "=== 복구 상태 확인 ==="
sleep 30
ceph -s
echo ""
echo "메모리 상태:"
free -h
# 6. 복구 플래그 해제 (조건부)
UP_OSDS=$(ceph osd tree | grep "up" | wc -l)
if [ $UP_OSDS -gt 1 ]; then
echo "OSD 복구됨 - 복구 플래그 해제"
ceph osd unset norecover
ceph osd unset nobackfill
fi
# 메모리 사용량 실시간 모니터링
watch -n 5 'echo "=== 메모리 ===" && free -h && echo "=== Ceph ===" && ceph -s'
# 컨테이너 메모리 사용량 (Docker인 경우)
watch -n 5 'docker stats --no-stream | grep ceph'
즉시 실행: 위 통합 스크립트를 실행하세요. 배포 방식을 자동 감지하고 적절한 복구를 시도합니다!
핵심: 컨테이너 기반이라도 메모리 부족이 근본 원인이므로 메모리 최적화가 최우선입니다.