마이크로서비스는 단일 책임, 데이터 소유, 명확한 배포 경계를 지향하며 대체로 Twelve-Factor App 원칙을 따릅니다.
이러한 애플리케이션은 에페메럴(ephemeral) — 즉, 부작용 없이 생성·확장·종료가 가능한 형태일 때 운영이 용이하며, 그 핵심이 바로 Stateless입니다.
Kubernetes에는 ‘애플리케이션’이라는 1급 개념이 존재하지 않습니다. 대신 Pod / ReplicaSet / Deployment / Service / ConfigMap / Secret / PVC 같은 리소스들을 조합하여 애플리케이션을 구성합니다.
Stateless 워크로드의 핵심 컨트롤러는 ReplicaSet이지만, 일반적으로 사용자는 Deployment를 통해 관리합니다.
(업데이트, 롤백, 스케일 전략 등을 포함합니다)
구조 요약
Pod(헬스체크) → ReplicaSet(복제본 수 유지) → Deployment(업데이트/롤백 자동화) → Service(레디 Pod로 트래픽 분산) → 필요 시 PVC(파일 스토리지).이 관계는 Kubernetes가 강제하지 않으므로 의도적인 조합이 필요합니다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: random-generator
labels:
app: random-generator
spec:
replicas: 3
selector:
matchLabels:
app: random-generator
template:
metadata:
labels:
app: random-generator
spec:
containers:
- name: random-generator
image: k8spatterns/random-generator:1.0
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /live
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
random-generator를 3개 복제하여 동일 라벨로 관리합니다.
템플릿을 통해 항상 동일한 Pod 구성이 유지됩니다.
apiVersion: v1
kind: Service
metadata:
name: random-generator
labels:
app: random-generator
spec:
selector:
app: random-generator
ports:
- name: http
port: 80
targetPort: 8080
type: ClusterIP
random-generator ClusterIP Service는 80 → 8080으로 전달하며,
셀렉터로 매칭된 Pod에 트래픽을 분산시킵니다.
ClusterIP는 변하지 않는 고정 진입점 역할을 합니다.
Idempotent(멱등성) 처리란 같은 요청이 여러번 들어와도 시스템 상태나 결과가 변하지 않는 특성을 의미합니다.
stateless 환경에서는 인스턴스가 언제든지 종료/복제/재시작이 될수 있으므로, 요청이 중복으로 수행될 가능성이 높습니다.
[모범사례]
Kubernetes는 Pod의 상태를 두 가지 프로브로 관리합니다.
[Liveness와 Readiness를 분리해야 하는 이유]
[모범 사례]
Deployment(애플리케이션) 와 Service(트래픽 분산) 는 서로 의존하지 않는 것이 이상적입니다.
즉, 새로운 버전이 배포되더라도 서비스 전체 중단 없이 점진적으로 교체될 수 있어야 합니다.
[Deployment, Service를 분리해야 하는 이유]
[모범사례]
Stateless 애플리케이션은 인스턴스 간 상태 공유가 없으므로, 수평 확장(Scale-out) 이 가장 효과적인 운영 방식입니다.
[주요 방식]
1. HPA (Horizontal Pod Autoscaler)
[모범 사례]
Knative Serving은 Kubernetes 위에서 동작하는 서버리스 프레임워크입니다.
트래픽이 없을 때 Pod을 0으로 줄였다가, 요청이 들어오면 자동으로 Scale-up 시킵니다.
즉, Stateless 워크로드의 극단적 확장성(Auto 0→N→0) 을 제공합니다.
[특징]
[활용 예시]
[예시 매니페스트]
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: echo-server
spec:
template:
metadata:
annotations:
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "10"
spec:
containers:
- image: hashicorp/http-echo:1.0.0
args: ["-text=hello knative", "-listen=:8080"]
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml -O metrics-server.yaml
vi metrics-server.yamlcontainer args에 아래 설정 추가
- --kubelet-insecure-tls
적용
kubectl apply -f metrics-server.yaml
kubectl get pods -n kube-system -l k8s-app=metrics-server -o wide
kubectl describe deployment metrics-server -n kube-system | grep -A10 "Args" 

stateless 적용
apiVersion: apps/v1
kind: Deployment
metadata:
name: stateless-echo
spec:
replicas: 3
selector:
matchLabels:
app: stateless-echo
template:
metadata:
labels:
app: stateless-echo
spec:
containers:
- name: app
image: hashicorp/http-echo:1.0.0
args: ["-text=hello", "-listen=:8080"]
ports:
- containerPort: 8080
resources:
requests:
cpu: "100m"
memory: "64Mi"
limits:
cpu: "200m"
memory: "128Mi"
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 2
periodSeconds: 5
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: stateless-echo
labels:
app: stateless-echo
spec:
selector:
app: stateless-echo
ports:
- name: http
port: 80
targetPort: 8080
type: ClusterIP
배포
kubectl apply -f stateless-echo.yaml
kubectl get pods -l app=stateless-echo -w

kubectl port-forward svc/stateless-echo 8080:80
curl -s localhost:8080

CPU 사용량에 따라 Pod 수를 자동으로 조정하는 HPA(Horizontal Pod Autoscaler)를 실습하여
Stateless 애플리케이션의 수평 확장성(Scale-out) 개념을 체험합니다.
HPA 생성
kubectl autoscale deployment stateless-echo --cpu-percent=50 --min=1 --max=5
HPA 생성 확인 :
kubectl get hpa
kubectl describe hpa stateless-echo


부하 테스트 진행 (ARM64 기준)
for i in $(seq 1 5); do
kubectl run load-generator-$i \
--image=busybox \
--restart=Never \
-- /bin/sh -c "while true; do wget -q -O- http://stateless-echo.default.svc.cluster.local >/dev/null; done" &
done
kubectl get po

hpa 확인
kubectl get hpa -w

부하테스트 중단
for i in $(seq 1 5); do kubectl delete pod load-generator-$i; done
안녕하세요. 작성해주신 글 잘 읽었습니다. knative라는 것을 덕분에 알게 됐습니다. 혹시 현업에서 knative를 사용한 경험이 있으시면 어떤 식으로 주로 사용하시는지 그리고 빈번히 사용되는지에 대해 여쭤보고싶습니다. 처음 들어본 내용이고 검색을 해봐도 애플리케이션에 대한 설명만 나와있어서 경험적인 내용을 찾기 어려워서요.