13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] 홈랩

  • [Proxmox] Proxmox VE 백업 및 복원 전략: 안전한 가상 환경 운영 가이드

    [Proxmox] Proxmox VE 백업 및 복원 전략: 안전한 가상 환경 운영 가이드

    백업 없는 서버는 시한폭탄이나 마찬가지입니다

    13년 동안 인프라를 운영하면서 가장 많이 들은 말이 뭔지 아세요? “백업은 있는데 복원은 해본 적이 없어요.” 이거거든요. 솔직히 저도 초반에 그랬습니다. 백업 스크립트 돌려놓고 ‘됐겠지’ 하고 넘어갔다가… 실제로 장애가 났을 때 복원이 안 되는 경험을 한 번 해보고 나서야 정신이 번쩍 들었죠.

    Proxmox VE(프록스목스 가상 환경) 환경에서 VM(가상 머신)이나 LXC 컨테이너를 운영 중이라면, Proxmox VE 백업 전략은 선택이 아니라 필수입니다. 홈랩이든 소규모 프로덕션이든 마찬가지예요. 오늘은 제가 실제로 구성하고 운영 중인 Proxmox VE 백업 및 복원 전략을 처음부터 끝까지 풀어드리겠습니다.

    Proxmox VE 백업 전략 전체 아키텍처 구성도 — VM, 로컬 스토리지, NAS, 클라우드 백업 흐름

    ▲ Proxmox VE 백업 전략의 전체 구성도 — VM 백업, 스냅샷, 외부 스토리지까지 한눈에 볼 수 있습니다.

    Proxmox VE 백업 방식, 뭐가 다른 건가요?

    Proxmox VE에서 제공하는 데이터 보호 방식은 크게 세 가지입니다. 처음 접하면 헷갈리는데, 쉽게 정리해드릴게요.

    1. 스냅샷 (Snapshot) — 빠르지만 독립적이지 않다

    스냅샷은 특정 시점의 VM 상태를 기록해두는 기능입니다. 쉽게 말해서, 게임의 세이브 포인트 같은 거예요. 디스크 상태뿐 아니라 RAM 상태까지 저장할 수 있어서 그 순간 그대로 돌아올 수 있습니다. 단, 스냅샷은 원본 스토리지에 의존하기 때문에 스토리지 자체가 날아가면 함께 사라집니다. 이 점을 반드시 기억해야 해요.

    2. 백업 (Backup/vzdump) — 진짜 의미의 백업

    Proxmox VE의 vzdump 도구를 사용해서 VM이나 LXC의 전체 이미지를 별도 파일로 추출하는 방식입니다. 이 파일은 독립적으로 존재하기 때문에 원본이 날아가도 복원이 가능합니다. 저장 형식은 .vma(VM용) 또는 .tar(LXC용)이고, 압축 옵션을 선택할 수 있습니다.

    3. 복제 (Replication) — HA 구성을 위한 실시간 동기화

    Proxmox VE 클러스터 환경에서 노드 간에 ZFS 스냅샷 기반으로 데이터를 동기화하는 기능입니다. 고가용성(HA, High Availability) 구성에 주로 쓰이고, 단일 노드 홈랩에서는 크게 쓸 일이 없습니다.

    방식 독립성 속도 용도 권장 상황
    스냅샷 ❌ 원본 의존 ⚡ 매우 빠름 작업 전 임시 저장 업데이트, 설정 변경 전
    vzdump 백업 ✅ 독립적 🐢 느림 재해 복구(DR) 정기 백업, 장기 보관
    복제 ✅ 노드 분리 ⚡ 빠름(증분) HA 구성 클러스터 환경

    실전 구현: vzdump로 VM 백업 설정하기

    자, 이제 실제로 설정해봅시다. Proxmox VE 웹 UI와 CLI 양쪽 다 설명드릴게요. 저는 주로 CLI를 쓰는 편인데, 자동화하기 훨씬 편하거든요.

    백업 스토리지 추가

    먼저 백업 파일을 저장할 스토리지를 지정해야 합니다. 웹 UI 기준으로는 Datacenter → Storage → Add에서 추가할 수 있어요. NFS나 SMB/CIFS, 로컬 디렉토리 등 다양한 방식을 지원합니다.

    CLI로 NFS 스토리지를 추가하는 예시입니다:

    # NFS 백업 스토리지 추가
    pvesm add nfs backup-nfs \
      --server 192.168.1.100 \
      --export /mnt/nas/proxmox-backup \
      --content backup \
      --maxfiles 3
    
    # 추가된 스토리지 확인
    pvesm status

    여기서 --maxfiles 3은 백업 파일을 최대 3개까지 보관하고, 초과하면 오래된 것부터 자동 삭제한다는 뜻입니다. 스토리지가 부족할 때 꼭 설정해줘야 해요. 저 처음에 이거 안 해놨다가 NAS가 꽉 차서 백업이 실패하는 상황을 겪었거든요.

    수동 백업 실행 (CLI)

    # 특정 VM 백업 (VM ID: 100)
    vzdump 100 --storage backup-nfs --compress zstd --mode snapshot
    
    # 모든 VM 백업
    vzdump --all --storage backup-nfs --compress zstd --mode snapshot
    
    # LXC 컨테이너 백업 (CT ID: 200)
    vzdump 200 --storage backup-nfs --compress zstd --mode suspend

    백업 모드(--mode) 옵션이 중요합니다. 세 가지가 있어요:

    • snapshot: VM을 계속 실행하면서 스냅샷 기반으로 Proxmox VE 백업을 진행. 서비스 중단 없음. 권장
    • suspend: 백업 중 VM을 일시 정지. 데이터 일관성은 좋지만 서비스 잠깐 중단
    • stop: VM을 완전히 중지 후 백업. 가장 안전하지만 다운타임 발생

    자동 백업 스케줄 설정

    Proxmox VE 웹 UI에서 Datacenter → Backup → Add로 스케줄을 만들 수 있습니다. 하지만 저는 설정 파일을 직접 확인하고 관리하는 걸 더 좋아해요. 설정 파일 위치는 여기입니다:

    # 백업 스케줄 설정 파일
    cat /etc/cron.d/vzdump
    
    # 예시: 매일 새벽 2시에 모든 VM 백업
    0 2 * * * root /usr/bin/vzdump --all --storage backup-nfs \
      --compress zstd --mode snapshot \
      --mailto [email protected] \
      --quiet 1

    웹 UI에서 만든 스케줄은 /etc/pve/jobs.cfg 파일에 저장됩니다. 확인해보면 이런 형태예요:

    vzdump: job-daily-backup
    	compress zstd
    	day mon,tue,wed,thu,fri,sat,sun
    	enabled 1
    	mailnotification always
    	mode snapshot
    	node pve-node01
    	starttime 02:00
    	storage backup-nfs
    Proxmox VE 웹 UI 자동 백업 스케줄 설정 화면 예시

    ▲ Proxmox VE 웹 UI에서 자동 백업 스케줄을 설정하는 화면 — 스토리지, 시간, 압축 방식을 직관적으로 설정할 수 있습니다.

    복원(Restore) 실전 가이드

    백업만큼 중요한 게 복원 연습입니다. 실제로 장애 상황에서 손이 떨리면서 복원 명령어 치는 것보다, 미리 한 번이라도 해봤냐 안 해봤냐가 엄청난 차이를 만들어요.

    웹 UI로 복원하기

    1. Proxmox VE 웹 UI 접속 → 왼쪽 패널에서 백업 스토리지 선택
    2. Content 탭 클릭 → 백업 파일 목록 확인
    3. 복원할 백업 파일 선택 → Restore 버튼 클릭
    4. 복원할 노드, VM ID, 스토리지 선택 후 Restore 실행

    CLI로 복원하기

    # 백업 파일 목록 확인
    pvesm list backup-nfs
    
    # VM 복원 (백업 파일에서 VM ID 101로 복원)
    qmrestore /mnt/pve/backup-nfs/dump/vzdump-qemu-100-2024_01_15-02_00_00.vma.zst 101
    
    # 기존 VM을 덮어쓰면서 복원 (같은 ID 사용)
    qmrestore /mnt/pve/backup-nfs/dump/vzdump-qemu-100-2024_01_15-02_00_00.vma.zst 100 --force
    
    # LXC 컨테이너 복원
    pct restore 201 /mnt/pve/backup-nfs/dump/vzdump-lxc-200-2024_01_15-02_00_00.tar.zst \
      --storage local-lvm

    복원 후에는 반드시 VM을 시작해서 서비스가 정상 동작하는지 확인하세요. 저는 복원 테스트할 때 항상 다른 VM ID로 먼저 복원해보고, 내부에서 서비스 상태 확인한 다음에 실제 교체하는 방식을 씁니다.

    스냅샷 활용 전략 — 올바르게 쓰는 법

    스냅샷은 정말 편리한 기능인데, 잘못 쓰면 오히려 독이 됩니다. 제가 봐온 가장 흔한 실수가 스냅샷을 백업 대용으로 쓰는 거예요.

    스냅샷 생성 및 관리

    # VM 스냅샷 생성 (RAM 상태 포함)
    qm snapshot 100 pre-update-20240115 \
      --description "커널 업데이트 전 스냅샷" \
      --vmstate 1
    
    # 스냅샷 목록 확인
    qm listsnapshot 100
    
    # 스냅샷으로 롤백
    qm rollback 100 pre-update-20240115
    
    # 스냅샷 삭제
    qm delsnapshot 100 pre-update-20240115

    💡 팁: 스냅샷이 쌓이면 VM 성능에 영향을 줄 수 있습니다. 특히 QCOW2 포맷에서 스냅샷 체인이 길어지면 I/O 성능이 떨어지거든요. 작업이 끝나면 반드시 필요 없는 스냅샷은 지워주세요.

    스냅샷 vs 백업 — 언제 뭘 써야 하나

    • ✅ 스냅샷 사용 시점: 패키지 업데이트 전, 설정 변경 전, 테스트 작업 전 (단기 롤백 목적)
    • ✅ 백업 사용 시점: 정기적 데이터 보호, 장기 보관, 다른 서버로 이전, 재해 복구(DR, Disaster Recovery)

    ⚠️ 트러블슈팅 — 제가 직접 겪은 문제들

    자, 이제 진짜 중요한 부분입니다. Proxmox VE 백업 설정하면서 제가 삽질했던 경험들을 공유할게요.

    문제 1: 백업 중 “lock file exists” 오류

    백업이 중간에 실패하면 락 파일이 남아서 다음 백업도 실패하는 경우가 있습니다.

    # 락 파일 확인
    ls /var/run/vzdump.lock
    
    # 강제 삭제 (프로세스가 없을 때만!)
    rm /var/run/vzdump.lock
    
    # vzdump 프로세스 확인
    ps aux | grep vzdump

    문제 2: NFS 스토리지 백업 실패

    NFS 마운트 포인트 권한 문제로 백업이 실패하는 경우가 많습니다. NFS 서버 설정에서 no_root_squash 옵션이 빠져 있으면 root 권한으로 쓰기가 안 돼요.

    # NFS 서버 측 /etc/exports 설정 예시
    /mnt/nas/proxmox-backup 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
    
    # NFS 서버에서 exports 재적용
    exportfs -ra
    
    # Proxmox에서 마운트 상태 확인
    mount | grep nfs
    df -h

    문제 3: 스냅샷 상태에서 백업 실패

    VM에 스냅샷이 남아 있는 상태에서 mode=snapshot으로 백업하면 오류가 나는 경우가 있습니다. 특히 QCOW2 포맷에서 발생하는데, 이럴 때는 mode=suspend나 mode=stop을 시도해보세요.

    문제 4: 백업 파일 무결성 검증

    백업 파일이 제대로 됐는지 확인하는 방법도 알아두면 좋습니다.

    # 백업 파일 무결성 검사
    vzdump --verify /mnt/pve/backup-nfs/dump/vzdump-qemu-100-2024_01_15-02_00_00.vma.zst
    
    # zstd 압축 파일 테스트
    zstd --test /mnt/pve/backup-nfs/dump/vzdump-qemu-100-2024_01_15-02_00_00.vma.zst
    Proxmox VE 백업 무결성 검증 및 복원 테스트 결과 대시보드

    ▲ 백업 무결성 검증 및 복원 테스트 결과 확인 — 정기적인 복원 테스트가 진짜 재해 복구의 핵심입니다.

    3-2-1 백업 규칙 — 홈랩에도 적용하세요

    인프라 업계에서 오랫동안 통용되는 백업 황금 규칙이 있습니다. 3-2-1 규칙이에요.

    • 📁 3: 데이터 복사본을 최소 3개 보관
    • 💾 2: 2가지 이상의 서로 다른 미디어/스토리지에 저장
    • 🌍 1: 1개는 오프사이트(원격 위치)에 보관

    홈랩 기준으로 현실적인 구성을 제안드리면:

    복사본 위치 방법
    원본 Proxmox 노드 로컬 스토리지 운영 중인 VM 자체
    2번째 로컬 NAS vzdump → NFS/SMB 백업
    3번째 클라우드 또는 외장 드라이브 rclone으로 클라우드 동기화

    클라우드 동기화는 rclone을 이용하면 편리합니다. Backblaze B2나 AWS S3 같은 저렴한 오브젝트 스토리지와 연동할 수 있거든요.

    # rclone으로 백업 파일 클라우드 동기화 예시
    rclone sync /mnt/pve/backup-nfs/dump/ remote:proxmox-backup/ \
      --include "*.vma.zst" \
      --min-age 1h \
      --log-file /var/log/rclone-backup.log
    
    # cron에 등록 (매일 새벽 4시 실행)
    echo "0 4 * * * root rclone sync /mnt/pve/backup-nfs/dump/ remote:proxmox-backup/ --include '*.vma.zst' --min-age 1h" >> /etc/cron.d/rclone-backup

    재해 복구(DR) 시나리오별 대응 전략

    마지막으로, 실제 장애 상황별로 어떻게 대응해야 하는지 정리해드릴게요. 이걸 미리 문서화해두면 실제 장애 시 훨씬 침착하게 대응할 수 있습니다.

    시나리오 1: VM 데이터 손상 (단일 VM 문제)

    1. 해당 VM 중지
    2. 최신 백업 파일 확인: pvesm list backup-nfs
    3. 새 VM ID로 복원 후 데이터 확인
    4. 문제없으면 기존 VM 삭제 후 ID 교체

    시나리오 2: Proxmox 노드 장애 (하드웨어 교체 필요)

    1. 새 하드웨어에 동일 버전 Proxmox VE 설치
    2. 백업 스토리지(NAS) 연결 및 스토리지 추가
    3. 모든 VM을 백업에서 순차 복원
    4. 네트워크 설정 재확인 및 서비스 점검

    시나리오 3: 스토리지 전체 장애

    1. 클라우드 또는 외장 드라이브에 보관된 3번째 백업 사용
    2. 새 스토리지 준비 후 백업 파일 복사
    3. Proxmox에서 스토리지 재구성 후 복원 진행
    Proxmox VE 재해 복구 전략 3-2-1 백업 규칙 인포그래픽

    ▲ 재해 복구 전략 요약 인포그래픽 — 3-2-1 백업 규칙과 시나리오별 대응 흐름을 한눈에 정리했습니다.

    자주 묻는 질문 (FAQ)

    Q. 백업 중에 VM을 사용해도 되나요?

    네, mode=snapshot 옵션을 사용하면 백업 중에도 VM이 계속 실행됩니다. 다만 데이터베이스 서버처럼 트랜잭션이 많은 경우엔 애플리케이션 레벨의 백업도 병행하는 걸 권장합니다.

    Q. 압축 형식은 뭘 써야 하나요?

    Proxmox VE 7.x 이상에서는 zstd를 추천합니다. gzip보다 훨씬 빠르면서 압축률도 비슷하거든요. 구버전에서는 lzo가 속도가 빠른 편입니다.

    Q. 백업 파일 크기가 너무 큰데 줄일 방법이 있나요?

    VM 내부에서 불필요한 파일을 정리하고 디스크 빈 공간을 0으로 채운 후 백업하면 압축률이 올라갑니다. Linux VM 기준으로 dd if=/dev/zero of=/tmp/zero.file; rm /tmp/zero.file 실행 후 백업해보세요.

    마무리 — 백업은 문화입니다

    오늘 Proxmox VE 백업과 복원 전략을 처음부터 끝까지 다뤄봤는데요. 핵심만 다시 정리하면:

    • ✅ 스냅샷은 단기 롤백, vzdump 백업은 장기 보관용으로 구분해서 사용하세요
    • ✅ 3-2-1 규칙을 홈랩에도 적용하세요 — 클라우드 동기화가 생각보다 저렴합니다
    • ✅ 복원 테스트를 정기적으로 해보세요 — 최소 분기에 한 번은 실제로 복원해보는 걸 강력 추천합니다
    • ✅ 백업 알림 설정을 꼭 해두세요 — 실패했는데 모르고 있는 게 제일 위험합니다

    혹시 Proxmox VE 클러스터 환경에서의 복제(Replication) 설정이나 Proxmox Backup Server(PBS) 연동에 대해 궁금하신 분들은 다음 글에서 자세히 다룰 예정이니 기대해주세요. PBS는 중복 제거(deduplication) 기능이 있어서 스토리지 효율이 훨씬 좋거든요.

    13년 동안 서버 운영하면서 배운 가장 중요한 교훈 하나를 드리고 마칠게요. “백업은 있는데 복원은 안 된다”는 건 백업이 없는 것과 같습니다. 오늘 바로 복원 테스트 한 번 해보시는 거 어떨까요? 🎉

  • [Proxmox] Proxmox VE ZFS 스토리지 최적화: 성능과 안정성 동시 확보 가이드

    [Proxmox] Proxmox VE ZFS 스토리지 최적화: 성능과 안정성 동시 확보 가이드

    ZFS를 Proxmox에 올리면 생기는 일

    홈랩을 운영하다 보면 어느 순간 이런 생각이 드시죠. “스토리지 관리 좀 제대로 해보고 싶다.” 저도 그랬거든요. 처음엔 그냥 ext4 파티션에 LVM(논리 볼륨 관리자) 얹어서 쓰다가, 어느 날 디스크 하나가 조용히 세상을 떠나면서 VM 이미지를 통째로 날린 경험이 있습니다. 그날 이후로 ZFS(Zettabyte File System)를 진지하게 공부하기 시작했어요.

    Proxmox VE ZFS 조합은 사실 홈랩 커뮤니티에서 꽤 오래된 조합입니다. Proxmox VE가 ZFS를 기본 지원하기 시작한 이후로, 별도의 커널 모듈 컴파일 없이도 ZFS를 바로 쓸 수 있게 됐거든요. 근데 막상 써보면 “설치는 쉬운데, 최적화는 어디서부터 시작해야 하지?” 하는 막막함이 있더라고요. 오늘은 그 막막함을 같이 해소해 보겠습니다.

    Proxmox VE ZFS 스토리지 아키텍처 전체 계층 구조 다이어그램

    ▲ Proxmox VE + ZFS 스토리지 구성 전체 아키텍처 — VM/CT 레이어부터 ZFS 풀(Pool), 물리 디스크까지의 계층 구조를 보여줍니다.

    ZFS가 뭔지 먼저 짚고 가겠습니다

    쉽게 말해서 ZFS는 “똑똑한 파일 시스템”입니다

    일반 파일 시스템과 ZFS의 가장 큰 차이점은, ZFS가 파일 시스템과 볼륨 관리자를 동시에 담당한다는 점이에요. 기존에는 파티션 → LVM → 파일 시스템 이렇게 레이어가 쌓였다면, ZFS는 이걸 하나로 통합해서 관리합니다.

    핵심 기능만 짚어볼게요:

    • Copy-on-Write(CoW, 쓰기 시 복사): 데이터를 덮어쓰지 않고 항상 새 블록에 씁니다. 시스템이 갑자기 꺼져도 데이터가 깨지지 않아요.
    • Checksum(체크섬, 데이터 무결성 검증): 모든 블록에 체크섬이 붙어 있어서, 읽을 때마다 데이터가 정상인지 자동으로 확인합니다. Silent Data Corruption(무음 데이터 손상)을 잡아내는 거죠.
    • Snapshot(스냅샷): 순간적으로 파일 시스템 상태를 저장합니다. Proxmox에서 VM 백업할 때 이게 핵심이에요.
    • RAID-Z(레이드-Z): 소프트웨어 RAID를 ZFS 레벨에서 처리합니다. 하드웨어 RAID 컨트롤러 없이도 충분한 안정성을 확보할 수 있어요.
    • ARC(Adaptive Replacement Cache, 적응형 교체 캐시): RAM을 읽기 캐시로 활용합니다. 메모리가 많을수록 성능이 올라가요.

    Proxmox VE에서 ZFS 스토리지를 쓰면 좋은 이유

    솔직히 말하면, Proxmox + ZFS 조합의 가장 큰 장점은 스냅샷 기반 백업이 기가 막히게 편하다는 겁니다. VM을 백업할 때 ZFS 스냅샷을 찍으면 거의 순간적으로 완료되거든요. 100GB짜리 VM이라도 스냅샷 자체는 1초도 안 걸립니다. 실제 데이터 복사가 아니라 메타데이터만 기록하는 방식이라서요.

    항목 기존 LVM + ext4 ZFS
    데이터 무결성 파일 시스템 레벨만 블록 레벨 체크섬
    스냅샷 속도 데이터 크기에 비례 거의 즉각적
    RAID 관리 별도 mdadm 필요 ZFS 내장
    압축 지원 안 함 투명 압축 지원
    RAM 요구량 낮음 높음 (ARC 때문에)
    설정 복잡도 낮음 중간~높음

    Proxmox VE ZFS 풀(Pool) 구성하기

    1단계: ZFS 풀 생성 전 디스크 확인

    먼저 사용할 디스크들을 확인합니다. 중요한 건 ZFS는 반드시 디스크 전체를 넘겨줘야 한다는 거예요. 파티션 위에 ZFS를 올리는 것도 기술적으로는 가능하지만, 권장하지 않습니다. 저도 처음에 파티션 위에 올렸다가 나중에 풀 교체하는 데 고생했거든요.

    # 현재 연결된 디스크 목록 확인
    lsblk -d -o NAME,SIZE,MODEL,SERIAL
    
    # 디스크 상태 확인 (스마트 정보)
    smartctl -a /dev/sdb
    
    # ZFS에서 사용할 디스크 ID 확인 (권장: ID 방식으로 지정)
    ls -la /dev/disk/by-id/ | grep -v part

    💡 팁: ZFS 풀 생성 시 /dev/sdb 같은 경로 대신 /dev/disk/by-id/ 아래의 ID를 사용하세요. 재부팅 후 디스크 순서가 바뀌어도 안전합니다.

    2단계: ZFS 풀 생성

    Proxmox에서 ZFS 풀을 만드는 방법은 두 가지입니다. GUI로 하거나 CLI로 하거나. 저는 CLI를 선호해요. 정확히 뭘 하는지 눈에 보이니까요.

    # 미러(Mirror, RAID-1과 유사) 풀 생성 예시 — 디스크 2개
    zpool create -o ashift=12 \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      -O dnodesize=auto \
      rpool mirror \
      /dev/disk/by-id/ata-디스크1_시리얼 \
      /dev/disk/by-id/ata-디스크2_시리얼
    
    # RAID-Z1 풀 생성 예시 — 디스크 3개 이상
    zpool create -o ashift=12 \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      -O dnodesize=auto \
      datapool raidz1 \
      /dev/disk/by-id/ata-디스크1_시리얼 \
      /dev/disk/by-id/ata-디스크2_시리얼 \
      /dev/disk/by-id/ata-디스크3_시리얼

    여기서 각 옵션이 뭔지 짚어볼게요:

    • ashift=12: 4KB 섹터 디스크에 맞는 설정. 요즘 HDD/SSD 대부분이 4KB 섹터 또는 그 이상이라서 거의 필수입니다. 풀 생성 후 변경 불가니까 처음에 꼭 확인하세요.
    • compression=lz4: LZ4 압축 활성화. CPU 부하가 거의 없으면서 10~30% 정도 공간을 아낄 수 있어요.
    • atime=off: 파일 접근 시간 기록 비활성화. I/O 성능 향상에 도움이 됩니다.
    • xattr=sa: 확장 속성을 inode에 저장. 성능 향상에 기여해요.
    • dnodesize=auto: dnode 크기 자동 조정. 대용량 파일 시스템에 유리합니다.

    3단계: Proxmox에 ZFS 스토리지 등록

    풀을 만들었으면 Proxmox가 이걸 스토리지로 인식하게 해줘야 합니다.

    # /etc/pve/storage.cfg 에 추가하거나
    # Proxmox GUI: Datacenter > Storage > Add > ZFS 선택
    
    # CLI로 추가하는 방법
    pvesm add zfspool datapool-storage \
      --pool datapool \
      --content images,rootdir \
      --sparse 1

    GUI에서 하시면 Datacenter → Storage → Add → ZFS 선택하고 풀 이름 입력하면 됩니다. 훨씬 직관적이에요.

    Proxmox VE 웹 GUI ZFS 스토리지 추가 설정 화면

    ▲ Proxmox VE 관리 콘솔에서 ZFS 풀을 스토리지로 등록하는 화면 — 풀 이름, Content 타입, Sparse 옵션 등을 설정합니다.

    ZFS 성능 최적화 핵심 설정

    ARC 메모리 설정 — 제일 중요합니다

    ZFS의 ARC(Adaptive Replacement Cache)는 기본적으로 사용 가능한 RAM의 절반 정도까지 사용하려고 합니다. 홈랩이나 소규모 서버에서는 이게 VM들이 쓸 메모리를 잡아먹는 문제가 생겨요. 저도 처음에 이 설정 안 하고 쓰다가 “왜 VM이 이렇게 느리지?” 하면서 한참 삽질했습니다.

    # 현재 ARC 사용량 확인
    cat /proc/spl/kstat/zfs/arcstats | grep -E '^(size|c_max|c_min|hits|misses)'
    
    # ARC 최대 크기 제한 설정 (예: 8GB로 제한)
    # /etc/modprobe.d/zfs.conf 파일 생성/편집
    cat > /etc/modprobe.d/zfs.conf << 'EOF'
    options zfs zfs_arc_max=8589934592
    EOF
    
    # 즉시 적용 (재부팅 없이)
    echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max
    
    # 변경 확인
    cat /sys/module/zfs/parameters/zfs_arc_max

    ⚠️ 주의: ARC를 너무 작게 설정하면 ZFS 성능이 크게 떨어집니다. 일반적으로 전체 RAM의 20~25% 정도는 ARC에 남겨두는 걸 권장해요. 16GB RAM이면 최소 4GB는 ARC에 할당하는 게 좋습니다.

    L2ARC와 ZIL/SLOG 설정 — SSD 있으면 써먹어야죠

    SSD가 여분으로 있다면 L2ARC(Level 2 ARC, 2차 읽기 캐시)와 SLOG(Separate Intent Log, 분리 의도 로그)로 활용할 수 있습니다.

    # L2ARC 추가 (읽기 캐시, SSD 권장)
    zpool add datapool cache /dev/disk/by-id/ssd-캐시디스크_시리얼
    
    # SLOG/ZIL 추가 (쓰기 캐시, 저지연 SSD 권장)
    # 미러 구성을 강력히 권장 (SLOG 손실 시 데이터 손실 위험)
    zpool add datapool log mirror \
      /dev/disk/by-id/ssd-slog1_시리얼 \
      /dev/disk/by-id/ssd-slog2_시리얼
    
    # 현재 풀 구성 확인
    zpool status datapool

    💡 팁: SLOG는 반드시 미러로 구성하세요. SLOG 디스크가 고장나면 최근 쓰기 데이터가 날아갈 수 있거든요. 비용이 두 배가 되더라도 미러가 맞습니다.

    ZFS 데이터셋 최적화 설정

    Proxmox에서 VM 이미지를 저장하는 데이터셋은 별도로 최적화해 주는 게 좋아요. VM 워크로드 특성에 맞게요.

    # VM 이미지용 데이터셋 최적화
    # recordsize를 VM 디스크 블록 크기에 맞게 조정
    zfs set recordsize=64K datapool/images
    
    # 또는 데이터베이스 VM이 많다면
    zfs set recordsize=16K datapool/images
    
    # 압축 설정 (lz4가 성능/압축률 균형이 좋음)
    zfs set compression=lz4 datapool
    
    # 현재 데이터셋 속성 확인
    zfs get all datapool | grep -E '(compression|recordsize|atime|sync)'
    
    # sync 설정 (주의: disabled는 데이터 손실 위험 있음)
    # VM이 많고 성능이 중요하다면 standard 유지 권장
    zfs set sync=standard datapool/images

    Scrub(스크럽, 데이터 무결성 검사) 자동화

    ZFS의 핵심 기능 중 하나가 스크럽이에요. 모든 데이터 블록을 읽어서 체크섬을 검증하는 작업인데, 주기적으로 해줘야 Silent Data Corruption을 조기에 발견할 수 있습니다.

    # 수동으로 스크럽 실행
    zpool scrub datapool
    
    # 스크럽 진행 상황 확인
    zpool status datapool
    
    # 자동 스크럽 설정 (Proxmox는 기본적으로 월 1회 cron 설정됨)
    # /etc/cron.d/zfsutils-linux 확인
    cat /etc/cron.d/zfsutils-linux
    
    # 직접 cron 설정 (매월 1일 새벽 2시)
    crontab -e
    # 아래 내용 추가:
    # 0 2 1 * * /sbin/zpool scrub datapool

    ⚠️ 실제로 겪은 문제들과 해결법

    문제 1: VM 성능이 생각보다 안 나온다

    ZFS를 처음 올렸을 때 “왜 이렇게 느리지?” 하는 경험을 많이들 하세요. 저도 그랬는데, 원인이 몇 가지 있더라고요.

    원인 및 해결책:

    1. ashift 설정 오류: zpool status -v로 확인. 이미 풀이 생성됐다면 재생성 외에는 방법이 없어요. 처음부터 ashift=12를 꼭 넣어주세요.
    2. ARC 부족: arcstat 명령으로 hit ratio 확인. 70% 이하면 ARC가 부족한 겁니다.
    3. recordsize 불일치: VM 워크로드에 따라 recordsize를 조정하세요. 랜덤 I/O가 많은 DB 워크로드는 작은 recordsize가 유리합니다.
    # ARC 히트율 확인
    arcstat 1 5
    
    # ZFS I/O 통계 모니터링
    zpool iostat -v datapool 2
    
    # 상세 ZFS 통계
    zfs-stats -a

    문제 2: 디스크 오류 발견 시 대응

    어느 날 아침에 zpool status를 실행했더니 DEGRADED 상태가 뜨는 경험을 한 적이 있습니다. 심장이 쿵 내려앉더라고요. 근데 ZFS가 있으니까 침착하게 대응할 수 있었어요.

    # 풀 상태 확인
    zpool status -v datapool
    
    # 오류 난 디스크 교체 후 resilvering(데이터 재동기화) 시작
    # 1. 오류 디스크 오프라인 처리
    zpool offline datapool /dev/disk/by-id/문제디스크_시리얼
    
    # 2. 물리적으로 디스크 교체 후 새 디스크 지정
    zpool replace datapool \
      /dev/disk/by-id/문제디스크_시리얼 \
      /dev/disk/by-id/새디스크_시리얼
    
    # 3. resilvering 진행 상황 확인
    zpool status datapool

    문제 3: 스냅샷이 쌓여서 공간이 부족해진다

    Proxmox 자동 백업 설정해 놓으면 스냅샷이 계속 쌓입니다. 어느 순간 “왜 공간이 이렇게 없지?” 하고 보면 스냅샷이 수십 개 쌓여 있는 경우가 있어요.

    # 스냅샷 목록 확인
    zfs list -t snapshot -o name,used,creation | sort -k3
    
    # 오래된 스냅샷 삭제
    zfs destroy datapool/images/vm-100-disk-0@2024-01-01
    
    # 특정 패턴의 스냅샷 일괄 삭제 (주의해서 사용!)
    zfs list -t snapshot -H -o name | grep 'vm-100' | xargs -n1 zfs destroy
    
    # Proxmox 백업 보존 정책 설정 (GUI 권장)
    # Datacenter > Backup > 해당 작업 편집 > Keep 설정
    ZFS ARC 히트율 및 스토리지 I/O 성능 모니터링 대시보드

    ▲ ZFS ARC 히트율과 풀 I/O 성능 모니터링 — arcstat 및 zpool iostat 출력 결과를 시각화한 예시입니다. 히트율 80% 이상을 목표로 합니다.

    ZFS 스토리지 상태 검증하기

    일상적인 헬스체크 루틴

    이 명령어들은 저도 주기적으로 확인하는 것들이에요. 습관처럼 만들어 두면 정말 든든합니다.

    # 전체 풀 상태 한눈에 보기
    zpool status
    
    # 풀 사용량 확인
    zpool list
    
    # 데이터셋별 사용량 (스냅샷 포함)
    zfs list -t all -o name,used,avail,refer,mountpoint
    
    # 압축 효율 확인
    zfs get compressratio datapool
    
    # 전체 ZFS 이벤트 로그 확인
    zpool events -v | tail -50

    성능 벤치마크 기준점 잡기

    최적화 전후를 비교하려면 기준점이 있어야 하죠. fio(Flexible I/O Tester)로 간단히 측정해 볼 수 있습니다.

    # fio 설치
    apt install fio
    
    # 순차 쓰기 테스트
    fio --name=seqwrite \
      --filename=/datapool/testfile \
      --rw=write \
      --bs=1M \
      --size=4G \
      --numjobs=1 \
      --ioengine=libaio \
      --direct=1 \
      --group_reporting
    
    # 랜덤 읽기 테스트 (4K 블록)
    fio --name=randread \
      --filename=/datapool/testfile \
      --rw=randread \
      --bs=4K \
      --size=4G \
      --numjobs=4 \
      --ioengine=libaio \
      --direct=1 \
      --group_reporting
    
    # 테스트 파일 정리
    rm /datapool/testfile

    정리: ZFS 최적화 체크리스트

    Proxmox VE ZFS 최적화 핵심 설정 체크리스트 요약 인포그래픽

    ▲ Proxmox VE ZFS 최적화 핵심 설정 요약 — 풀 생성부터 ARC 튜닝, 스크럽 자동화까지 단계별 체크리스트입니다.

    지금까지 다룬 내용을 정리해 보겠습니다. 처음엔 복잡해 보여도, 하나씩 따라가면 충분히 할 수 있어요.

    필수 설정 체크리스트

    • ✅ ashift=12 — 풀 생성 시 반드시 지정
    • ✅ compression=lz4 — 성능 영향 없이 공간 절약
    • ✅ atime=off — 불필요한 I/O 제거
    • ✅ ARC 크기 제한 — VM 메모리와 균형 맞추기
    • ✅ 정기 스크럽 — 월 1회 이상 실행
    • ✅ 디스크 ID 방식 사용 — 재부팅 후 안정성 확보
    • ✅ 스냅샷 보존 정책 — 디스크 공간 관리
    • ✅ SLOG 미러 구성 — SLOG 사용 시 필수

    자주 묻는 질문 (FAQ)

    Q. ZFS는 ECC 메모리가 없으면 위험한가요?
    A. ECC 메모리가 없어도 ZFS를 쓸 수 있습니다. 다만 메모리 오류로 인한 데이터 손상 가능성이 이론적으로 존재해요. 홈랩 수준에서는 크게 걱정 안 해도 되지만, 프로덕션 환경이라면 ECC를 권장합니다.

    Q. ZFS 풀 크기를 나중에 늘릴 수 있나요?
    A. 네, 가능합니다. 미러 풀은 동일한 크기의 디스크 쌍을 추가해서 확장할 수 있어요. RAID-Z는 같은 VDEV(가상 디바이스) 내에서 디스크 추가가 어렵고, 새 VDEV를 추가하는 방식으로 확장합니다.

    Q. 압축을 켜면 CPU 사용률이 많이 올라가나요?
    A. lz4 압축은 CPU 영향이 매우 적습니다. 요즘 프로세서에서는 거의 체감이 안 될 정도예요. 오히려 I/O 양이 줄어서 전체 성능이 올라가는 경우도 있어요.

    마무리하며

    Proxmox VE ZFS 조합은 한번 제대로 세팅해 두면 정말 든든합니다. 디스크 하나가 죽어도 침착하게 교체하고 resilvering 기다리면 되고, 실수로 VM 날려도 스냅샷에서 복구하면 되고. 처음 세팅이 좀 복잡해 보이지만, 그 이후의 편안함은 진짜 다르더라고요.

    물론 ZFS가 만능은 아닙니다. 메모리를 많이 먹고, 설정이 복잡하고, 한번 만든 풀 구조를 바꾸기 어렵다는 단점도 있어요. 그래도 데이터 안정성과 스냅샷 편의성을 생각하면, 홈랩에서 ZFS를 선택하지 않을 이유가 없다고 생각합니다.

    다음 글에서는 Proxmox VE의 백업 자동화와 원격 ZFS 복제(Replication)를 다뤄볼 예정이에요. 오늘 설정한 ZFS 풀을 활용해서 다른 서버로 데이터를 자동으로 복제하는 방법인데, 이것도 꽤 유용하더라고요. 기대해 주세요!

    궁금한 점이나 다른 삽질 경험이 있으시면 댓글로 공유해 주세요. 같이 해결해 봐요!

  • [k8s] Longhorn 쿠버네티스 영구 스토리지 완벽 가이드: 설치부터 PV/PVC까지

    [k8s] Longhorn 쿠버네티스 영구 스토리지 완벽 가이드: 설치부터 PV/PVC까지

    목차

    파드가 죽으면 데이터도 같이 사라진다고요? 😱

    쿠버네티스 공부하다가 처음으로 맞닥뜨리는 벽 중 하나가 바로 스토리지(Storage) 문제거든요. 저도 처음에 홈랩에 k3s 클러스터 꾸려놓고 MySQL 파드 띄웠다가, 파드 재시작하니까 데이터가 싹 날아간 경험을 했었는데요. 그때 진짜 멘붕이었죠 ㅎㅎ

    쿠버네티스에서 파드(Pod)는 기본적으로 ephemeral(일시적인) 존재입니다. 파드가 죽고 다시 살아나면 컨테이너 내부 파일시스템은 초기화돼요. 그래서 데이터베이스나 파일 서버처럼 상태를 유지해야 하는 워크로드에는 반드시 영구 스토리지(Persistent Storage)가 필요하죠.

    근데 쿠버네티스 스토리지 설정이 처음엔 진짜 복잡하게 느껴지거든요. PV, PVC, StorageClass… 용어만 해도 헷갈리는데, 여기에 분산 스토리지까지 얹으면 더 막막하죠. 오늘은 제가 홈랩에서 직접 운영하면서 가장 만족스럽게 쓰고 있는 Longhorn을 소개해드리려고 합니다. Longhorn 설치부터 PV/PVC 관리까지 한 번에 정리해볼게요.

    Longhorn 분산 스토리지 쿠버네티스 아키텍처 다이어그램

    ▲ Longhorn의 전체 아키텍처: 쿠버네티스 클러스터 내에서 각 노드의 디스크를 묶어 분산 스토리지를 구성하는 방식을 보여줍니다.

    Longhorn이 뭔가요? — 쉽게 말하면 이런 겁니다

    Longhorn 핵심 개념 정리

    Longhorn은 CNCF(Cloud Native Computing Foundation) 프로젝트로 편입된 쿠버네티스 전용 분산 블록 스토리지(Distributed Block Storage) 솔루션이에요. Rancher Labs(현 SUSE)에서 만들었고, 오픈소스로 무료로 사용할 수 있습니다.

    쉽게 말해서, 클러스터에 있는 여러 노드의 디스크를 하나로 묶어서 마치 네트워크 스토리지처럼 쓸 수 있게 해주는 거예요. 그리고 데이터를 여러 노드에 복제(Replication)해서 노드 하나가 죽어도 데이터가 안전하게 보존되죠.

    제가 Longhorn을 선택한 이유는 딱 세 가지였어요:

    • 💡 웹 UI가 있다 — 대시보드에서 볼륨 상태를 한눈에 볼 수 있어요. 이게 진짜 편하더라고요.
    • 💡 설치가 간단하다 — Helm 차트나 kubectl 한 방으로 설치 가능
    • 💡 스냅샷/백업 기능 — Longhorn 볼륨 스냅샷이나 S3 백업 연동이 기본 탑재

    PV, PVC, StorageClass — 헷갈리는 개념 한번에 정리

    저도 처음엔 이 세 개 개념이 너무 헷갈렸는데요. 비유로 설명하면 이해가 쉬워요.

    개념 풀네임 비유 설명
    PV PersistentVolume 실제 창고 공간 관리자가 미리 만들어둔 실제 스토리지 리소스
    PVC PersistentVolumeClaim 창고 사용 신청서 사용자(파드)가 필요한 스토리지를 요청하는 오브젝트
    StorageClass StorageClass 창고 종류/등급 PV를 동적으로 생성하는 방법을 정의한 템플릿

    Longhorn을 설치하면 longhorn이라는 StorageClass가 자동으로 생성되고, PVC를 만들면 그에 맞는 PV가 자동으로 프로비저닝(Dynamic Provisioning)돼요. 직접 PV를 만들 필요가 없어서 진짜 편합니다.

    사전 준비 — 설치 전에 꼭 확인하세요 ⚠️

    노드 요구사항 체크리스트

    Longhorn 설치 전에 반드시 확인해야 할 것들이 있어요. 저도 처음에 이걸 빠뜨려서 삽질을 좀 했거든요 ㅎㅎ

    1. open-iscsi 패키지 설치 — 각 노드에 반드시 필요합니다
    2. NFSv4 클라이언트 — 백업 기능 사용 시 필요
    3. curl, findmnt, grep, awk, blkid, lsblk — 기본 유틸리티 확인
    4. 마운트 전파(Mount Propagation) — 컨테이너 런타임 설정 확인

    Longhorn 공식에서는 사전 체크 스크립트를 제공해줘요. 이걸 먼저 돌려보는 게 좋습니다:

    # Longhorn 환경 체크 스크립트 실행
    curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/master/scripts/environment_check.sh | bash

    Ubuntu/Debian 계열 노드라면 open-iscsi를 이렇게 설치해요:

    # 각 노드에서 실행 (모든 워커 노드에 적용)
    sudo apt-get update
    sudo apt-get install -y open-iscsi
    sudo systemctl enable iscsid
    sudo systemctl start iscsid
    
    # 상태 확인
    sudo systemctl status iscsid

    RHEL/CentOS 계열이라면:

    sudo yum install -y iscsi-initiator-utils
    sudo systemctl enable iscsid
    sudo systemctl start iscsid

    Longhorn 설치하기 — 3가지 방법

    방법 1: kubectl로 한 방에 설치 (가장 간단)

    가장 빠른 방법이에요. 테스트 환경이나 홈랩이라면 이걸로 충분합니다:

    # Longhorn 설치 (공식 manifest 사용)
    kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.6.0/deploy/longhorn.yaml
    
    # 설치 진행 상황 확인
    kubectl get pods --namespace longhorn-system --watch
    
    # 모든 파드가 Running 상태가 될 때까지 기다립니다
    # 보통 2~3분 정도 걸려요

    방법 2: Helm으로 설치 (권장 — 프로덕션 환경)

    커스터마이징이 필요하거나 GitOps로 관리하고 싶다면 Helm이 훨씬 나아요. 저도 실제 환경에서는 Helm을 써요:

    # Helm 레포지토리 추가
    helm repo add longhorn https://charts.longhorn.io
    helm repo update
    
    # longhorn-system 네임스페이스 생성
    kubectl create namespace longhorn-system
    
    # 기본 설치
    helm install longhorn longhorn/longhorn \
      --namespace longhorn-system \
      --set defaultSettings.defaultReplicaCount=2
    
    # 설치 확인
    kubectl -n longhorn-system get pods

    💡 팁: defaultReplicaCount는 볼륨 복제본 개수예요. 노드가 3개 이상이면 3으로 설정하는 게 좋고, 홈랩처럼 노드가 적으면 2로 줄이세요.

    방법 3: values.yaml로 세부 설정

    프로덕션 환경에서는 values 파일로 관리하는 게 좋아요:

    # longhorn-values.yaml
    defaultSettings:
      # 기본 복제본 수
      defaultReplicaCount: 3
      # 스토리지 예약 비율 (각 노드 디스크의 25% 예약)
      storageReservedPercentageForDefaultDisk: 25
      # 백업 타겟 (S3나 NFS 경로)
      # backupTarget: s3://my-bucket@us-east-1/
      
    ingress:
      enabled: true
      host: longhorn.yourdomain.com
      # 인증 설정 (Basic Auth 권장)
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
    
    persistence:
      # 기본 StorageClass로 설정
      defaultClass: true
      defaultClassReplicaCount: 3
      reclaimPolicy: Retain
    # values 파일로 설치
    helm install longhorn longhorn/longhorn \
      --namespace longhorn-system \
      --values longhorn-values.yaml
    Longhorn 웹 UI 대시보드 볼륨 관리 화면

    ▲ Longhorn 웹 UI 대시보드: 볼륨 상태, 노드별 디스크 사용량, 복제본 상태를 한눈에 확인할 수 있습니다.

    실전: PVC 만들고 파드에 마운트하기

    StorageClass 확인

    설치가 완료됐으면 StorageClass가 잘 생성됐는지 먼저 확인해요:

    kubectl get storageclass
    
    # 출력 예시
    # NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION
    # longhorn (default)   driver.longhorn.io   Delete          Immediate           true

    (default) 표시가 붙어있으면 PVC 만들 때 StorageClass를 따로 지정 안 해도 Longhorn이 자동으로 사용돼요.

    PVC 생성하기

    이제 실제로 PVC를 만들어볼게요. 예시로 MySQL용 스토리지를 만들어보겠습니다:

    # mysql-pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-data-pvc
      namespace: default
    spec:
      accessModes:
        - ReadWriteOnce   # RWO: 하나의 노드에서만 읽기/쓰기
      storageClassName: longhorn
      resources:
        requests:
          storage: 10Gi   # 10GB 요청
    # PVC 생성
    kubectl apply -f mysql-pvc.yaml
    
    # PVC 상태 확인
    kubectl get pvc
    
    # 출력 예시
    # NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES
    # mysql-data-pvc   Bound    pvc-a1b2c3d4-...                          10Gi       RWO

    STATUS가 Bound로 바뀌면 PV가 자동 생성되고 연결된 거예요. 드디어 됐다! 🎉

    파드에 볼륨 마운트하기

    이제 이 PVC를 실제 파드에 붙여볼게요:

    # mysql-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
            - name: mysql
              image: mysql:8.0
              env:
                - name: MYSQL_ROOT_PASSWORD
                  value: "your-password"
              ports:
                - containerPort: 3306
              volumeMounts:
                - name: mysql-storage
                  mountPath: /var/lib/mysql   # 컨테이너 내부 마운트 경로
          volumes:
            - name: mysql-storage
              persistentVolumeClaim:
                claimName: mysql-data-pvc    # 위에서 만든 PVC 이름
    # 배포
    kubectl apply -f mysql-deployment.yaml
    
    # 파드 상태 확인
    kubectl get pods -l app=mysql
    
    # 볼륨 마운트 확인
    kubectl describe pod <파드이름> | grep -A 5 Volumes

    볼륨 확장(Expand)하기

    나중에 스토리지가 부족해지면 PVC를 확장할 수 있어요. 이거 진짜 편한 기능이거든요:

    # PVC 수정으로 볼륨 확장
    kubectl patch pvc mysql-data-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
    
    # 확장 상태 확인
    kubectl get pvc mysql-data-pvc
    
    # Conditions 항목에서 확장 진행 상황 확인
    kubectl describe pvc mysql-data-pvc

    ⚠️ 주의: Longhorn 볼륨 확장은 가능하지만 축소는 지원하지 않습니다. 처음부터 넉넉하게 잡기보다는 필요할 때 늘리는 방식이 좋아요.

    Longhorn 고급 기능 — 스냅샷과 백업

    볼륨 스냅샷 설정

    Longhorn의 숨겨진 킬러 기능 중 하나가 바로 스냅샷이에요. 쿠버네티스 VolumeSnapshot API와 연동해서 사용할 수 있습니다:

    # VolumeSnapshotClass 생성
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: longhorn-snapshot-class
    driver: driver.longhorn.io
    deletionPolicy: Delete
    # 스냅샷 생성
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: mysql-snapshot-20240101
    spec:
      volumeSnapshotClassName: longhorn-snapshot-class
      source:
        persistentVolumeClaimName: mysql-data-pvc
    # 스냅샷 확인
    kubectl get volumesnapshot
    
    # 스냅샷에서 PVC 복원
    # source 항목에 dataSource를 지정하면 됩니다

    RecurringJob으로 자동 스냅샷

    Longhorn에는 RecurringJob이라는 기능이 있어서 스냅샷을 자동으로 주기적으로 찍을 수 있어요. 이거 설정해두면 정말 마음이 편해지더라고요:

    # 매일 새벽 2시에 스냅샷, 최대 7개 보관
    apiVersion: longhorn.io/v1beta2
    kind: RecurringJob
    metadata:
      name: daily-snapshot
      namespace: longhorn-system
    spec:
      cron: "0 2 * * *"       # 크론 표현식
      task: snapshot
      groups:
        - default
      retain: 7               # 최대 7개 보관
      concurrency: 2
      labels:
        interval: daily

    ⚠️ 삽질 모음 — 트러블슈팅 가이드

    문제 1: PVC가 Pending 상태에서 안 넘어가요

    이거 정말 자주 겪는 문제예요. 저도 처음에 한참 헤맸거든요.

    # PVC 이벤트 확인
    kubectl describe pvc <pvc-name>
    
    # Longhorn 관련 파드 상태 확인
    kubectl -n longhorn-system get pods
    
    # 특정 파드 로그 확인
    kubectl -n longhorn-system logs -l app=longhorn-manager --tail=50

    대부분의 원인은:

    • 노드에 open-iscsi가 설치 안 됨 → 각 노드에 설치 후 iscsid 서비스 재시작
    • 디스크 여유 공간 부족 → kubectl -n longhorn-system get nodes.longhorn.io로 확인
    • Longhorn 파드 중 하나가 비정상 → 해당 파드 재시작

    문제 2: 볼륨이 Degraded(저하됨) 상태예요

    복제본 중 하나가 정상적으로 동기화 안 됐을 때 나타나요. Longhorn UI에서 확인하면 어느 노드의 복제본이 문제인지 바로 보여서 편합니다.

    # 볼륨 상태 확인
    kubectl -n longhorn-system get volumes.longhorn.io
    
    # 특정 볼륨 상세 확인
    kubectl -n longhorn-system describe volume.longhorn.io <volume-name>

    보통은 자동으로 복구되는데, 안 된다면 UI에서 해당 복제본을 삭제하고 재생성하면 해결돼요.

    문제 3: 노드 추가 후 스토리지가 인식이 안 돼요

    새 노드 추가 후 Longhorn이 디스크를 자동으로 추가하지 않을 때가 있어요. UI의 Node 탭에서 해당 노드 클릭 → Add Disk로 수동 추가하거나, 노드에 node.longhorn.io/create-default-disk: config 어노테이션을 추가하면 돼요.

    Longhorn 볼륨 복제본 분산 및 Degraded 상태 시각화

    ▲ Longhorn 볼륨 복제본 분산 현황: 각 노드에 복제본이 어떻게 분산되어 있는지, Degraded 상태 발생 시 어떤 노드에 문제가 있는지 확인할 수 있습니다.

    ✅ 설치 완료 후 검증하기

    전체 상태 한번에 확인하는 명령어

    # Longhorn 시스템 파드 전체 상태
    kubectl -n longhorn-system get pods
    
    # StorageClass 확인
    kubectl get storageclass
    
    # 현재 PV/PVC 목록
    kubectl get pv,pvc --all-namespaces
    
    # Longhorn 볼륨 목록
    kubectl -n longhorn-system get volumes.longhorn.io
    
    # 노드별 디스크 상태
    kubectl -n longhorn-system get nodes.longhorn.io

    실제 데이터 보존 테스트

    진짜 제대로 되는지 확인하려면 직접 테스트해보는 게 최고예요:

    # 파드에 접속해서 테스트 파일 생성
    kubectl exec -it <mysql-pod-name> -- bash
    # 컨테이너 내부에서
    echo "Longhorn 스토리지 테스트!" > /var/lib/mysql/test.txt
    exit
    
    # 파드 강제 삭제
    kubectl delete pod <mysql-pod-name>
    
    # 새 파드가 자동으로 올라옴
    kubectl get pods -w
    
    # 새 파드에서 파일 확인
    kubectl exec -it <새-mysql-pod-name> -- cat /var/lib/mysql/test.txt
    # "Longhorn 스토리지 테스트!" 가 출력되면 성공! 🎉

    이게 출력되면 진짜 영구 스토리지가 제대로 동작하는 거예요. 처음 이 테스트 통과했을 때 얼마나 뿌듯했던지 ㅎㅎ

    Longhorn vs 다른 쿠버네티스 스토리지 솔루션 비교

    솔루션 특징 장점 단점 추천 환경
    Longhorn 쿠버네티스 전용 분산 블록 스토리지 웹 UI, 쉬운 설치, 스냅샷/백업 성능이 Ceph보단 낮음 홈랩, 중소규모 클러스터
    Rook-Ceph Ceph 기반 엔터프라이즈급 스토리지 높은 성능, 다양한 스토리지 타입 복잡한 설치/운영, 리소스 많이 사용 대규모 프로덕션
    NFS Provisioner NFS 서버 기반 동적 프로비저닝 간단, 기존 NFS 서버 활용 가능 HA 미지원, 성능 한계 소규모, 테스트 환경
    OpenEBS 경량 분산 스토리지 다양한 엔진 선택 가능 엔진별 기능 차이 있음 엣지, 경량 환경

    홈랩이나 중소규모 환경이라면 Longhorn이 가성비 최고라고 생각해요. 운영 복잡도 대비 기능이 충실하거든요.

    쿠버네티스 스토리지 솔루션 Longhorn Rook-Ceph NFS 비교 인포그래픽

    ▲ 쿠버네티스 스토리지 솔루션 비교: Longhorn, Rook-Ceph, NFS Provisioner의 사용 환경과 특성을 한눈에 비교한 인포그래픽입니다.

    자주 묻는 질문 (FAQ)

    Q. 노드가 2개밖에 없는데 Longhorn 써도 되나요?

    A. 네, 됩니다. 다만 defaultReplicaCount를 2로 설정하세요. 노드 수보다 복제본 수가 많으면 Longhorn 볼륨이 Degraded 상태가 됩니다.

    Q. ReadWriteMany(RWX) 지원하나요?

    A. Longhorn v1.1부터 NFS 기반으로 RWX(여러 노드에서 동시 읽기/쓰기)를 지원합니다. 단, 블록 스토리지 기반 RWX보다 성능이 낮을 수 있어요.

    Q. 기존 로컬 PV 데이터를 Longhorn으로 마이그레이션할 수 있나요?

    A. 직접 마이그레이션 기능은 없어요. 보통 애플리케이션 레벨에서 데이터를 백업 후 새 Longhorn PVC에 복원하는 방식을 사용합니다.

    Q. Longhorn UI에 외부에서 접근하려면 어떻게 하나요?

    A. Ingress를 설정하면 돼요. 단, 반드시 인증(Basic Auth 등)을 걸어두세요. 외부에 무방비로 열면 안 됩니다.

    마무리 — 이제 데이터 걱정 없이 쿠버네티스 쓰세요 🎉

    오늘 Longhorn 설치부터 PV/PVC 관리, 스냅샷, 트러블슈팅까지 쭉 훑어봤는데요. 처음 보면 복잡해 보이지만 한번 설치해놓으면 이후 운영은 생각보다 편합니다.

    제가 정리한 핵심 포인트:

    • ✅ 설치 전 open-iscsi 반드시 설치 — 이거 빠뜨리면 PVC가 Pending에서 안 풀림
    • ✅ 복제본 수는 노드 수에 맞게 — 노드 2개면 replica 2, 3개면 3
    • ✅ RecurringJob으로 자동 스냅샷 — 데이터 보험 필수
    • ✅ UI 접근에 인증 설정 — 보안 필수
    • ✅ 볼륨 확장은 가능, 축소는 불가 — 처음부터 너무 크게 잡지 말 것

    다음 글에서는 Longhorn 백업을 S3 호환 오브젝트 스토리지(MinIO)와 연동하는 방법을 다뤄볼 예정이에요. 백업까지 자동화하면 진짜 마음 편하거든요. 이전 글에서 다룬 MetalLB + Ingress 설정과 함께 구성하면 완성도 높은 홈랩 환경이 만들어집니다.

    혹시 설치하다가 막히는 부분 있으면 댓글로 남겨주세요. 제가 겪은 삽질 경험을 바탕으로 같이 해결해봐요! 😄

  • [NAS] Synology DSM 7.2 vs 7.3 비교: 내 환경에 맞는 버전 선택법

    [NAS] Synology DSM 7.2 vs 7.3 비교: 내 환경에 맞는 버전 선택법

    업그레이드할까, 말까? DSM 버전 선택의 기로에서

    NAS를 운영하다 보면 어느 날 갑자기 알림이 뜨죠. “DSM 새 버전이 출시되었습니다.” 저도 처음엔 무조건 업그레이드하는 편이었는데, 몇 번 삽질을 겪고 나서부터는 좀 신중해졌거든요. 특히 홈랩이 아니라 실제 업무에 쓰는 NAS라면 더더욱요.

    요즘 Synology DSM 7.2 vs 7.3 비교에 대한 질문을 커뮤니티에서 정말 많이 보더라고요. “7.3으로 올려도 되나요?”, “7.2랑 뭐가 다른가요?” 이런 질문들 말이에요. 13년 동안 인프라를 만지다 보니 이런 버전 비교가 얼마나 중요한지 잘 알고 있습니다. 성급하게 올렸다가 특정 패키지가 안 되거나, 예상치 못한 동작 변화로 밤새 고생한 적이 한두 번이 아니거든요.

    그래서 오늘은 Synology DSM 비교를 제대로 해보려고 합니다. 단순히 “7.3이 더 최신이니까 좋다”가 아니라, 각 버전의 실제 특징과 내 환경에 맞는 선택이 뭔지 함께 살펴보겠습니다.

    Synology DSM 7.2 vs 7.3 버전 비교 개요 다이어그램

    ▲ DSM 7.2와 7.3의 주요 변경사항을 한눈에 정리한 개요도. 두 버전의 핵심 차이를 시각적으로 비교해보세요.

    DSM이 뭔지 잠깐 짚고 가자면 (NAS 운영체제 기초)

    DSM(DiskStation Manager)은 Synology NAS에 탑재된 운영체제(OS)입니다. 쉽게 말해, Synology NAS의 두뇌 역할을 하는 소프트웨어죠. 윈도우나 macOS처럼 웹 브라우저로 접속해서 파일 관리, 패키지 설치, 네트워크 설정 등 모든 걸 할 수 있어요.

    DSM은 버전이 올라갈수록 보안 패치, 새로운 기능, 성능 개선이 이루어집니다. 근데 여기서 중요한 포인트! 버전이 높다고 무조건 내 환경에 맞는 건 아니에요. 특히 다음과 같은 경우라면 더 신중하게 봐야 합니다.

    • 오래된 Synology 모델을 사용 중인 경우
    • 특정 서드파티 패키지에 의존하는 경우
    • 24/7 무중단 운영이 필요한 비즈니스 환경
    • Docker나 Virtual Machine Manager를 적극 활용하는 경우

    DSM 7.2: 안정성의 대명사

    DSM 7.2는 2023년에 출시되어 꽤 오랜 기간 안정화된 버전입니다. 제가 실제로 메인 NAS(DS923+)에서 7.2를 꽤 오래 써봤는데, 솔직히 말해서 “이거 진짜 안정적이다”라는 인상을 받았어요.

    DSM 7.2의 주요 특징

    • 불변 스냅샷(Immutable Snapshot): 랜섬웨어 공격에도 스냅샷을 보호할 수 있는 기능. 이거 진짜 중요한 기능입니다.
    • SMB 멀티채널(SMB Multichannel): 네트워크 카드 여러 개를 묶어서 파일 전송 속도를 높이는 기능
    • SSD 캐시 어드바이저(SSD Cache Advisor): SSD 캐시 설정 최적화 도우미
    • WORM(Write Once Read Many) 지원 강화: 데이터 보존 정책 관련
    • 개선된 Storage Pool 관리: 스토리지 풀(저장공간 묶음) 관리 UI 개선

    7.2는 출시된 지 시간이 지나면서 마이너 업데이트(7.2-64570 등)가 꾸준히 나와서, 알려진 버그들이 대부분 수정된 상태예요. 저도 처음엔 헷갈렸는데, 이 “마이너 업데이트”들이 쌓이면 실제로 상당히 안정적인 환경을 만들어주더라고요.

    DSM 7.3: 새로운 기능의 최전선

    DSM 7.3은 최신 버전으로, 2024년에 출시되었습니다. 제가 홈랩 테스트용 DS220+에 설치해서 써봤는데, 확실히 눈에 띄는 변화들이 있더라고요.

    DSM 7.3의 주요 특징

    • Synology Photos 대폭 개선: AI 얼굴 인식 정확도 향상, 앨범 공유 기능 강화
    • Storage Analyzer 개선: 스토리지 분석 도구가 더 직관적으로 바뀌었어요
    • Active Directory 연동 개선: 기업 환경에서 AD(액티브 디렉토리, 사용자 계정 통합 관리 시스템) 연동이 더 매끄러워짐
    • 보안 강화: 2FA(이중 인증) 정책 강화, 비밀번호 정책 세분화
    • 하이퍼백업(Hyper Backup) 성능 향상: 백업 속도와 복원 안정성 개선
    • 네트워크 설정 UI 개편: 인터페이스가 더 정리된 느낌

    처음 7.3을 설치했을 때 “어, 여기 이게 바뀌었네?” 하는 순간이 몇 번 있었어요. 특히 사진 관련 기능을 많이 쓰시는 분들은 체감 차이가 꽤 크더라고요.

    DSM 7.3 새로운 기능 대시보드 비교 화면

    ▲ DSM 7.3에서 새롭게 개편된 주요 기능들. Photos 개선, 보안 강화, Storage Analyzer 업데이트 등 눈에 띄는 변화들을 확인할 수 있습니다.

    DSM 7.2 vs 7.3 비교표

    말로만 하면 헷갈리니까, 표로 정리해볼게요. 제가 직접 써보면서 느낀 점들을 반영했습니다.

    항목 DSM 7.2 DSM 7.3
    안정성 ⭐⭐⭐⭐⭐ 매우 안정적 ⭐⭐⭐⭐ 안정적 (개선 중)
    보안 패치 지속 제공 중 최신 패치 포함
    Synology Photos 기본 기능 AI 개선, 공유 강화
    SMB 멀티채널 ✅ 지원 ✅ 지원 (개선)
    불변 스냅샷 ✅ 지원 ✅ 지원
    Active Directory 기본 지원 개선된 연동
    Hyper Backup 안정적 성능 향상
    Docker/Container Manager 안정적 일부 호환성 확인 필요
    구형 모델 지원 더 넓은 지원 범위 일부 구형 모델 제외 가능
    서드파티 패키지 호환성 검증 완료 일부 미검증
    권장 대상 안정성 우선, 비즈니스 환경 최신 기능 원하는 홈 유저

    ⚠️ 업그레이드 전 꼭 확인해야 할 것들

    여기서 제가 직접 겪은 삽질 경험을 좀 공유해야 할 것 같아요. 실제로 DSM을 업그레이드하다가 낭패를 본 경우들이 있거든요.

    1. 내 NAS 모델이 지원되는지 먼저 확인

    DSM 7.3은 일부 구형 모델을 지원하지 않을 수 있습니다. Synology 공식 호환성 목록을 반드시 확인하세요. 저도 예전에 DS718+를 쓸 때 버전 호환성 문제로 한참 고생했었는데, 사전에 확인만 했어도 됐을 일이었어요.

    2. 서드파티 패키지 호환성 체크

    이게 진짜 중요합니다. Plex Media Server, SurveillanceStation, 또는 직접 설치한 커뮤니티 패키지들이 7.3에서 정상 동작하는지 미리 확인하세요. 커뮤니티 포럼에서 같은 패키지를 쓰는 사람들의 후기를 보는 게 제일 빠릅니다.

    3. 업그레이드 전 반드시 백업

    이건 당연한 얘기지만, 실제로 안 하는 분들이 많더라고요. DSM 업그레이드 전에는 반드시 설정 백업(Configuration Backup)과 중요 데이터 백업을 먼저 하세요.

    # DSM 설정 백업 (웹 UI 경로)
    # 제어판 > 업데이트 및 복원 > 설정 백업
    # 또는 SSH 접속 후 아래 경로 확인
    ls /var/packages/  # 설치된 패키지 목록 확인
    cat /etc/synoinfo.conf  # 시스템 설정 파일 확인

    4. Docker 컨테이너 사용자라면 특히 주의

    Container Manager(구 Docker 패키지)를 많이 활용하고 계신 분들은 7.3 업그레이드 후 일부 네트워크 설정이나 볼륨 마운트 방식이 바뀌어 있을 수 있어요. 제가 테스트할 때 Portainer 연동에서 잠깐 이슈가 있었거든요. 업그레이드 후 컨테이너 상태를 꼭 확인하세요.

    # SSH 접속 후 컨테이너 상태 확인
    docker ps -a
    docker network ls
    
    # 문제 발생 시 컨테이너 로그 확인
    docker logs [컨테이너_이름] --tail 50

    5. 업그레이드는 낮 시간대에 (야간 업그레이드 금지!)

    이건 경험에서 나온 조언인데요, NAS 업그레이드는 반드시 본인이 모니터링할 수 있는 시간대에 하세요. 저는 한 번 야간에 자동 업데이트 켜놨다가 아침에 일어나보니 NAS가 응답 없는 상태여서 식은땀 흘렸던 적이 있어요. 다행히 재부팅으로 해결됐지만요.

    내 상황에 맞는 DSM 버전 선택 가이드

    “그래서 뭘 써야 하나요?”라는 질문에 답해드릴게요. 상황별로 정리해봤습니다.

    ✅ DSM 7.2를 유지하는 게 나은 경우

    • 소규모 비즈니스나 사무실 환경에서 사용 중인 경우
    • 특정 서드파티 패키지(Plex, Surveillance Station 등)에 강하게 의존하는 경우
    • 구형 Synology 모델(2018년 이전 출시 모델)을 사용 중인 경우
    • 현재 아무 문제 없이 잘 쓰고 있는 경우 (“돌아가고 있으면 건드리지 마라”는 인프라 격언이 있죠)
    • Docker/Container Manager로 많은 서비스를 운영 중인 경우

    ✅ DSM 7.3으로 업그레이드하면 좋은 경우

    • Synology Photos를 메인으로 사용하는 홈 유저
    • 최신 보안 패치가 최우선인 경우
    • Active Directory 연동을 더 잘 활용하고 싶은 경우
    • Hyper Backup 성능 개선이 필요한 경우
    • 최신 모델(DS923+, DS1823xs+ 등) 사용자

    💡 결론적으로 제 추천은?

    솔직히 말씀드리면, 홈 유저라면 7.3으로 올리세요. 새 기능들이 실생활에 유용하고, 보안 패치도 최신으로 받을 수 있으니까요. 단, 위에서 언급한 사전 확인 작업은 꼭 하시고요.

    반면에 업무용이거나 특정 패키지 의존성이 높다면 7.2를 좀 더 유지하시는 걸 추천합니다. 7.3이 좀 더 안정화될 때까지 기다리는 것도 나쁘지 않아요. 인프라에서 “최신 = 최선”은 아닌 경우가 많거든요.

    DSM 7.2와 7.3 버전 선택 결정 흐름도

    ▲ 내 환경에 맞는 DSM 버전 선택 흐름도. 사용 목적과 환경에 따라 7.2 유지 또는 7.3 업그레이드를 결정하는 기준을 시각화했습니다.

    DSM 7.3 업그레이드 방법 (직접 해봤습니다)

    업그레이드하기로 결심했다면, 절차를 같이 보실게요. 제가 홈랩에서 직접 한 순서대로 정리했습니다.

    1. 현재 DSM 버전 확인: 제어판(Control Panel) → 정보 센터(Info Center) → DSM 버전 확인
    2. 설정 백업: 제어판 → 업데이트 및 복원 → 설정 백업 → 내보내기
    3. 패키지 목록 저장: 패키지 센터에서 설치된 패키지 목록 메모 또는 스크린샷
    4. 데이터 백업 확인: Hyper Backup 또는 외장 드라이브에 최신 백업 존재 여부 확인
    5. 업데이트 실행: 제어판 → 업데이트 및 복원 → DSM 업데이트 → 지금 업데이트
    6. 재부팅 대기: 업그레이드 후 자동 재부팅. 보통 10~15분 소요
    7. 패키지 재확인: 재부팅 후 모든 패키지 정상 동작 확인
    8. Docker 컨테이너 확인: Container Manager에서 모든 컨테이너 상태 점검
    # 업그레이드 후 SSH로 접속해서 버전 확인
    cat /etc.defaults/VERSION
    
    # 출력 예시
    # majorversion="7"
    # minorversion="3"
    # productversion="7.3-69057"
    
    # 시스템 로그 확인 (업그레이드 관련 오류 체크)
    tail -f /var/log/messages | grep -i error

    드디어 7.3 버전 확인이 되면 기분이 묘하게 좋더라고요. 물론 그 다음에 패키지 하나하나 다시 확인하는 게 좀 번거롭긴 하지만요.

    자주 묻는 질문 (FAQ)

    Q. DSM 7.3으로 올렸다가 다시 7.2로 내릴 수 있나요?

    안타깝게도 DSM 다운그레이드는 공식적으로 지원되지 않습니다. 이게 업그레이드 전에 신중하게 고민해야 하는 이유예요. 강제로 다운그레이드하는 방법이 있긴 한데, 데이터 손실 위험이 있어서 권장하지 않습니다.

    Q. 자동 업데이트를 켜놔도 되나요?

    보안 패치(Security Update)의 자동 업데이트는 켜두는 걸 추천합니다. 근데 DSM 메이저/마이너 버전 업그레이드 자동화는 개인적으로 비추예요. 제가 앞서 말한 것처럼, 예기치 않은 시간에 업그레이드되면 대응하기 어렵거든요.

    Q. 7.2에서 7.3으로 올리면 데이터가 날아가나요?

    정상적인 업그레이드 절차를 따르면 데이터는 유지됩니다. DSM 업그레이드는 운영체제만 업데이트하고 볼륨(데이터 저장 공간)은 건드리지 않아요. 그래도 백업은 필수입니다. 혹시 모를 상황에 대비해서요.

    Q. DSM 7.3 설치 후 NAS가 느려졌다는 분들이 있던데요?

    초기 업그레이드 직후에는 인덱싱(Indexing, 파일 목록 재구성) 작업이 백그라운드에서 돌아서 일시적으로 느릴 수 있어요. 보통 수 시간~하루 정도 지나면 정상으로 돌아옵니다. 저도 처음엔 “뭔가 잘못됐나?” 싶었는데, 기다리니까 해결됐더라고요.

    마무리: 버전보다 중요한 건 내 환경 파악

    오늘 Synology DSM 7.2 vs 7.3 비교를 꽤 자세히 살펴봤는데요, 결국 핵심은 이거예요. “최신이 항상 최선은 아니다.” 내 NAS가 어떤 용도로 쓰이고 있는지, 어떤 패키지에 의존하고 있는지를 먼저 파악하는 게 버전 선택보다 더 중요합니다.

    13년 동안 인프라를 운영하면서 배운 게 있다면, 변경은 항상 되돌아올 길을 확보하고 해야 한다는 거예요. 백업, 설정 저장, 호환성 확인. 이 세 가지만 잘 지켜도 업그레이드 관련 사고는 거의 없습니다.

    혹시 아직 7.1 버전을 쓰고 계신 분들도 있으시다면, 7.2로의 업그레이드는 거의 필수라고 봅니다. 7.2에서 추가된 보안 기능들이 꽤 중요하거든요. 그 이야기는 다음 글에서 자세히 다뤄볼게요.

    Synology DSM 관련해서 궁금한 점이 있으시면 댓글로 남겨주세요. 제가 직접 테스트해보고 답변드릴 수 있는 건 최대한 해드리겠습니다. 🎉

    DSM 7.2 vs 7.3 홈 유저와 비즈니스 환경별 최종 비교 요약 인포그래픽

    ▲ DSM 7.2 vs 7.3 최종 비교 요약 인포그래픽. 홈 유저와 비즈니스 환경별로 어떤 버전이 적합한지 한눈에 확인하세요.

  • [k8s] k3s vs MicroK8s: 2026년 9월 기준 경량 쿠버네티스 비교 분석 및 선택 가이드

    [k8s] k3s vs MicroK8s: 2026년 9월 기준 경량 쿠버네티스 비교 분석 및 선택 가이드

    경량 쿠버네티스, 왜 지금 이 선택이 중요한가요?

    홈랩에 쿠버네티스를 올리려고 처음 도전했을 때가 생각나네요. 풀스택 쿠버네티스를 라즈베리파이 클러스터에 올렸다가 메모리가 터져서 노드가 죽어버리는 경험을 했거든요. 그때 처음 알게 된 게 바로 경량 쿠버네티스(Lightweight Kubernetes)라는 개념이었습니다.

    요즘은 엣지 컴퓨팅, IoT, 홈랩 쿠버네티스, 로컬 개발 환경, 소규모 프로덕션 클러스터까지 쿠버네티스를 돌려야 하는 상황이 정말 많아졌죠. 그런데 풀 쿠버네티스를 그대로 올리기엔 리소스 부담이 큽니다. 그래서 여전히 많은 분들이 k3s vs MicroK8s라는 주제로 고민하세요.

    저도 실제로 두 가지를 모두 운영해봤습니다. 홈랩 서버에서는 k3s를 오래 써왔고, 개발 팀 환경 구성이나 Ubuntu 기반 테스트 환경에서는 MicroK8s도 여러 번 써봤거든요. 이번 글에서는 2026년 9월 기준으로 바뀐 내용까지 반영해서, 어떤 상황에서 뭘 선택해야 하는지 현실적으로 정리해보겠습니다.

    k3s와 MicroK8s 경량 쿠버네티스 아키텍처 비교 다이어그램

    ▲ k3s와 MicroK8s의 전체 아키텍처 개요 — 두 경량 쿠버네티스의 구조적 차이를 한눈에 비교한 다이어그램


    k3s와 MicroK8s가 뭔지 먼저 짚고 가요

    k3s — 더 이상 40MB는 아니지만 여전히 가장 가벼운 축

    k3s는 Rancher Labs, 현재 SUSE에서 만든 경량 쿠버네티스 배포판입니다. 이름의 k3s는 k8s보다 더 가볍다는 의미에서 붙은 이름이고요. 요즘 기준으로는 100MB 안팎의 단일 바이너리라고 보는 게 더 정확합니다. 예전처럼 40MB짜리 쿠버네티스라고 딱 잘라 말하긴 어렵지만, 여전히 경량 쿠버네티스 대표 주자라는 건 변함이 없어요.

    주요 특징을 보면:

    • 단일 바이너리 중심 배포 — 설치가 정말 간단해요
    • 기본 스토리지 백엔드는 SQLite, 고가용성(HA)은 임베디드 etcd 또는 외부 DB 선택 가능
    • ARM 아키텍처 지원이 매우 좋아서 라즈베리파이 쿠버네티스 용도로 강함
    • containerd, Flannel, CoreDNS, Traefik, ServiceLB, local-path-provisioner 등을 기본 제공
    • 엣지 쿠버네티스, IoT, 에어갭 환경, 홈랩에 특히 잘 맞음
    • 2026년 9월 기준 최신 주요 릴리스 흐름은 Kubernetes 1.37 기반 k3s 1.37 계열까지 올라왔고, 1.34/1.35 계열도 패치 릴리스가 계속 제공되는 상황

    MicroK8s — Canonical이 만든 스냅 패키지 쿠버네티스

    MicroK8s는 Ubuntu를 만든 Canonical에서 개발한 경량 쿠버네티스입니다. 여전히 가장 큰 특징은 snap 패키지로 설치된다는 점이에요. Ubuntu 기반 서버나 개발용 워크스테이션에서는 정말 편합니다.

    • snap 패키지로 설치 — Ubuntu/Debian 계열에서 매우 간편
    • 애드온 시스템으로 기능 확장 — 필요한 것만 켜고 끄는 구조
    • 단일 노드부터 멀티노드, 고가용성 클러스터까지 지원
    • DNS, hostpath 스토리지, Ingress, MetalLB, GPU, observability 등 애드온 활성화가 쉬움
    • CNCF 인증 쿠버네티스 — 표준 호환성 높음
    • 업스트림 쿠버네티스 버전을 빠르게 따라가는 편이지만, 실제 설치 전에는 snap info microk8s로 채널별 최신 버전을 확인하는 게 안전함

    k3s vs MicroK8s 핵심 스펙 비교표

    말로만 설명하면 헷갈리니까 표로 정리해봤습니다. 특히 2026년 기준으로 바뀐 부분은 MicroK8s의 대시보드 제거, Ingress 애드온의 Traefik 전환, Gateway API 중요도 상승입니다.

    항목 k3s MicroK8s
    개발사 SUSE (원 개발: Rancher Labs) Canonical
    설치 방식 curl 스크립트 / 단일 바이너리 snap 패키지
    최소 메모리 약 512MB 수준부터 시작 가능 약 540MB 이상 권장
    기본 스토리지 백엔드 SQLite / 임베디드 etcd / 외부 DB dqlite 기반 HA 데이터스토어
    기본 컨테이너 런타임 containerd containerd
    기본 Ingress Traefik 포함 없음. microk8s enable ingress로 활성화, 최신 계열은 Traefik 기반
    Gateway API k3s 1.37부터 Gateway API CRD 번들 제공 Ingress 애드온과 Traefik 구성에서 Gateway API 흐름이 중요해짐
    ARM 지원 매우 강함 지원
    멀티노드 클러스터 비교적 단순 지원, HA 기본 지원 구조
    애드온 시스템 내장 컴포넌트 + Helm Chart 패턴 microk8s enable 명령어
    주요 사용 환경 엣지, IoT, 홈랩, 경량 프로덕션 개발 환경, Ubuntu 기반 서버, 빠른 테스트랩
    CNCF 인증 지원 지원

    포인트: 메모리 차이보다 더 중요한 건 운영 모델입니다. k3s는 최대한 작고 단순하게, MicroK8s는 Ubuntu 생태계에서 빠르게 확장 가능하게 쪽에 더 가깝습니다.


    실전 설치 및 구성 — 직접 해봤습니다

    k3s와 MicroK8s 터미널 설치 과정 단계별 화면

    ▲ k3s와 MicroK8s 실제 설치 과정 — 터미널에서 진행되는 단계별 설치 명령어 실행 화면

    k3s 설치 — 진짜 이렇게 쉬울 수가

    # k3s 서버 설치
    curl -sfL https://get.k3s.io | sh -
    
    # 설치 확인
    sudo k3s kubectl get nodes
    
    # 노드 토큰 확인
    sudo cat /var/lib/rancher/k3s/server/node-token

    워커 노드 추가

    curl -sfL https://get.k3s.io | K3S_URL=https://마스터IP:6443 K3S_TOKEN=서버토큰값 sh -

    kubeconfig 설정

    mkdir -p ~/.kube
    sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
    sudo chown $(id -u):$(id -g) ~/.kube/config
    chmod 600 ~/.kube/config
    sed -i 's/127.0.0.1/마스터서버IP/g' ~/.kube/config
    kubectl get nodes

    주의: kubeconfig 권한이 너무 넓으면 kubectl이 경고를 냅니다. chmod 600 ~/.kube/config까지 같이 해두는 게 깔끔해요.

    k3s 추가 설정 — Traefik 비활성화 또는 버전 고정

    # Traefik 없이 설치
    curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--disable traefik" sh -
    
    # 특정 버전 지정 설치 예시. 실제 최신 패치는 릴리스 노트 확인 권장
    curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.37.0+k3s1" sh -

    k3s 고가용성(HA) 시작점

    # 첫 서버를 embedded etcd 기반 HA 초기 노드로 시작
    curl -sfL https://get.k3s.io | sh -s - server --cluster-init
    
    # 이후 추가 서버 조인
    curl -sfL https://get.k3s.io | K3S_URL=https://첫서버IP:6443 K3S_TOKEN=서버토큰값 sh -s - server

    MicroK8s 설치 — Ubuntu라면 더 편해요

    # 설치 전 채널 확인
    snap info microk8s
    
    # snap으로 MicroK8s 설치. 운영 환경은 버전 채널을 명시하는 편이 안전합니다.
    sudo snap install microk8s --classic --channel=1.36/stable
    
    sudo usermod -a -G microk8s $USER
    mkdir -p ~/.kube
    sudo chown -f -R $USER ~/.kube
    newgrp microk8s
    
    microk8s status --wait-ready
    microk8s kubectl get nodes

    MicroK8s 핵심 애드온 활성화

    microk8s enable dns
    microk8s enable hostpath-storage
    microk8s enable ingress
    microk8s enable metallb:192.168.1.200-192.168.1.220
    microk8s enable dns hostpath-storage ingress

    예전 글이나 오래된 튜토리얼에는 microk8s enable dashboard가 자주 나오는데요. MicroK8s 1.36부터 dashboard 애드온과 dashboard-proxy 명령은 제거됐습니다. 웹 UI가 필요하다면 Lens, Headlamp, Argo CD, Rancher 같은 별도 도구를 검토하는 쪽이 현실적입니다.

    MicroK8s kubectl 별칭 설정

    alias kubectl='microk8s kubectl'
    alias k='microk8s kubectl'
    microk8s config > ~/.kube/microk8s-config
    export KUBECONFIG=~/.kube/config:~/.kube/microk8s-config

    MicroK8s 멀티노드 클러스터 구성

    microk8s add-node
    microk8s join 마스터IP:25000/토큰값/해시값
    microk8s join 마스터IP:25000/토큰값/해시값 --worker
    microk8s kubectl get nodes

    실제 삽질 포인트와 트러블슈팅

    k3s 트러블슈팅

    문제 1: 방화벽 때문에 워커 노드가 조인이 안 돼요

    sudo ufw allow 6443/tcp
    sudo ufw allow 10250/tcp
    sudo ufw allow 8472/udp
    sudo ufw allow 51820/udp
    sudo k3s kubectl get nodes -o wide
    sudo journalctl -u k3s -f

    문제 2: SQLite에서 HA로 커지기 시작할 때

    단일 노드면 SQLite도 충분합니다. 다만 처음부터 고가용성 운영을 할 거면 embedded etcd로 시작하는 게 가장 깔끔해요. 중간에 뒤늦게 구조를 바꾸면 생각보다 손이 많이 갑니다.

    curl -sfL https://get.k3s.io | sh -s - server --cluster-init

    문제 3: 이미지 pull 속도가 너무 느려요

    # /etc/rancher/k3s/registries.yaml
    mirrors:
      docker.io:
        endpoint:
          - "https://mirror.gcr.io"
      "내부레지스트리주소:5000":
        endpoint:
          - "http://내부레지스트리주소:5000"
    configs:
      "내부레지스트리주소:5000":
        auth:
          username: admin
          password: password
        tls:
          insecure_skip_verify: true
    sudo systemctl restart k3s

    MicroK8s 트러블슈팅

    문제 1: snap/커널 조합 때문에 설치가 꼬여요

    uname -r
    microk8s inspect
    sudo snap refresh microk8s --channel=1.36/stable

    문제 2: 예전 튜토리얼대로 dashboard 접근이 안 돼요

    이건 사용자가 잘못한 게 아니라, 최신 버전에서 절차가 바뀐 것입니다. MicroK8s 1.36부터는 dashboard 애드온과 microk8s dashboard-proxy가 제거됐어요. 따라서 예전 방식으로는 당연히 안 됩니다.

    문제 3: snap 자동 업데이트로 버전이 올라가버려요

    sudo snap refresh --hold microk8s
    sudo snap refresh --hold=forever microk8s
    snap refresh --time

    MicroK8s는 같은 채널 안에서는 자동 refresh가 일어날 수 있습니다. 운영 환경이라면 채널 고정, hold 정책, 업그레이드 테스트 순서를 미리 정해두는 게 좋습니다.


    실제 운영 결과 및 성능 비교

    k3s와 MicroK8s 리소스 사용량 성능 모니터링 대시보드 비교

    ▲ k3s와 MicroK8s 리소스 사용량 모니터링 대시보드 — CPU, 메모리 사용량 실시간 비교 차트

    동일한 스펙의 VM 두 대에 각각 설치해서 비교해봤습니다. 수치는 환경과 활성화한 애드온에 따라 달라질 수 있으니 참고용으로 봐주세요.

    유휴 상태(Idle) 리소스 사용량

    측정 항목 k3s MicroK8s
    메모리 사용량 약 450MB~600MB 약 550MB~750MB
    CPU 사용률 유휴 시 0.5% 이하인 경우가 많음 유휴 시 1~2% 수준인 경우가 많음
    준비 시간 약 15~30초 약 30~60초
    디스크 사용량 상대적으로 작음 snap 포함 시 더 큼

    k3s가 전반적으로 더 가벼운 편이긴 한데, 이 차이는 정말 빡빡한 ARM 보드나 소형 엣지 장비에서 더 크게 느껴집니다. 일반적인 VM이나 미니 PC 수준에선 완전히 다른 세상 정도는 아니에요.

    Pod 배포 속도 테스트

    time kubectl create deployment nginx-test --image=nginx --replicas=5
    kubectl rollout status deployment/nginx-test

    결론적으로 두 환경 모두 배포 체감은 비슷했습니다. 실제 차이는 컨테이너 이미지 pull, CNI 초기화, 스토리지 프로비저너 상태 같은 주변 요소에서 더 많이 납니다.


    어떤 걸 선택해야 할까요? — 상황별 가이드

    k3s를 선택해야 하는 경우

    • 라즈베리파이, 임베디드 시스템 등 ARM 기반 엣지 환경
    • 멀티노드 클러스터를 간단하게 구성하고 싶을 때
    • Ubuntu 외 다른 Linux 배포판을 사용할 때
    • 프로덕션 엣지 배포가 목적일 때
    • 인터넷 연결이 불안정하거나 에어갭 설치가 필요한 환경
    • 홈랩 쿠버네티스를 최대한 가볍게 운영하고 싶을 때
    • Gateway API CRD 번들 제공 같은 최신 k3s 1.37 흐름을 활용하고 싶을 때

    MicroK8s를 선택해야 하는 경우

    • Ubuntu 기반 개발 환경에서 빠르게 쿠버네티스 셋업
    • 애드온 시스템으로 간편하게 기능 확장하고 싶을 때
    • Canonical/Ubuntu 생태계를 이미 사용 중일 때
    • 개발자가 로컬에서 표준 쿠버네티스 환경이 필요할 때
    • GPU 워크로드나 observability 애드온을 빨리 붙여보고 싶을 때
    • snap 기반 설치와 채널 관리 모델이 조직 운영 방식에 잘 맞을 때

    둘 다 아닌 경우도 있어요

    개발 환경에서 쿠버네티스가 필요한데 설치도 귀찮고 리소스도 아끼고 싶다면, kind(Kubernetes in Docker)나 minikube도 충분히 좋은 선택입니다. 특히 CI 파이프라인이나 일회성 테스트 환경은 kind가 더 깔끔할 때가 많아요.


    자주 묻는 질문 (FAQ)

    Q. k3s와 MicroK8s 중 어느 게 더 프로덕션에 적합한가요?

    엣지, 홈랩, 소규모 서비스 운영처럼 가볍고 단순한 운영이 중요하면 k3s 쪽을 먼저 봅니다. Ubuntu 표준 환경, snap 기반 배포, 애드온 중심 운영이 편한 팀이라면 MicroK8s도 충분히 좋은 선택입니다.

    Q. 라즈베리파이에는 뭘 써야 하나요?

    개인적으로는 k3s를 먼저 추천합니다. ARM 지원, 설치 단순성, 리소스 사용량 면에서 라즈베리파이 쿠버네티스와 잘 맞습니다.

    Q. 기존 kubectl 명령어를 그대로 쓸 수 있나요?

    네. k3s는 k3s kubectl 또는 일반 kubectl을 사용할 수 있고, MicroK8s는 microk8s kubectl을 쓰거나 alias/kubeconfig를 설정하면 됩니다.

    Q. 풀 쿠버네티스에서 k3s/MicroK8s로 마이그레이션이 쉬운가요?

    기본 리소스는 대부분 비슷하지만, Ingress Controller, StorageClass, LoadBalancer, CNI, CSI 드라이버 차이에서 손볼 일이 생깁니다. 특히 2026년 기준으로는 Ingress와 Gateway API 전략을 함께 검토하는 게 좋습니다.


    2026년 9월 기준, 꼭 알아야 할 최신 변화

    1. MicroK8s는 이제 대시보드 기본 경로를 기대하면 안 됩니다

    MicroK8s 1.36부터 dashboard 관련 기능이 제거됐습니다. 예전처럼 microk8s enable dashboard와 microk8s dashboard-proxy를 기대하면 막힙니다. 운영 가시성이 필요하다면 Headlamp, Lens, Grafana, Argo CD UI 같은 대안을 선택하는 편이 낫습니다.

    2. Ingress와 Traefik, Gateway API 변화는 생각보다 영향이 큽니다

    MicroK8s의 ingress 애드온은 최신 계열에서 Traefik 중심으로 바뀌었고, k3s도 기본 Ingress Controller로 Traefik을 포함합니다. 여기에 k3s 1.37부터는 Gateway API CRD가 번들로 제공되기 시작했습니다. 앞으로 새 클러스터를 만든다면 단순히 Ingress만 볼 게 아니라 Kubernetes Gateway API, Traefik Gateway, Cilium Gateway API 같은 선택지도 함께 비교하는 게 좋습니다.

    3. 홈랩 쿠버네티스와 엣지 쿠버네티스 운영 포인트

    홈랩에서는 설치보다 백업, 인증서, 스토리지, 자동 업데이트 관리가 더 중요합니다. k3s라면 etcd/SQLite 백업과 /etc/rancher/k3s 설정 보관, MicroK8s라면 snap refresh 정책과 애드온 상태 점검을 운영 체크리스트에 넣어두세요.

    4. Kubernetes 1.37 시대의 새 키워드: Gateway API와 워크로드 스케줄링

    Kubernetes 1.37에서는 Gateway API, 동적 리소스 할당(DRA), 워크로드 인식 스케줄링 같은 흐름이 더 중요해졌습니다. k3s와 MicroK8s를 비교할 때도 이제는 단순히 가볍냐 무겁냐만 볼 게 아니라, 엣지 AI 워크로드, GPU 워크로드, 로컬 쿠버네티스 개발환경, GitOps 운영까지 함께 고려하는 쪽이 더 현실적입니다.


    마무리 — 그래서 저는 뭘 쓰냐고요?

    제 기준은 단순합니다. 홈랩, 라즈베리파이, 엣지 장비, 작고 오래 가는 클러스터라면 k3s를 고릅니다. Ubuntu 개발 장비에서 빠르게 켜고 끄는 테스트 클러스터, 애드온을 손쉽게 붙여보는 실험 환경이라면 MicroK8s를 고릅니다.

    둘 다 좋은 도구입니다. 다만 운영 방식이 다릅니다. k3s는 작고 조용하게 오래 가는 쪽에 가깝고, MicroK8s는 Ubuntu 생태계 안에서 빠르게 실험하고 확장하는 쪽에 가깝습니다. 결국 답은 내 환경이 어떤 실패를 견뎌야 하는지에 달려 있습니다.

    🔄 마지막 업데이트: 2026년 09월

  • [k8s] k3s 최신 버전: 경량 쿠버네티스 설치 및 운영 실전 가이드

    [k8s] k3s 최신 버전: 경량 쿠버네티스 설치 및 운영 실전 가이드

    k3s 최신 버전, 왜 지금 써야 할까요?

    쿠버네티스(Kubernetes)를 공부하거나 실무에 적용하려고 마음먹었는데, 막상 설치하려니 서버 사양부터 막히셨던 경험 있으신가요? 저도 처음엔 그랬거든요. 풀스택 쿠버네티스 클러스터를 집에서 돌리려면 메모리만 수십 GB가 필요하고, 설정 파일은 또 얼마나 복잡한지… 솔직히 포기하고 싶었던 적이 한두 번이 아닙니다.

    그러다가 만난 게 k3s 최신 버전이었어요. Rancher Labs(현 SUSE)에서 만든 경량 쿠버네티스인데, 처음 써봤을 때 진짜 “이게 뭔가?” 싶을 정도로 설치가 간단했습니다. 명령어 하나로 끝나거든요. 13년 동안 인프라 엔지니어로 일하면서 이렇게 설치가 간단한 쿠버네티스 배포판은 처음 봤어요.

    이 글에서는 제가 홈랩에서 직접 k3s를 설치하고 운영하면서 겪었던 경험을 바탕으로, 설치부터 실제 운영까지 실전 가이드를 공유해 드리겠습니다. 엣지 컴퓨팅(Edge Computing)이나 소규모 클러스터를 구성하려는 분들께 특히 도움이 될 거예요.

    k3s 경량 쿠버네티스 아키텍처 다이어그램 — 서버 노드와 에이전트 노드 구성

    ▲ k3s의 전체 아키텍처 — 서버(마스터)와 에이전트(워커) 노드 구성 개요. 일반 쿠버네티스보다 훨씬 단순한 구조가 특징입니다.

    k3s 최신 버전이란 무엇인가요? 경량 쿠버네티스 핵심 개념

    쉽게 말해서, k3s는 “다이어트한 쿠버네티스”

    쿠버네티스(Kubernetes, 이하 k8s)는 컨테이너 오케스트레이션(Container Orchestration, 컨테이너를 자동으로 배포·관리·확장하는 기술)의 표준이죠. 근데 이 k8s, 무겁습니다. 기본 설치만 해도 최소 2GB RAM이 필요하고, etcd, API 서버, 스케줄러 등 컴포넌트가 여러 개 따로 돌아가요.

    k3s는 이 k8s를 단일 바이너리(Single Binary)로 패키징해서 약 100MB 이하로 줄인 경량 쿠버네티스입니다. 핵심 기능은 그대로 유지하면서, 사용 빈도가 낮은 기능들을 과감히 제거했거든요.

    k3s 최신 버전이 제거하거나 교체한 것들

    • etcd → SQLite 또는 임베디드 etcd로 교체 (고가용성 구성 시 etcd 사용 가능)
    • 클라우드 프로바이더 플러그인 제거 (AWS, GCP 등 특정 클라우드 의존성 제거)
    • 알파(Alpha) 기능 제거
    • 기본 CNI(Container Network Interface)로 Flannel 내장
    • 기본 로드밸런서로 ServiceLB(구 Klipper) 내장
    • Helm Controller, Traefik Ingress 기본 포함

    k3s 최신 버전 vs 일반 k8s 비교

    항목 k8s (일반) k3s 최신 버전
    최소 RAM 2GB (마스터 기준) 512MB (서버 기준)
    바이너리 크기 여러 컴포넌트 (수 GB) 단일 바이너리 (~100MB)
    설치 시간 30분 이상 1~2분
    기본 데이터스토어 etcd SQLite (소규모), 임베디드 etcd (HA)
    Ingress 기본 포함 ❌ ✅ Traefik
    적합한 환경 대규모 프로덕션 엣지, IoT, 홈랩, 소규모 프로덕션

    저는 처음에 “이렇게 줄이면 뭔가 빠진 거 아닐까?” 걱정했는데, 실제로 써보니까 일반적인 워크로드(Workload, 실제 운영 중인 애플리케이션)에서는 전혀 차이를 못 느꼈어요. CNCF(Cloud Native Computing Foundation) 인증도 받은 정식 쿠버네티스 배포판이거든요.

    k3s 최신 버전 설치 실전 가이드

    사전 준비 — 환경 확인

    제 홈랩 환경을 기준으로 설명할게요. 라즈베리파이 4B 3대와 우분투 서버 1대를 혼용해서 클러스터를 구성했습니다.

    • OS: Ubuntu 22.04 LTS / Raspberry Pi OS (64bit)
    • 최소 사양: 1 vCPU, 512MB RAM (서버 노드는 1GB 이상 권장)
    • 네트워크: 노드 간 통신 가능한 동일 네트워크 또는 VPN
    • 포트: 6443(API), 8472(Flannel VXLAN), 10250(Kubelet) 열려 있어야 함

    1단계 — 서버(마스터) 노드 설치

    k3s 최신 버전 설치는 정말 간단합니다. 공식 설치 스크립트 하나로 끝나요. 처음 이걸 보고 “이게 다야?” 했던 기억이 나네요 ㅎㅎ

    # k3s 최신 버전 서버 노드 설치
    curl -sfL https://get.k3s.io | sh -
    
    # 설치 확인
    sudo systemctl status k3s
    
    # 노드 상태 확인
    sudo kubectl get nodes

    설치가 완료되면 /etc/rancher/k3s/k3s.yaml에 kubeconfig 파일이 생성됩니다. 이게 클러스터에 접근하기 위한 인증 정보예요.

    # kubeconfig를 기본 위치로 복사 (로컬에서 kubectl 사용)
    mkdir -p ~/.kube
    sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
    sudo chown $(id -u):$(id -g) ~/.kube/config
    
    # 에이전트 노드 연결을 위한 토큰 확인
    sudo cat /var/lib/rancher/k3s/server/node-token

    2단계 — 에이전트(워커) 노드 추가

    워커 노드(Worker Node, 실제 컨테이너가 실행되는 노드)를 추가하는 것도 간단해요. 아까 확인한 토큰과 서버 IP만 있으면 됩니다.

    # 에이전트 노드에서 실행 (K3S_URL과 K3S_TOKEN을 실제 값으로 교체)
    curl -sfL https://get.k3s.io | K3S_URL=https://서버IP:6443 K3S_TOKEN=토큰값 sh -
    
    # 서버 노드에서 노드 추가 확인
    sudo kubectl get nodes -o wide
    k3s 멀티 노드 클러스터 설치 완료 후 kubectl get nodes 결과 화면

    ▲ k3s 최신 버전으로 멀티 노드 클러스터 구성 완료 — 서버 1대 + 에이전트 2대로 구성된 소규모 클러스터. kubectl get nodes 명령어로 확인한 상태 화면.

    3단계 — 고가용성(HA) 구성 (선택사항)

    단일 서버 노드는 장애가 발생하면 클러스터 전체가 영향을 받아요. 프로덕션 환경이라면 HA(High Availability, 고가용성) 구성을 추천합니다. k3s 최신 버전에서는 임베디드 etcd를 사용하는 방식이 가장 간편해요.

    # 첫 번째 서버 노드 — 임베디드 etcd로 클러스터 초기화
    curl -sfL https://get.k3s.io | sh -s - server \
      --cluster-init \
      --tls-san 로드밸런서IP또는도메인
    
    # 두 번째, 세 번째 서버 노드 — 클러스터에 합류
    curl -sfL https://get.k3s.io | sh -s - server \
      --server https://첫번째서버IP:6443 \
      --token 토큰값 \
      --tls-san 로드밸런서IP또는도메인

    💡 팁: HA 구성에는 서버 노드가 홀수(3개 또는 5개)여야 etcd 리더 선출이 제대로 됩니다. 이건 k3s만의 특성이 아니라 etcd 자체의 특성이에요.

    4단계 — 실제 애플리케이션 배포 테스트

    클러스터가 잘 돌아가는지 간단한 nginx를 배포해서 확인해 봅시다.

    # nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-test
      namespace: default
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-test
      template:
        metadata:
          labels:
            app: nginx-test
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-test-svc
      namespace: default
    spec:
      selector:
        app: nginx-test
      ports:
      - port: 80
        targetPort: 80
      type: LoadBalancer
    # 배포 적용
    kubectl apply -f nginx-deployment.yaml
    
    # 파드(Pod) 상태 확인
    kubectl get pods -o wide
    
    # 서비스 상태 확인 (EXTERNAL-IP 할당 확인)
    kubectl get svc nginx-test-svc

    k3s에는 ServiceLB가 내장되어 있어서, 베어메탈(Bare Metal, 클라우드가 아닌 실제 물리 서버) 환경에서도 LoadBalancer 타입 서비스에 외부 IP가 할당되더라고요. 이게 진짜 편하거든요. 일반 k8s에서는 MetalLB 같은 걸 따로 설치해야 하니까요.

    ⚠️ 삽질 모음 — 제가 겪은 실전 트러블슈팅

    문제 1: 라즈베리파이에서 cgroup 오류

    라즈베리파이에 k3s를 처음 설치했을 때 파드가 계속 Pending(대기) 상태에서 안 올라오는 거예요. 로그를 보니까 cgroup(Control Group, 프로세스 자원 제한 기능) 관련 오류가 뜨더라고요. 이거 때문에 두 시간 삽질했습니다 ㅎㅎ

    # /boot/cmdline.txt 또는 /boot/firmware/cmdline.txt 파일 수정
    # 파일 끝에 다음 내용 추가 (줄바꿈 없이 한 줄로)
    sudo nano /boot/firmware/cmdline.txt
    
    # 추가할 내용:
    cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1
    
    # 재부팅 후 k3s 재설치
    sudo reboot

    문제 2: 방화벽(UFW)이 노드 간 통신을 막는 경우

    우분투 서버에 UFW(Uncomplicated Firewall)가 활성화되어 있으면 노드 간 통신이 막힐 수 있어요. 에이전트 노드가 Ready 상태가 안 될 때 의심해볼 부분입니다.

    # k3s 관련 포트 허용
    sudo ufw allow 6443/tcp    # API 서버
    sudo ufw allow 8472/udp    # Flannel VXLAN
    sudo ufw allow 10250/tcp   # Kubelet
    sudo ufw allow 51820/udp   # WireGuard (암호화 사용 시)
    
    # 또는 내부 네트워크 전체 허용 (홈랩 환경)
    sudo ufw allow from 192.168.0.0/24

    문제 3: Traefik Ingress 인증서 관련 이슈

    k3s에 기본 포함된 Traefik(트레픽, 리버스 프록시 겸 인그레스 컨트롤러)을 쓸 때 HTTPS 설정에서 막히는 분들이 많더라고요. cert-manager(인증서 자동 관리 도구)를 함께 설치하면 훨씬 편하더라고요.

    # cert-manager 설치
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
    
    # 설치 확인
    kubectl get pods -n cert-manager

    k3s 최신 버전 운영 시 알아두면 좋은 것들

    k3s 최신 버전 업그레이드하기

    k3s 최신 버전으로 업그레이드하는 방법은 생각보다 간단해요. 공식에서 제공하는 system-upgrade-controller를 사용하면 자동화도 가능하거든요.

    # 수동 업그레이드 (가장 간단한 방법)
    curl -sfL https://get.k3s.io | sh -
    
    # 특정 버전으로 설치/업그레이드
    curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.31.0+k3s1 sh -

    유용한 k3s 설정 옵션들

    k3s 서버 시작 시 다양한 옵션을 줄 수 있어요. /etc/rancher/k3s/config.yaml 파일로 관리하는 게 훨씬 편합니다.

    # /etc/rancher/k3s/config.yaml (서버 노드)
    write-kubeconfig-mode: "0644"
    tls-san:
      - "192.168.1.100"
      - "k3s.mylab.local"
    disable:
      - traefik        # 기본 Traefik 비활성화 (다른 Ingress 사용 시)
    node-label:
      - "role=master"
    cluster-cidr: "10.42.0.0/16"   # 파드 네트워크 대역
    service-cidr: "10.43.0.0/16"   # 서비스 네트워크 대역

    Helm Chart 배포 자동화

    k3s는 HelmChart CRD(Custom Resource Definition, 사용자 정의 리소스)를 기본 제공해요. 이걸 쓰면 YAML 파일 하나로 Helm Chart 배포를 자동화할 수 있거든요. 홈랩에서 진짜 유용하게 쓰고 있습니다.

    # prometheus 자동 배포 예시
    apiVersion: helm.cattle.io/v1
    kind: HelmChart
    metadata:
      name: prometheus
      namespace: kube-system
    spec:
      repo: https://prometheus-community.github.io/helm-charts
      chart: kube-prometheus-stack
      targetNamespace: monitoring
      createNamespace: true
      valuesContent: |-
        grafana:
          enabled: true
          adminPassword: "your-secure-password"

    ✅ 설치 결과 검증 및 모니터링

    드디어 클러스터가 다 올라왔을 때 “됐다!” 하는 그 기분… 직접 겪어보셔야 알아요 🎉

    클러스터 상태를 한눈에 확인하는 방법들을 정리해 드릴게요.

    # 전체 클러스터 상태 확인
    kubectl get nodes -o wide
    kubectl get pods -A
    kubectl top nodes   # metrics-server 설치 필요
    
    # k3s 서비스 상태
    sudo systemctl status k3s
    
    # k3s 로그 확인
    sudo journalctl -u k3s -f
    
    # 클러스터 정보
    kubectl cluster-info

    좀 더 시각적인 대시보드를 원하신다면 Rancher나 Lens(쿠버네티스 GUI 클라이언트)를 추천해요. k3s 클러스터를 등록하면 웹 UI로 모든 리소스를 관리할 수 있거든요. 저는 홈랩에서 Rancher를 k3s 위에 올려서 쓰고 있는데, 이건 다음 글에서 자세히 다룰 예정입니다.

    k3s 클러스터 Grafana 모니터링 대시보드 — CPU, 메모리, 파드 상태 시각화

    ▲ Grafana + Prometheus로 구성한 k3s 클러스터 모니터링 대시보드 — CPU, 메모리, 파드 상태를 실시간으로 확인할 수 있습니다.

    자주 묻는 질문 (FAQ)

    Q. k3s는 프로덕션 환경에서 사용 가능한가요?

    네, 충분히 가능합니다. CNCF 인증 쿠버네티스 배포판이고, 실제로 많은 기업에서 엣지 컴퓨팅이나 소규모 프로덕션 환경에서 k3s를 사용하고 있어요. 다만 대규모 엔터프라이즈 환경에서는 일반 k8s나 EKS/GKE 같은 관리형 서비스가 더 적합할 수 있습니다.

    Q. k3s 최신 버전은 어디서 확인하나요?

    GitHub 릴리즈 페이지(github.com/k3s-io/k3s/releases)에서 확인할 수 있어요. 기본 설치 스크립트는 항상 최신 stable 버전을 설치합니다.

    Q. k3s와 k3d의 차이는 뭔가요?

    k3d는 k3s를 Docker 컨테이너 안에서 실행하는 도구예요. 로컬 개발 환경에서 빠르게 클러스터를 만들고 지울 때 유용합니다. k3s는 실제 VM이나 물리 서버에 설치하는 거고요.

    Q. 라즈베리파이에서 k3s가 잘 돌아가나요?

    네! 라즈베리파이 4B(4GB 이상) 기준으로 서버 노드로도 충분히 동작합니다. 다만 앞서 언급한 cgroup 설정은 꼭 해주셔야 해요. ARM64 아키텍처를 공식 지원하거든요.

    k3s vs 쿠버네티스(k8s) 비교 인포그래픽 — 리소스, 설치 복잡도, 사용 환경 비교

    ▲ k3s와 일반 쿠버네티스(k8s) 비교 요약 — 리소스 사용량, 설치 복잡도, 적합한 사용 환경을 한눈에 비교한 인포그래픽.

    마무리 — k3s 최신 버전 정리 및 다음 단계

    k3s 최신 버전, 어떠셨나요? 생각보다 훨씬 간단하죠? 저도 처음 설치했을 때 “이게 진짜 쿠버네티스가 맞나?” 싶을 정도였거든요. 그런데 막상 써보면 표준 kubectl 명령어가 다 먹히고, Helm Chart도 그대로 쓸 수 있어서 실용적입니다.

    오늘 배운 것들을 정리하면:

    • ✅ k3s는 단일 바이너리로 배포되는 경량 쿠버네티스 — 512MB RAM으로도 동작
    • ✅ k3s 설치는 curl 명령어 하나로 완료 — 정말 1~2분이면 끝
    • ✅ Traefik Ingress, ServiceLB, Helm Controller 기본 내장
    • ✅ 라즈베리파이, 엣지 디바이스, 홈랩에 최적
    • ✅ HA 구성도 임베디드 etcd로 간단하게 가능
    • ⚠️ 라즈베리파이는 cgroup 설정 필수
    • ⚠️ 방화벽 포트 설정 꼭 확인

    다음 글에서는 k3s 위에 Rancher를 올려서 멀티 클러스터를 관리하는 방법을 다룰 예정이에요. 홈랩에서 여러 k3s 클러스터를 하나의 대시보드로 관리하는 게 정말 편하거든요. 이전 글에서 다뤘던 홈랩 네트워크 구성과 함께 보시면 더 도움이 될 겁니다.

    혹시 설치하다가 막히는 부분이 있으면 댓글로 남겨주세요. 제가 겪어본 삽질이 꽤 많아서 도움이 될 수도 있거든요 😄