Serverless on K8s — Knative
트래픽이 없으면 Pod도 없다 — K8s 위에서 Serverless를 구현
1. Serverless란
1.1 핵심 개념
| 원칙 | 설명 |
|---|---|
| 서버 관리 없음 | 인프라를 신경 쓰지 않고 코드에만 집중 |
| 이벤트 기반 | 요청/이벤트가 올 때만 실행 |
| 자동 스케일링 | 트래픽에 따라 0 → N 자동 조절 |
| 종량 과금 | 실행 시간만큼만 비용 |
1.2 K8s 위의 Serverless
| 클라우드 네이티브 | K8s 기반 |
|---|---|
| AWS Lambda, Azure Functions, GCP Cloud Functions | Knative, OpenFaaS, KEDA |
| 완전 관리형, 벤더 종속 | K8s 위에서 동작, 벤더 중립 |
💡 왜 K8s Serverless인가? 벤더 종속 없이, 온프레미스에서도, 기존 K8s 인프라를 활용하여 Serverless 패턴을 적용할 수 있음.
2. Knative
2.1 구성
| 컴포넌트 | 역할 |
|---|---|
| Knative Serving | HTTP 기반 워크로드의 자동 스케일링 (0까지) |
| Knative Eventing | 이벤트 기반 아키텍처 (이벤트 소스 → 브로커 → 트리거) |
2.2 Knative Serving
flowchart LR
Request["HTTP 요청"] --> Activator["Activator<br/>(Pod 0일 때 대기)"]
Activator --> Pod["Pod<br/>(자동 생성)"]
Pod -->|"트래픽 없으면"| Zero["Scale to 0"]
Scale-to-Zero:
- 설정 가능한 유휴 시간(기본 60초) 후 Pod를 0으로 스케일 다운
- 새 요청이 오면 Activator가 감지 → Pod를 빠르게 생성 → 요청 전달
- ⚠️ 콜드 스타트: Pod 0 → 1로 올라올 때 수 초의 지연 발생
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: hello
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/min-scale: "0" # 최소 0 (Scale-to-Zero)
autoscaling.knative.dev/max-scale: "10" # 최대 10
autoscaling.knative.dev/target: "100" # Pod당 동시 요청 100
spec:
containers:
- image: gcr.io/knative-samples/helloworld-go
env:
- name: TARGET
value: "World"
2.3 Knative Eventing
이벤트 소스(Kafka, Cloud Events, Cron)에서 이벤트를 받아 처리.
flowchart LR
Source["이벤트 소스<br/>(Kafka, S3, Cron)"]
Broker["Broker<br/>(이벤트 라우터)"]
Trigger["Trigger<br/>(필터 조건)"]
Consumer["처리 서비스<br/>(Knative Service)"]
Source --> Broker --> Trigger --> Consumer
3. KEDA (Kubernetes Event-Driven Autoscaling)
HPA를 이벤트 기반으로 확장. Kafka 큐 길이, HTTP 요청 수, Cron 등을 기반으로 Pod를 스케일링.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kafka-consumer
spec:
scaleTargetRef:
name: kafka-consumer-deployment
minReplicaCount: 0 # Scale-to-Zero 가능
maxReplicaCount: 20
triggers:
- type: kafka
metadata:
bootstrapServers: kafka:9092
consumerGroup: my-group
topic: my-topic
lagThreshold: "100" # 메시지 지연 100개 이상이면 스케일 아웃
| Knative | KEDA | |
|---|---|---|
| 초점 | HTTP Serverless + 이벤트 | 이벤트 기반 오토스케일링 |
| Scale-to-Zero | ✅ (핵심 기능) | ✅ |
| 복잡도 | 높음 (전체 프레임워크) | ✅ 낮음 (HPA 확장) |
| 이벤트 소스 | Cloud Events 표준 | ✅ 60+ scaler (Kafka, SQS, Redis...) |
| 설치 | 무거움 | ✅ 가벼움 |
| 추천 | 풀 Serverless 플랫폼 | ✅ 이벤트 기반 스케일링만 필요하면 |
4. 적합한 워크로드
Serverless가 적합한 경우
| 워크로드 | 이유 |
|---|---|
| 웹훅 처리 | 간헐적 호출, Scale-to-Zero로 비용 절약 |
| 이벤트 처리 | Kafka/SQS 메시지 소비 |
| 배치 작업 | 주기적 실행, 유휴 시 자원 0 |
| API 게이트웨이 | 트래픽 변동이 큰 API |
| CI/CD 빌드 | 빌드 요청 시만 실행 |
Serverless가 부적합한 경우
| 워크로드 | 이유 |
|---|---|
| DB, 상태 서비스 | 상시 실행 필요, 콜드 스타트 불가 |
| 상시 트래픽 앱 | Scale-to-Zero 의미 없음, 오히려 오버헤드 |
| 저지연 필수 | 콜드 스타트(수 초)가 문제 |
| 복잡한 상태 관리 | Serverless는 무상태에 적합 |
정리
이것으로 심화편(#13~#18) 완료.
| 심화편 | 핵심 |
|---|---|
| #13 Service Mesh | 마이크로서비스 통신을 인프라로. Istio(풍부) vs Linkerd(간결) |
| #14 Operator | CRD + Controller = 운영 자동화. K8s API 확장의 핵심 |
| #15 보안 심화 | OPA/Gatekeeper(정책), Falco(런타임), Supply Chain(이미지) |
| #16 멀티클러스터 | 장애 격리, 환경 분리. Rancher, ArgoCD, Cluster API |
| #17 FinOps | 비용 가시성(Kubecost), 리소스 최적화, Spot, Karpenter |
| #18 Serverless | Scale-to-Zero. Knative(풀 플랫폼) vs KEDA(이벤트 스케일링) |
🔗 관련 문서
- Kubernetes Series Index — 시리즈 목차
- AI 인프라 — K8s + GPU
- MLOps — K8s 위 ML 파이프라인