포스트

월 €6 서버 하나로 10개 Pod 운영하기

월 €6 서버 하나로 10개 Pod 운영하기

BibleCardAI를 Hetzner CX33 한 대(4 vCPU, 8GB RAM, €5.99/월)에서 k3s로 운영하고 있다. 10개 Pod, 월 $20.

왜 k3s인가

처음엔 docker-compose로 돌렸다. 서비스가 10개가 되니까 재시작, 롤백, 헬스체크가 수동으로 안 됐다. EKS 같은 관리형은 월 $70+. k3s는 설치 1분, 메모리 500MB, kubectl 그대로 쓸 수 있다.

1
2
curl -sfL https://get.k3s.io | sh -
# 끝. kubectl 바로 사용 가능

10개 Pod 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
앱 (7개)
├── backend-unified    ← auth + payment + cards + gateway 통합
├── backend-img-gen    ← GPT-4o-mini + DALL-E 3 파이프라인
├── celery-worker      ← 비동기 이미지 생성 큐
├── edge-proxy         ← 서브도메인 라우팅, 봇 차단
├── frontend-biblecardai
├── frontend-blessflow
└── frontend-artistconnect

인프라 (3개)
├── postgres + pgvector
├── redis
└── seaweedfs (S3 호환 스토리지)

평소 CPU 10~15%, RAM 6.5/8GB. 이미지 생성 시 30%까지 올라가지만 문제없다.

배포

레지스트리 없이, 서버에서 직접 빌드한다. GitHub Actions가 SSH로 서버에 접속해서 전부 처리한다.

1
2
3
4
5
git push → GitHub Actions → SSH로 서버 접속
  → rsync로 소스 전송
  → docker buildx build (BuildKit)
  → docker save | k3s ctr images import (레지스트리 불필요)
  → Helm values 태그 업데이트 → ArgoCD sync 트리거 → Pod 교체

별도 컨테이너 레지스트리를 운영할 필요가 없다. docker save로 이미지를 파일로 만들어서 k3s ctr images import로 직접 넣고, Helm values의 이미지 태그를 커밋 SHA로 업데이트하면 ArgoCD가 Pod를 교체한다.

삽질한 것들

docker system prune -af: 디스크 정리한답시고 이걸 돌렸다가 베이스 이미지까지 날렸다. 지금은 buildx + 빌드 후 docker image prune -f(dangling만 정리)로 해결. (자세한 내용은 별도 글)

revisionHistoryLimit: k3s 기본값이 10이라 오래된 ReplicaSet이 쌓인다. 3으로 줄였다.

Pod /tmp 데이터: DALL-E에서 생성한 이미지를 /tmp에 저장했는데, Pod 재시작하면 날아간다. SeaweedFS로 옮기고 나서야 안정됐다.

비용

항목비용
Hetzner CX33€5.99/월
도메인$12/년
OpenAI API~$10/월
합계~$20/월

AWS에서 같은 구성이면 $100+/월. 사이드 프로젝트에는 과하다.

실제 리소스 현황

1
2
3
4
CPU:  2.3% (평소) / 30% (이미지 생성 시)
RAM:  3.5 / 7.6 GB (46%)
Disk: 52 / 75 GB (73%)
Uptime: 11일+

Discord 봇이 매일 아침 서비스 상태를 보고한다:

Discord Daily Report 디스코드 데일리 리포트 — Pod 상태, 유저/카드/묵상 수, 에러 현황

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.