Tilt
로컬 Kubernetes 개발 환경 도구
로컬 Kubernetes 개발 환경 도구
Tilt는 2018년 출시된 로컬 Kubernetes 개발 환경 도구로, 코드 변경 시 자동으로 빌드, 푸시, 배포를 수행하는 "라이브 업데이트" 기능이 핵심입니다. Docker Compose의 편의성을 Kubernetes에 가져온 도구라고 볼 수 있습니다.
Tiltfile이라는 Python 기반 스크립트로 개발 환경을 정의합니다. docker_build로 이미지 빌드를, k8s_yaml로 매니페스트를, k8s_resource로 리소스 설정을 정의합니다. 코드 변경 감지 시 변경된 파일만 컨테이너에 동기화(Live Update)하거나 전체 빌드를 수행합니다.
Tilt의 웹 UI는 모든 서비스의 빌드 상태, 로그, 에러를 한 화면에서 보여줍니다. 빌드 시간, 배포 시간이 실시간으로 표시되어 병목 지점을 쉽게 파악할 수 있습니다. 문제 발생 시 원클릭으로 해당 서비스의 로그와 상태를 확인합니다.
실무에서는 마이크로서비스 환경에서 여러 서비스를 동시에 개발할 때 사용합니다. 개발자가 담당하는 서비스만 로컬 코드로 실행하고, 나머지는 클러스터의 이미지를 사용합니다. 평균적으로 빌드-배포 사이클이 5분에서 10초 이내로 단축됩니다.
# Tiltfile 예제
# 마이크로서비스 개발 환경 설정
# 의존성 있는 Helm 차트 설치 (Redis, PostgreSQL)
load('ext://helm_resource', 'helm_resource')
helm_resource('redis', 'bitnami/redis', namespace='dev')
helm_resource('postgresql', 'bitnami/postgresql', namespace='dev')
# API 서비스 - Live Update 활성화
docker_build(
'myapp/api-service',
'./services/api',
dockerfile='./services/api/Dockerfile',
live_update=[
# 소스 코드만 동기화 (빌드 없이)
sync('./services/api/src', '/app/src'),
# package.json 변경 시 npm install 실행
run('npm install', trigger=['./services/api/package.json']),
]
)
# Web 프론트엔드 - Hot Reload
docker_build(
'myapp/web',
'./services/web',
dockerfile='./services/web/Dockerfile.dev',
live_update=[
sync('./services/web/src', '/app/src'),
sync('./services/web/public', '/app/public'),
]
)
# Worker 서비스 - 전체 빌드
docker_build(
'myapp/worker',
'./services/worker',
dockerfile='./services/worker/Dockerfile'
)
# Kubernetes 매니페스트 적용
k8s_yaml([
'./k8s/api-deployment.yaml',
'./k8s/web-deployment.yaml',
'./k8s/worker-deployment.yaml',
])
# 리소스 설정
k8s_resource(
'api-service',
port_forwards='8080:8080', # localhost:8080으로 접근
resource_deps=['redis', 'postgresql'], # 의존성
labels=['backend']
)
k8s_resource(
'web',
port_forwards='3000:3000',
resource_deps=['api-service'],
labels=['frontend']
)
k8s_resource(
'worker',
resource_deps=['redis'],
labels=['backend']
)
# 개발 편의 설정
config.define_bool("debug")
cfg = config.parse()
if cfg.get("debug"):
# 디버그 모드에서 추가 설정
local_resource(
'db-seed',
cmd='npm run db:seed',
deps=['./seeds'],
labels=['setup']
)
# 실행: tilt up
# UI 접속: http://localhost:10350
시니어: "마이크로서비스 12개 로컬에서 다 띄우기 힘들어요. Tilt로 내가 개발하는 서비스만 live update 걸고 나머지는 클러스터 거 쓰면 어떨까요?"
주니어: "Live Update가 뭔가요? 매번 이미지 빌드 안 해도 되나요?"
시니어: "소스 파일만 컨테이너에 동기화해요. Node.js면 nodemon이 자동 재시작하니까 저장하면 바로 반영돼요."
면접관: "로컬 Kubernetes 개발 환경은 어떻게 구성하셨나요?"
지원자: "Tilt를 사용했습니다. Tiltfile에서 서비스별 빌드와 배포를 정의하고, live_update로 코드 변경 시 컨테이너에 직접 동기화했습니다. 개발 사이클이 이미지 빌드 포함 3분에서 5초로 단축됐고, 웹 UI에서 모든 서비스 상태를 한눈에 볼 수 있어 디버깅도 편했습니다."
리뷰어: "Tiltfile에 live_update 없이 docker_build만 있네요. 매번 전체 빌드하면 느려요."
개발자: "Node.js라 sync로 /app/src만 동기화하면 nodemon이 재시작하겠네요. live_update 추가하겠습니다."