Reddit

Sablier, 4 years later: start your apps on demand, now with Podman, Proxmox LXC, Nomad, ECS and more

4년 만에 지원 범위를 넓힌 Sablier, 요청이 올 때 앱을 시작합니다

Sablier는 요청이 들어올 때 컨테이너나 서비스를 깨우고, 일정 시간 유휴 상태가 되면 중지하거나 자원을 제한하는 오픈소스 도구입니다. Docker 외에도 Kubernetes, Podman, Proxmox LXC, systemd, Nomad, AWS ECS를 지원하며, 프록시 연동과 대기 화면으로 기동 시간을 처리합니다.

에디터 노트

Sablier의 성과는 항상 켜 둔 서비스를 요청 시 기동하도록 바꾸는 데 있지만, 자원 절감과 응답 지연은 별도로 따져야 합니다. 작성자는 Scale mode로 콜드 스타트를 없애고 자원을 제한한다고 설명하지만, 유지 관리자는 Raspberry Pi에서 컴퓨팅 자원과 전력 절감 효과가 거의 없었다고 말합니다. 이 방식은 자원 회수보다 실행 상태를 유지하면서 다른 서비스와의 경합을 줄이는 데 맞습니다. 완전 중지는 자원을 더 회수하는 대신 기동 시간을 감수합니다. 댓글의 사용 사례도 몇 초의 대기를 허용하는 프로토타입과 무거운 서비스를 필요할 때만 켜는 경우로 나뉩니다. Kubernetes 사용자는 Gateway API 문서가 부족했다고 했고, 다른 사용자는 Traefik 연동이 현재 작동하지 않는다고 전했습니다. 따라서 지원 제공자 목록만으로 각 배포 환경의 설정 완성도까지 판단하기는 어렵습니다.

AI 요약

Sablier는 사용자의 요청에 맞춰 잠든 애플리케이션을 시작하고, 일정 시간 동안 요청이 없으면 중지하거나 자원을 줄이는 오픈소스 서버입니다. Traefik, Caddy, Nginx, Envoy 등의 리버스 프록시 플러그인이 요청을 Sablier API로 전달하고, 앱이 준비될 때까지 대기 페이지를 보여주거나 요청을 붙잡아 둡니다. 자주 쓰지 않는 서비스의 상시 실행을 줄이려는 홈랩과 QA 환경, 유휴 클라우드 워크로드가 주요 사용 사례입니다.

지원 워크로드와 프록시

Docker와 Docker Swarm, Kubernetes, Podman, Proxmox VE의 LXC 컨테이너, systemd 유닛, HashiCorp Nomad 작업 그룹, AWS ECS 서비스를 관리합니다. Nomad 지원은 실험 단계입니다. Traefik과 Caddy에는 연동 플러그인이 있으며, Nginx, Envoy, Istio, Apache APISIX에는 Proxy-WASM 플러그인을 제공합니다. 워크로드에는 Sablier 활성화 라벨이나 태그를 지정해 관리 대상을 고릅니다.

중지와 축소

기본 동작은 세션 만료 후 워크로드를 중지하거나 일시 중지하고, 다음 요청에 다시 시작하는 방식입니다. Scale mode에서는 프로세스를 계속 실행하면서 유휴 상태의 CPU와 메모리 한도를 낮추고, Docker에서는 블록 I/O도 제한할 수 있습니다. 예를 들어 유휴 CPU 0.1, 메모리 64MB를 설정하고 요청이 오면 CPU 2개와 메모리 512MB로 복구합니다. 실행 상태를 유지하므로 재기동 대기 시간을 줄이는 대신, 워크로드를 완전히 중지할 때만큼 자원을 회수하지는 않습니다. 장치별 I/O 제한에는 Docker 데몬 API 1.55 이상이 필요합니다.

경합 방지와 관측

Anti-affinity 설정은 특정 그룹이 활성화될 때 다른 워크로드를 중지하거나 유휴 자원 설정으로 전환합니다. GPU 메모리나 RAM을 여러 서비스가 공유할 때 동시 실행을 막는 용도입니다. 시작과 중지 이벤트를 웹훅으로 보내고, Prometheus 지표와 OpenTelemetry 추적도 제공합니다. 문서에 따르면 세션 캐시가 준비된 상태에서 요청 처리 지연은 약 1.5~2ms이며, 단일 코어 기준 처리량은 시나리오에 따라 초당 약 4,663~5,751건입니다. 콜드 스타트 시간은 컨테이너 기동 시간에 달려 있습니다.

설정과 준비 상태

Docker 이미지, 바이너리, 소스 빌드, Helm Chart로 설치할 수 있습니다. 설정 파일과 환경 변수, 명령행 인자를 지원합니다. 역방향 프록시를 연동하면 요청으로 세션을 시작할 수 있고, API의 blocking 전략은 워크로드가 준비될 때까지 기다립니다. 문서는 스케일 투 제로 대상 앱에 헬스체크를 설정하라고 안내합니다. 헬스체크가 없으면 시작된 컨테이너와 요청을 받을 준비가 된 컨테이너를 구분하지 못합니다.

Reddit 반응

  • @HotFuture3225 — Scale mode는 정말 영리한 추가 기능입니다. 콜드 스타트가 이런 구성의 늘 문제였는데, 완전히 중지하는 대신 자원을 제한하면 그 문제를 잘 피할 수 있겠네요. 실제로 계속 실행하는 것과 비교해 자원을 얼마나 아끼는지 궁금합니다.
  • @zittoone — Raspberry Pi에서 Sablier를 계속 써 왔는데, 컴퓨팅 자원과 전력을 실제로 절약하는 효과는 거의 없습니다. 대신 다른 컨테이너에 유휴 상태를 설정해 규모를 줄이고 이웃 서비스 간섭 문제를 피할 수 있습니다. Raspberry Pi 4 한 대에 최대한 많은 것을 넣으려다 Plex에서 디스크 제한 때문에 피드가 깨지는 일을 겪어 블록 I/O 축소 기능을 추가했습니다. Anti-affinity와 함께 쓰면 이웃 서비스 간섭을 막을 수 있습니다.
  • @ragchuck — 저도 Sablier를 설정에 넣어 사용 중입니다. 지금은 작동하지 않지만 다시 살펴볼 시간이 없었고 크게 신경 쓰지도 못했습니다. 중지된 컨테이너를 Traefik이 등록 해제하는 문제와 관련한 논의를 봤고, 중지 상태에서도 등록을 유지하는 옵션이 추가된 것 같습니다. 설정 오류일 수도 있어 나중에 다시 살펴보겠습니다. 자동 업데이트를 켜 두면 필수가 아닌 서비스가 가끔 깨집니다. 이 기능을 제공해 주셔서 감사합니다.
  • @peacefaker — 홈랩 Kubernetes 클러스터에 방금 설정했는데 만족스럽습니다. 자주 쓰지 않는 앱을 0개로 축소하는 데 주로 씁니다. 필요하지 않을 때 실행되는 게 싫습니다. 개선 의견은 Gateway API 설정 문서가 충분하지 않아 시행착오를 겪었다는 점입니다.
    • @zittoone — 어려웠던 부분을 이슈로 올려 주세요. 다음 사용자에게 더 쉽게 만들 수 있도록 기꺼이 개선하겠습니다.
    • @peacefaker — 제대로 된 이슈를 작성할 시간이 생기면 올리겠습니다. 설정 예시도 기꺼이 제공하겠습니다. 답변 감사합니다.
  • @Kautiontape — Sablier를 정말 좋아합니다. 특정 문제를 딱 해결해 줬습니다. 처음에는 의존성이 다른 웹 게임 프로토타입 여러 개를 각각 Docker 컨테이너로 띄웠습니다. 언제 특정 프로토타입을 테스트할지 알 수 없었지만 계속 실행하기엔 비용이 많이 들었습니다. Nginx 뒤에 Sablier를 두니 몇 초 기다리는 대신 직접 시작하고 중지할 필요가 없어 좋았습니다. 일주일에 몇 번 쓰는 무거운 식단 계획 서비스에도 씁니다. 유휴 상태에서도 RAM을 많이 먹었고 콜드 부팅이 썩 좋지는 않지만 계속 켜 두는 것보다는 낫습니다. Scale 기능이 여기에 잘 맞을 수도 있겠네요.
  • @Any-Reality4951 — 처가 식구들이 방문할 때 분기에 한 번쯤 켜는 서비스가 몇 개 있습니다. 이걸 쓰면 상시 실행 목록에서 마침내 뺄 수 있겠네요.
  • @ActiveAvailable2782 — Quadlet을 지원하나요?
  • @allthemighty — 괜찮아 보이니 써볼까 합니다. 2주에 한 번쯤 여는 서비스가 몇 개 있는데 그동안 자원을 차지하게 두기 아깝습니다.
  • @Gully5931 — 팟이 수백 개 있고 늘 사용하는 것은 극히 일부입니다. 그룹을 만들어 두면 중지된 앱에 접속할 때 데이터베이스도 함께 시작하고, 한 시간 뒤에는 정상적으로 종료합니다.