Ceph를 구축하며 발생한 cpu 이슈..

상황 #

Ceph 클러스터를 Kubernetes에 구축하는 과정 중, csi-rbdplugin, csi-cephfsplugin, csi-snapshotter 등의 csi-* 계열 Pod들이 CrashLoopBackOff 또는 Error 상태로 지속적으로 실패함.

문제 원인 #

  1. Ceph과 glibc의 관계
  • Ceph은 내부적으로 glibc(GNU C Library)를 사용하여 시스템 호출과 메모리 관리를 수행함.
  • 최신 Ceph(v18, v19) 버전은, 최신 glibc(>=2.34) 기반으로 빌드되어 있음.
  • 이 glibc 버전들은 CPU가 ‘x86-64-v2’ 명령어 집합을 지원한다고 가정하고 최적화되어 있음.
  1. x86-64-v2란?

x86-64-v2는 기존 x86-64 아키텍처보다 더 발전된 명령어 집합(Instruction Set)을 의미함.

필수 지원 명령어는 다음과 같음:

플래그설명
sse3스트리밍 SIMD 확장(SSE3)
ssse3보강된 스트리밍 SIMD 확장(SSSE3)
sse4_1스트리밍 SIMD 확장(SSE4.1)
sse4_2스트리밍 SIMD 확장(SSE4.2)
popcnt비트 카운트(Population Count)
cx1616바이트 비교/교환(CMPXCHG16B)

이 중 하나라도 CPU가 지원하지 않으면 glibc가 오류를 발생시키고, Ceph 데몬이 프로세스 레벨에서 바로 죽음.

  1. 가상화 환경의 문제
  • KVM/QEMU 환경에서는 기본적으로 “QEMU Virtual CPU"라는 에뮬레이션 CPU를 VM에게 제공함.
  • 이 기본 설정은 x86-64-v2 명령어 지원이 없음.
  • 따라서 Ceph 데몬(특히 mon, mgr, osd 등)이 초기화될 때, 필수 명령어를 찾지 못해 에러 발생 → Pod Crash로 이어짐.

확인 방법 #

VM 또는 Kubernetes Node에서 다음 명령어 실행

lscpu | grep Flags
# or
cat /proc/cpuinfo | grep flags
  • 출력 결과에 sse3, ssse3, sse4_1, sse4_2, popcnt, cx16 등이 반드시 포함되어 있어야 함.
  • 만약 포함되지 않았다면, 해당 VM은 x86-64-v2 기준을 만족하지 않음.

해결 방법 #

항목설정값이유
CPU TypeHost Passthrough물리 CPU의 모든 기능을 VM에 직접 전달하여 x86-64-v2 명령어 지원 보장
Emulated Machine기존과 동일 (예: pc-q35-6.2)별도 변경 불필요
디스크 포맷qcow2성능과 스냅샷 기능을 동시에 고려
부팅 디스크30GB ~ 50GBKubernetes OS용 디스크 사이즈
추가 디스크필요시 추가Ceph OSD 디스크용 등
FirmwareBIOS기존 환경 유지
vCPU계획한 대로 (ex: master 3core, worker 4core)
Memory계획한 대로 (ex: master 8GB, worker 16GB)
네트워크Bridge 연결 (br0 등)Kubernetes 클러스터 통신을 위해

요약 #

QEMU 기본 CPU → x86-64-v2 명령어 미지원 → 최신 glibc 기반 Ceph 데몬 죽음 → csi-*, mon, mgr Pod Crash. → VM 생성 시 Host Passthrough 설정 필수!