<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Infrastructure on ICE-ICE-BEAR-BLOG</title><link>https://ice-ice-bear.github.io/ko/categories/infrastructure/</link><description>Recent content in Infrastructure on ICE-ICE-BEAR-BLOG</description><generator>Hugo -- gohugo.io</generator><language>ko</language><lastBuildDate>Thu, 07 May 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://ice-ice-bear.github.io/ko/categories/infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>Fly.io의 Machines가 진짜로 모든 것의 빌딩 블록인 이유</title><link>https://ice-ice-bear.github.io/ko/posts/2026-05-07-fly-io-machines-primitive/</link><pubDate>Thu, 07 May 2026 00:00:00 +0900</pubDate><guid>https://ice-ice-bear.github.io/ko/posts/2026-05-07-fly-io-machines-primitive/</guid><description>&lt;img src="https://ice-ice-bear.github.io/" alt="Featured image of post Fly.io의 Machines가 진짜로 모든 것의 빌딩 블록인 이유" /&gt;&lt;h2 id="개요"&gt;개요
&lt;/h2&gt;&lt;p&gt;Fly.io 공식 채널에서 짧은 영상 두 편을 봤다 — &lt;a class="link" href="https://www.youtube.com/watch?v=O6KpRcJzTxs" target="_blank" rel="noopener"
 &gt;What is Fly.io, anyway?&lt;/a&gt;와 &lt;a class="link" href="https://www.youtube.com/watch?v=VOZO7CfwPII" target="_blank" rel="noopener"
 &gt;Fly Launch — How Fly.io uses Machines as a building block for everything&lt;/a&gt;. popcon에서 fly.io를 쓰면서 &amp;ldquo;Machines가 빌딩 블록이다&amp;quot;라는 말을 여러 번 들었는데, 이 영상들이 그 표현이 정확히 무슨 뜻인지 풀어준다.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 User["당신의 Docker image"] --&gt; FCTL["fly CTL (fat client) &amp;lt;br/&amp;gt; fly launch / fly deploy"]
 FCTL --&gt; MachinesAPI["Machines API &amp;lt;br/&amp;gt; (HTTP, 누구나 호출 가능)"]
 MachinesAPI --&gt; Firecracker["Firecracker microVM &amp;lt;br/&amp;gt; (AWS Lambda와 같은 기술)"]
 Firecracker --&gt; Region["전 세계 region에 배포 &amp;lt;br/&amp;gt; BPF + DNS routing"]
 Region --&gt; WireGuard["WireGuard private network &amp;lt;br/&amp;gt; + IPv6 단일 망"]&lt;/pre&gt;&lt;p&gt;요약: Fly.io는 Docker image를 Firecracker microVM으로 변환해 Lambda와 동일한 격리 기술 위에서 돌리고, 전 세계 region에 깔린 머신을 단일 private network로 묶어준다. 이 머신을 만드는 API 자체가 일반 사용자에게도 노출되어 있어서, fly의 CLI도 결국 그 API를 호출하는 fat client일 뿐이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="firecracker-microvm--aws-lambda와-같은-격리-기술"&gt;Firecracker microVM = AWS Lambda와 같은 격리 기술
&lt;/h2&gt;&lt;p&gt;Fly의 설명에서 가장 인상 깊은 한 줄.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Fly is a service that takes Docker images or OCI-compatible images and converts them to real virtual machines — microVMs — and runs them on &lt;strong&gt;Firecracker, which is the same technology that runs AWS Lambda.&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;이건 두 가지를 동시에 의미한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;컨테이너가 아니라 진짜 VM.&lt;/strong&gt; &lt;code&gt;cgroups&lt;/code&gt; 격리가 아니라 KVM 기반 microVM. 보안 경계가 강하고, 다른 테넌트와 커널을 공유하지 않는다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda 수준의 부팅 속도.&lt;/strong&gt; Firecracker microVM은 100ms 안에 부팅한다. 컨테이너 수준의 가벼움 + VM 수준의 격리.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Fly가 이걸 직접 채택한 이유는 명확하다. 모든 region에서 임의 사용자 Docker image를 받아 돌리려면 격리를 약하게 가져갈 수 없다. 컨테이너 escape 한 번이면 같은 호스트의 다른 사용자를 들여다본다. Firecracker는 그 위협 모델을 위해 만들어진 도구다.&lt;/p&gt;
&lt;p&gt;부수 효과: 같은 image를 EC2, Lambda, Fly Machine으로 옮길 때 격리 모델이 거의 동일하다. 메모리 footprint와 부팅 시간만 비례 조정.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="region-단일-private-network--wireguard--ipv6"&gt;Region 단일 private network — WireGuard + IPv6
&lt;/h2&gt;&lt;p&gt;Fly의 두 번째 클레임:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;All of your virtual machines around the world, no matter what region they are in, are in the same private network thanks to a WireGuard private network and IPv6.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;**&amp;ldquo;앱 로직을 region별로 쪼갤 필요가 없다&amp;rdquo;**가 핵심. 일반적으로 multi-region을 하려면 region별 endpoint를 두고 cross-region replication을 따로 구성한다. Fly는 IPv6 + WireGuard로 모든 머신이 같은 &lt;code&gt;/64&lt;/code&gt; 네트워크에 들어가서, region 간 호출이 그냥 internal IPv6 호출이다.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ice-ice-bear.github.io/posts/2026-05-07-popcon-dev11/" &gt;popcon dev #11&lt;/a&gt;에서 fly frontend에 warm machine 한 대를 두는 결정을 했는데, 이 모델 덕에 가능했다. 한 region(NRT) frontend 머신이 있고, GPU 워커는 RunPod에 있다. fly + RunPod 사이는 단일 fly 네트워크로 연결되니까 라우팅을 따로 신경 안 써도 된다.&lt;/p&gt;
&lt;p&gt;라우팅은 BPF + DNS로 처리된다. Anycast IP를 발급받으면, 사용자의 요청이 자동으로 가장 가까운 region의 머신으로 라우팅된다. 사용자 입장에서는 단일 IP만 알면 되고, fly가 backend에서 가장 가까운 머신을 찾아준다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="fly-ctl이-fat-client인-이유"&gt;fly CTL이 fat client인 이유
&lt;/h2&gt;&lt;p&gt;영상 #2의 핵심 메시지.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;fly CTL is a fat client — it&amp;rsquo;s not a thin client wrapping around API calls to the server of fly.io. It is actually a fat client where it does a lot of the work to use fly&amp;rsquo;s API.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;이게 무슨 뜻이냐면:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fly launch&lt;/code&gt;는 Dockerfile을 자동 detect/생성, IP 할당, SSL 인증서 발급, &lt;code&gt;fly.toml&lt;/code&gt; 생성 등 &lt;strong&gt;여러 API 호출을 클라이언트에서 오케스트레이션&lt;/strong&gt;한다.&lt;/li&gt;
&lt;li&gt;같은 작업을 사용자가 Machines API를 직접 호출해서 처리할 수도 있다 — &lt;code&gt;fly launch&lt;/code&gt;는 그걸 한 줄로 묶어주는 편의 도구일 뿐.&lt;/li&gt;
&lt;li&gt;배포 전략(blue/green, rolling, canary)도 클라이언트가 health check + machine 교체를 순차적으로 부른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 패턴의 실용적 의미: &lt;strong&gt;CLI가 막히는 일을 만나도, Machines API로 직접 우회 가능하다.&lt;/strong&gt; popcon에서 RunPod ID를 fly secret에 동기화하는 &lt;code&gt;sync-pod-id&lt;/code&gt; 스크립트를 짤 때도 이 모델이 작동했다. fly CTL이 안 해주는 작업이 있으면 직접 API로.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fly machine status &amp;lt;id&amp;gt; --json&lt;/code&gt; 명령은 머신 단위 metadata를 직접 보여준다. fly CTL이 만든 머신에는 deploy version, version label 같은 metadata가 박혀 있어서, &amp;ldquo;이 머신이 fly CTL로 만들어졌나, 직접 API로 만들어졌나&amp;quot;를 구분할 수 있다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="flytoml과-nomad-흔적"&gt;fly.toml과 Nomad 흔적
&lt;/h2&gt;&lt;p&gt;영상에서 잠깐 언급된 디테일:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Machines platform — which is not to be confused with the older platform called Nomad that used to run on HashiCorp Nomad. That was the scheduler used. Now we have our own thing going on, we call that the machines platform.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;Fly의 초기 아키텍처는 HashiCorp Nomad를 스케줄러로 썼다. v2부터는 자체 Machines 플랫폼으로 갈아탔다. &lt;code&gt;fly.toml&lt;/code&gt;에 가끔 보이는 &lt;code&gt;[experimental]&lt;/code&gt; 같은 섹션은 Nomad 시절 호환성 유산일 가능성이 있다.&lt;/p&gt;
&lt;p&gt;이 결정은 회고적으로 좋아 보인다. Nomad는 범용 스케줄러라서 microVM 전용 워크로드의 특수성(빠른 콜드 스타트, image push, region affinity)을 직접 표현하기 어렵다. 자체 빌드한 Machines 플랫폼은 이 모든 걸 first-class로 다룬다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="인사이트"&gt;인사이트
&lt;/h2&gt;&lt;p&gt;&amp;ldquo;Machines가 빌딩 블록&amp;quot;이라는 표현은 흔한 마케팅 카피로 들리지만, 영상을 보고 나니 두 가지 구체적 의미로 읽힌다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;fly launch&lt;/code&gt;도 결국 Machines API의 클라이언트다.&lt;/strong&gt; 즉, fly가 우리에게 노출하는 추상화 모두가 같은 API 위에 있고, 우리가 같은 API를 직접 호출해서 새 추상화를 만들 수 있다. 자체 deploy orchestrator가 필요하면 짤 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;격리 모델이 강하다는 게 multi-tenant 가격 책정을 가능하게 한다.&lt;/strong&gt; 컨테이너 호스트가 아니라 microVM 호스트라서, 사용자가 신뢰할 수 없는 image를 올려도 안전하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;popcon에서 fly + RunPod hybrid 구조를 쓰는데, fly는 reliable한 스테이트풀 부분(API, frontend, DB, R2 클라이언트)을 맡고 RunPod은 GPU-heavy 워커를 맡는다. 두 클러스터 사이의 통신이 fly의 IPv6 private network 위에서 깨끗하게 흐르는 게 운영 관점에서 큰 이점이다.&lt;/p&gt;
&lt;p&gt;다음에 살펴볼 것: fly의 Anycast IP가 실제로 어떻게 작동하는지(BPF로 어떻게 라우팅이 결정되는지), Machines API를 직접 호출해서 deploy를 짠 사례들, fly의 region pricing.&lt;/p&gt;</description></item></channel></rss>