본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

메트릭 기반 오토스케일링

원문 보기 위키 갱신

메트릭 기반 오토스케일러는 대기 중인 작업 항목이나 큐 깊이 같은 어떤 메트릭을 기준으로든 앱의 Machines 수를 조정해요. 이 페이지에서는 fly-autoscaler 이미지를 앱으로 실행해 Prometheus나 Temporal 메트릭으로 Machines를 스케일하는 전체 과정을 설명해요.

출처: 문서

본문

메트릭 기반 오토스케일러는 대기 중인 작업 항목이나 큐 깊이 같은 모든 메트릭을 기준으로 앱의 Machines를 스케일해요. 요청이나 연결이 아닌 메트릭으로 스케일하는 것은 웹 서비스를 실행하지 않는 백그라운드 워커 같은 앱에 유용해요. HTTP 요청을 기준으로 스케일해야 하는 서비스가 있는 앱은 Machines에 내장된 Fly Proxy autostop/autostart 기능을 사용할 수 있어요.

오토스케일러는 Prometheus나 Temporal 같은 다양한 소스에서 메트릭을 수집하고, 그 메트릭을 기반으로 필요한 Machines 수를 계산해요. 이 조정(reconciliation) 과정은 기본적으로 15초마다 루프로 실행돼요. 오토스케일러는 대상 Machine 수를 정의하는 데 Expr 언어를 사용하며, 여기에는 풍부한 내장 산술 함수가 있어요.

오토스케일러는 fly-autoscaler 이미지를 기반으로 한 앱으로 실행해요. 이 앱은 여러분의 조직 안에서 실행되므로 완전히 제어할 수 있어요. 자체 스케일링 요구에 맞게 오토스케일러를 커스터마이즈할 수 있어요.

빠른 시작 (Quickstart)

시작하려면 앱을 설정하고, 시크릿을 구성하고, 설정을 지정하고, 오토스케일러를 배포하면 돼요.

전제 조건으로, 스케일하려는 기존 대상 애플리케이션과 스케일 기준이 될 사용자 정의 메트릭이 필요해요. 이 예시에서는 queue_depth라는 Prometheus 메트릭을 기준으로 스케일하지만, 여러분만의 것으로 바꿔도 돼요. Temporal 워크플로우 기준 스케일도 가능해요.

오토스케일러 애플리케이션 생성

먼저, 오토스케일러를 실행할 새 Fly.io 앱을 만들어요. my-autoscaler 이름을 여러분의 오토스케일러 애플리케이션의 고유한 이름으로 바꾸세요:

fly apps create my-autoscaler

배포 토큰 생성

가장 먼저 필요한 인증 토큰은 대상 앱을 배포할 권한이 있는 토큰이에요:

fly tokens create deploy -a my-target-app

결과 토큰을 복사해서 오토스케일러 앱의 시크릿으로 설정하세요:

fly secrets set -a my-autoscaler --stage FAS_API_TOKEN="FlyV1 ..."

Prometheus에서 읽을 토큰 생성

다음으로 필요한 인증 토큰은 조직의 Prometheus 데이터를 Fly에서 읽을 권한이 있는 토큰이에요:

fly tokens create readonly my-org

토큰을 복사해서 오토스케일러 앱의 시크릿으로 사용하세요:

fly secrets set -a my-autoscaler --stage FAS_PROMETHEUS_TOKEN="FlyV1 ..."

오토스케일러 fly.toml 구성

다음으로, 환경 변수를 설정하기 위해 오토스케일러용 fly.toml 설정 파일을 만들어요. my-autoscaler, my-target-app, my-org를 여러분의 상황에 맞는 값으로 바꾸세요.

app = "my-autoscaler"

[build]
image = "flyio/fly-autoscaler:0.3"

[env]
FAS_PROMETHEUS_ADDRESS = "https://api.fly.io/prometheus/my-org"
FAS_PROMETHEUS_METRIC_NAME = "qdepth"
FAS_PROMETHEUS_QUERY = "sum(queue_depth{app='$APP_NAME'})"

FAS_APP_NAME = "my-target-app"
FAS_CREATED_MACHINE_COUNT = "min(50, qdepth / 2)"

[metrics]
port = 9090
path = "/metrics"

환경 변수는 설정을 정의하는 기본 방식이에요.

메트릭 수집 설정:

  • FAS_PROMETHEUS_ADDRESS는 조회할 Prometheus URL 엔드포인트를 정의해요.
  • FAS_PROMETHEUS_METRIC_NAME은 메트릭 결과가 저장될 로컬 변수 이름을 정의해요. 이 예시는 조회 결과 값을 qdepth로 저장해요.
  • FAS_PROMETHEUS_QUERY는 실행할 Prometheus 쿼리를 정의해요. 이 예시는 사용자 정의 queue_depth 메트릭의 합을 계산해요.

오토스케일링 설정:

  • FAS_APP_NAME은 스케일할 대상 애플리케이션의 이름이에요.
  • FAS_CREATED_MACHINE_COUNT는 필요한 Machines 수를 계산할 Expr 표현식을 정의해요. 오토스케일러는 필요한 수에 도달하도록 Machines를 생성하거나 파괴해요.

이 예시 표현식은 각 Machine이 큐의 항목 두 개를 처리할 수 있다고 가정하고, min() 함수를 사용해 오토스케일러가 50개 이상의 Machines로 스케일하지 못하게 해요.

오토스케일러 배포

오토스케일러는 단일 Machine에서만 동작해요. 그래서 두 개의 Machines를 만드는 고가용성 기능을 끄기 위해 --ha 옵션을 사용할 거예요:

fly deploy --ha=false

오토스케일러가 배포된 후에는 사용자 정의 queue_depth 게이지가 증가함에 따라 대상 애플리케이션의 Machines 수가 늘어나는 것을 볼 수 있어요.

참고: 오토스케일러는 기존 Machines를 복제해 애플리케이션에 새 Machines를 만들어요. 0으로 스케일되지는 않으며 항상 최소한 하나의 Machine을 계속 실행해요.

오토스케일러의 완전한 작동 예시는 fly-autoscaler-example 저장소에서 찾을 수 있어요.

더 많은 사용 사례 (More use cases)

Machines 생성/파괴 대신 시작/중지하기

이미 생성된 Machines 풀이 있고 그것을 오토스케일하고 싶다면, FAS_CREATED_MACHINE_COUNT로 생성/파괴하는 대신 FAS_STARTED_MACHINE_COUNT 표현식을 사용해 Machines를 중지/시작할 수 있어요.

FAS_STARTED_MACHINE_COUNT를 사용하면 오토스케일러가 스케일 시 Machines를 파괴하는 대신 종료 신호를 보내요. 또한 사전 생성된 Machines 수만큼만 시작되도록 자동으로 상한을 걸어요.

기존 Machines를 시작/중지하는 방식으로 스케일하면 Machines가 빠르게 시작돼요. 실행 중일 때는 Machine의 CPU와 RAM 비용을 내고, 중지되었을 때는 rootfs 비용을 내요.

Machines를 생성/파괴하는 방식으로 스케일하면 Machine을 시작하는 것보다 생성하는 데 시간이 더 걸리므로 started 상태에 도달하는 속도가 조금 느려져요. Machines "풀(pool)"을 만들 필요는 없어요. 실행 중일 때만 Machine의 CPU와 RAM 비용을 내고, 필요하지 않을 때는 Machines가 파괴되므로 rootfs 비용을 내지 않아도 돼요.

여러 애플리케이션 스케일

애플리케이션 이름에 와일드카드 표현식을 사용해 같은 오토스케일러로 여러 독립 애플리케이션을 스케일할 수 있어요. 애플리케이션들은 모두 공통 접두사를 공유해야 하고 모두 같은 조직에 있어야 해요.

멀티 앱 스케일링을 활성화하려면 특정 앱 전용 배포 토큰이 아니라 조직 전체 인증 토큰을 사용해야 해요:

fly tokens create org my-org

그리고 결과 토큰을 오토스케일러 애플리케이션에 설정하세요:

fly secrets set -a my-autoscaler --stage FAS_API_TOKEN="FlyV1 ..."

다음으로, fly.toml 설정에 조직 이름과 애플리케이션 와일드카드를 설정하세요:

[env]
FAS_ORG="my-org"
FAS_APP_NAME="my-app-*"

그런 다음 Prometheus 쿼리에서 $APP_NAME 또는 ${APP_NAME}를 사용해 현재 스케일 중인 애플리케이션을 식별하세요:

[env]
FAS_PROMETHEUS_QUERY = "sum(queue_depth{app='$APP_NAME'})"

멀티 애플리케이션 스케일링의 작동 예시는 fly-autoscaler-multiapp-example 저장소에서 찾을 수 있어요.

대기 중인 Temporal 작업 기준으로 스케일

Temporal 메트릭 수집기는 "running" 상태의 총 워크플로우 수를 주기적으로 확인해요. 기본적으로 15초마다 확인해요.

FAS_TEMPORAL_ 환경 변수를 사용해 Temporal 네임스페이스에 연결할 수 있어요. 예를 들어:

[env]
FAS_TEMPORAL_ADDRESS = 'mynamespace.lyeth.tmprl.cloud:7233'
FAS_TEMPORAL_NAMESPACE = 'mynamespace.lyeth'
FAS_TEMPORAL_METRIC_NAME = 'queue_depth'

FAS_APP_NAME = "my-target-app"
FAS_CREATED_MACHINE_COUNT="workflow_count / 10"

위 예시에서 오토스케일러는 (현재 워크플로우 수를 기준으로) 한 번에 최대 10개의 워크플로우를 처리할 수 있는 앱용 Machines를 생성/파괴하도록 설정되어 있어요: FAS_CREATED_MACHINE_COUNT="workflow_count / 10. 특정 Machines 수를 초과하지 않게 하려면 min() 표현식으로 상한을 걸 수 있어요: FAS_CREATED_MACHINE_COUNT="min(50, workflow_count / 10). 이렇게 하면 여러 워크플로우가 실행 중이더라도 50개 이상의 Machines가 생성되지 않아요.

또한 ca.pem과 ca.key 파일에서 인증서와 키 데이터를 시크릿으로 로드해야 해요:

fly secrets set --stage FAS_TEMPORAL_CERT_DATA="$(<ca.pem)"
fly secrets set --stage FAS_TEMPORAL_KEY_DATA="$(<ca.key)"

Temporal 오토스케일링의 완전한 작동 예시는 fly-autoscaler-temporal-example 저장소에서 찾을 수 있어요.

설정 참조 (Configuration reference)

빠른 시작은 환경 변수로 오토스케일러를 구성하는 방법을 설명해요. 환경 변수를 사용하고 싶지 않거나 메트릭 수집기를 두 개 이상 구성하고 싶다면 YAML 설정 파일로도 오토스케일러를 구성할 수 있어요.

예시와 자세한 내용은 참조 fly-autoscaler.yml 파일을 확인하세요.

오토스케일러 설정

  • FAS_APP_NAME: 스케일할 대상 앱의 이름.
  • FAS_CREATED_MACHINE_COUNT: 필요한 Machines 수를 계산하는 Expr 표현식. 오토스케일러는 필요한 수에 도달하도록 Machines를 생성하거나 파괴해요.
  • FAS_STARTED_MACHINE_COUNT: 필요한 Machines 수를 계산하는 Expr 표현식. 오토스케일러는 필요한 수에 도달하도록 Machines를 시작하거나 중지해요.

Prometheus 수집기

  • FAS_PROMETHEUS_ADDRESS: 조회할 Prometheus 엔드포인트의 URL.
  • FAS_PROMETHEUS_METRIC_NAME: 메트릭 결과가 저장될 로컬 변수 이름.
  • FAS_PROMETHEUS_QUERY: 실행할 Prometheus 쿼리.

Temporal 수집기

  • FAS_TEMPORAL_ADDRESS: 조회할 Temporal 엔드포인트의 URL.
  • FAS_TEMPORAL_METRIC_NAME: 메트릭 결과가 저장될 로컬 변수 이름.
  • FAS_TEMPORAL_NAMESPACE: Temporal 네임스페이스 이름.
  • FAS_TEMPORAL_CERT_DATA: 네임스페이스 CA 인증서 데이터 (ca.pem).
  • FAS_TEMPORAL_KEY_DATA: 네임스페이스 CA 키 데이터 (ca.key).

더 알아보기 (Learn more)