ceph 복구

진웅·2025년 8월 12일

K8S Basics

목록 보기
36/40

아! 컨테이너 기반 또는 cephadm 배포군요!

ceph 명령어는 작동하지만 systemctl에 서비스가 없다면 컨테이너 기반 배포입니다.

1. 배포 방식 확인

# 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

2. 배포 방식별 복구 방법

CEPHADM 배포인 경우:

# 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

Docker 컨테이너인 경우:

# 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}')

Rook/Kubernetes인 경우:

# 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}')

3. 메모리 문제 해결 (배포 무관)

시스템 레벨 메모리 정리

# 즉시 캐시 정리
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

Ceph 설정 최적화

# 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

4. RBD 디바이스 복구

RBD 타임아웃 오류 해결

# 현재 매핑된 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>

5. 통합 복구 스크립트

#!/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

6. 모니터링 설정

# 메모리 사용량 실시간 모니터링
watch -n 5 'echo "=== 메모리 ===" && free -h && echo "=== Ceph ===" && ceph -s'

# 컨테이너 메모리 사용량 (Docker인 경우)
watch -n 5 'docker stats --no-stream | grep ceph'

즉시 실행: 위 통합 스크립트를 실행하세요. 배포 방식을 자동 감지하고 적절한 복구를 시도합니다!

핵심: 컨테이너 기반이라도 메모리 부족이 근본 원인이므로 메모리 최적화가 최우선입니다.

profile
bytebliss

0개의 댓글