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

Fly Machines 소개

원문 보기 위키 갱신

Fly Machines는 빠르게 시작하는 VM이며, 간단한 REST API를 제공해요. Fly.io 플랫폼의 컴퓨팅이 바로 이것이에요. Fly.io에서 앱을 시작해 봤다면, 이미 Fly Machines를 사용하고 있는 거예요.

우리는 Machines API로 Fly Launch를 위한 오케스트레이션을 구축해요. 여러분도 원하는 대로 사용할 수 있어요.

출처: 문서

본문

Machine을 직접 제어해야 하나요?

우리는 Fly Machines에 대한 저수준 제어를 제공해요. Fly.io에서 VM을 어떻게, 어디서, 언제 시작할지 까다롭게 골라야 할 때를 위해서요.

대부분의 앱에서, 대부분의 경우, 까다롭게 고를 필요가 없어요! 코어를 더 늘리거나 메모리를 더 늘리고, 더 많은 지역과 더 많은 Machine 수로 확장하면 돼요. Fly Launch가 간단한 문법과 설정으로 그 모든 것을 해줘요.

개념

Machine을 직접 만들고 파괴할 수 있고, 각 Machine의 수명주기, 리소스, 지역 배치를 제어할 수 있어요.

Machine

Machine은 Fly.io에서 실행되는 단일 VM의 구성과 상태에요. 모든 Machine은 Fly App에 속하며, App은 둘 이상의 Machine을 가질 수 있어요.

지금 바로 아무것도 구성하지 않고 Machine을 시작할 수 있어요:

fly machine run --shell
? Select Organization: (personal)
Searching for image 'ubuntu' remotely...
Image size: 30 MB

Success! A machine has been successfully launched in app flyctl-interactive-shells-g1b7jg6wpdbq0i8b8yrl4q9rlqu5pm-502673
 Machine ID: d8d9510a295118
Connecting to fdaa:1:18:a7b:191:1aa9:a2a5:2... complete
root@d8d9510a295118:/# uname -a
Linux d8d9510a295118 5.15.98-fly #gf0950f1d7c SMP Sun Sep 17 02:33:12 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

시도해 보세요! --shell로 Machine을 실행하면 작은 Machine을 만들고, 살펴보는 것이 끝나면 우리가 내려 줘요.

Machine 상태

Fly Machine의 큰 비결은: 아주 빠르게 시작하는 거예요. "사용자의 HTTP 요청에 대한 응답으로" 빠르게요. 그런 일을 하는 것이 flyctl에 배포를 맡기는 대신 Fly Machines를 직접 사용하는 이유예요.

그 비결을 이해하려면 Fly Machine의 수명주기를 이해하는 것부터 시작하세요:

  1. Create Machine 요청으로 Fly Machine을 만들거나, fly machine run으로 만듭니다. Machine 공간을 예약하고, 전역 레지스트리에서 컨테이너를 가져오고, 루트 파일 시스템을 만드는 동안 Machine은 created 상태에 있어요. 시간이 걸릴 수 있어요, 대략 수십 초 정도요.

  2. Fly Machine이 존재하면 바로 부팅해 드려요. Machine은 started 상태가 돼요. 실행되고 있어요. 대화할 수 있어요. 이건 빠르게 일어나요! 모든 것이 이미 조립되어 있고, 그냥 부팅만 하면 되니까요. 보통 1초도 안 걸려요. Start Machine 요청이나 fly machine start로 정지된 Machine을 시작하는 것도 마찬가지예요.

  3. Fly Machine이 끝났다면 Stop Machine 요청이나 fly machine stop으로 멈춥니다. VM이 종료돼요. Machine은 stopped 상태가 돼요. 그 구성 요소는 여전히 워커 호스트에 조립되어 있어 바로 다시 시작할 준비가 돼 있어요. 그렇게 하고 싶다면 GOTO 2.

  4. Fly Machine에 지쳤다면 영구히 없애고 싶을 거예요. Delete Machine 요청을 보내거나 fly machine destroy를 사용하세요. Machine을 위해 잡고 있던 리소스를 서버에서 정리해요. 같은 이미지에서 새 Machine을 만들고 시작하는 것은 쉽지만, 기존 Machine을 멈추고 시작하는 것보다는 느려요.

flyctl 명령으로 새 Machine 실행 또는 Machine 업데이트에 대해 자세히 알아보세요.

Machine 확장

기억하세요, Fly.io에서 앱을 확장하는 일반적인 방법은 Fly Launch를 사용하는 것이에요. 인스턴스를 확장하거나 늘리는 편리한 명령을 제공하죠. 여기서는 Machine을 직접, 까다롭게 확장할 거예요.

fly launch로 Fly App을 부팅했든 아니든, 모든 Machine은 "App"에 속해요 ("App"은 궁극적으로 리소스, 구성, 라우팅 규칙의 이름 있는 모음일 뿐이에요).

fly machine clone으로 워크로드를 수평 확장하세요:

fly machine clone -a my-app --region ord 7811373c095228
Cloning machine 7811373c095228 into region ord
Provisioning a new machine with image registry-1.docker.io/my-app/sleep:latest@sha256:597c3e
  Machine 28749edf4047d8 has been created...
  Waiting for machine 28749edf4047d8 to start...
Machine has been successfully cloned!

특정 Machine을 몇 번이든, 특정 지역에 복제할 수 있어요. 각 Machine을 fly machine stop과 fly machine start로 개별 관리할 수 있어요.

fly machine update로 Machine을 수직 확장하세요:

fly machine update -a my-app --vm-memory 512M 7811373c095228
Configuration changes to be applied to machine: 7811373c095228 (twilight-field-6033)

  	... // 12 identical lines
  	    "cpu_kind": "shared",
  	    "cpus": 1,
- 	    "memory_mb": 256
+ 	    "memory_mb": 512
  	  },
  	  "dns": {}
  	}
  	
? Apply changes? Yes
Updating machine 7811373c095228
No health checks found
Machine 7811373c095228 updated successfully!

Machine을 업데이트하면(fly machine stop처럼) 머신을 내리고, 구성 변경을 적용하고, 다시 올려요. 이미지를 변경하지 않는다면 전역 레지스트리에서 가져올 필요가 없으므로, 이는 stop과 start와 같은 이유로 빠르게 일어나요. 무거운 일은 이미 우리가 해놨으니까요.

정적 Machine IP

앱 범위 정적 이그레스 IP가 권장돼요. 아래 설명하는 Machine 범위 정적 이그레스 IP는 레거시 기능이에요. 대부분의 사용 사례에서는 앱 범위 정적 이그레스 IP를 할당해야 해요. Machine 범위 IP와 달리 앱 범위 IP는 한 지역의 여러 Machine이 공유할 수 있고, Machine이 다시 생성될 때 삭제되지 않아요.

Machine 범위 정적 이그레스 IP는 단일 Machine에 붙으며 다른 Machine과 공유되지 않아요. Machine 마이그레이션 후에도 유지돼요.

정적 이그레스 IP는 여러분의 Machine이 특정 IP 집합을 허용 목록에 추가해야 하는 서비스에 연결해야 할 때 유용해요. 지원된다면 외부 서비스에 연결할 때 WireGuard를 사용하는 것이 권장돼요.

fly machine egress-ip allocate <machine_id>로 여러분의 Machine에 정적 이그레스 IP를 붙일 수 있어요:

fly machine egress-ip allocate e784e7d9a65208
? Looks like you're allocating a static egress (outgoing) IP. This is an advanced feature, and is not needed by most apps.
Are you sure this is what you want? Yes
Allocated egress IPs for machine e784e7d9a65208:
IPv4: 209.71.93.224
IPv6: 2a09:8280:e600::2e:951:0

Placement (배치)

Machine을 create, run 또는 clone할 때 Fly.io 지역을 선택해 배치할 수 있어요. API는 Machines API 서버(우리는 flaps라고 부르지만 신경 쓸 필요 없어요)에 연락하고, 그것은 다시 지역의 모든 워커 서버에 연락해 Machine을 호스팅할 충분한 리소스가 있는 서버를 찾고, 그 서버 중 어떤 것에 Machine을 둘지 현명한 선택을 하려고 해요.

특정 서버를 고를 수는 없어요(속이는 방법은 있지만, 원하는 게 아닐 거예요). 지역만 고를 수 있어요.

ord나 yyz 같은 특정 지역을 고르면 그 지역에서만 Machine을 만들어요.

Machine 배치와 지역 용량에 대해 이 가이드에서 더 읽어보세요.

배치는 실패할 수 있어요! 자주 일어나지는 않지만, 특정 지역의 용량이 부족할 수 있어요. flyctl과 Fly Machines API 모두 best-effort예요. 이 수준의 제어로 우리와 작업한다면, 요청을 재시도해 제대로 처리되도록 하는 것은 여러분의 몫이에요. 그 부담의 대가로 우리는 Fly Machines API가 응답성이 좋도록 노력해요, 그래서 빠른 답을 얻을 수 있죠.

Fly Machine 기능 요약

  • Machines API 또는 flyctl 명령으로 관리
  • 프로그램이 종료되면 자동으로 멈춤
  • 트래픽에 따라 수동 또는 자동으로 빠르게 멈추거나 시작
  • 일시적 스토리지 제공 — 매 시작 시 빈 슬레이트
  • 영구 스토리지를 위한 볼륨 부착
  • 어떤 지역에도 배치

관련 자료

  • Machine 상태와 수명주기 Machine이 상태(created → started → stopped 등)를 어떻게 이동하는지, 그 의미, 문제 감지 방법을 알아보세요.
  • Machine 배치와 지역 용량 지역과 호스트 용량이 Machine이 어디에 놓일지에 어떻게 영향을 주는지, 배치가 실패하면 어떻게 할지 알아보세요.
  • fly machine CLI 참조 flyctl로 Machine을 관리하기 위한 명령줄 참조(create, update, stop, clone 등).
  • Machines API로 작업하기 API 호출로 Machine을 만들고, 업데이트하고, 관리하는 실용적인 가이드.
  • Machines API 참조 OpenAPI 사양에서 생성된 Machines API 런타임용 저수준 참조.

더 알아보기 (Learn more)