안녕하세요! 👋 쿠버네티스에서 파드(Pod)를 하나하나 수동으로 관리하는 것은 정말 힘든 일입니다. 파드가 갑자기 죽으면 어떻게 하죠? 트래픽이 몰려서 파드를 10개로 늘려야 한다면요? 일일이 명령어를 치고 계실 건가요? 🤯
이런 원시적인(?) 고민을 해결해 주는 쿠버네티스의 핵심 오브젝트, 바로 Deployment(디플로이먼트)에 대해 알아보겠습니다. Deployment는 파드의 개수를 보장하고, 업데이트와 롤백을 손쉽게 하며, 애플리케이션을 선언적으로 관리하는 '만능 파드 매니저'입니다.

🏗️ 관계 이해: Deployment는 어떻게 ReplicaSet을 조종하는가?
Deployment를 이해하려면 먼저 그 밑에서 궂은일을 하는 ReplicaSet(레플리카셋)을 알아야 합니다.
ReplicaSet의 단 하나의 임무
ReplicaSet의 역할은 아주 단순하고 명확합니다. "지정된 개수(replica)의 똑같은 파드가 항상 실행되도록 보장하는 것"입니다.
- 파드가 죽거나 삭제되면? -> ReplicaSet이 즉시 새로운 파드를 만듭니다.
- 파드가 지정된 개수보다 많으면? -> ReplicaSet이 남는 파드를 제거합니다.
마치 정해진 인원을 항상 유지하는 경호팀과 같죠. 💂♂️
Deployment와 ReplicaSet의 관계
그렇다면 Deployment는 왜 필요할까요? 우리는 보통 ReplicaSet을 직접 만들지 않고 Deployment를 통해 제어합니다.
Deployment (지휘관) ➡️ ReplicaSet (행동대장) ➡️ Pod (대원)
Deployment는 ReplicaSet을 관리하는 상위 컨트롤러입니다. Deployment가 이처럼 한 단계를 더 거치는 이유는 바로 '업데이트'를 우아하게 처리하기 위해서입니다.
애플리케이션 버전을 업그레이드한다고 상상해 보세요. Deployment는 다음과 같이 동작합니다.
- 새로운 버전의 앱 정보를 담은 새로운 ReplicaSet을 만듭니다.
- 새로운 ReplicaSet의 파드 개수를 하나 늘립니다 (Scale up).
- 새 파드가 정상적으로 실행되면, 기존 버전의 구 ReplicaSet의 파드 개수를 하나 줄입니다 (Scale down).
- 이 과정을 반복하여 모든 파드를 점진적으로, 중단 없이 새로운 버전으로 교체합니다.
이것이 바로 롤링 업데이트(Rolling Update)이며, Deployment가 ReplicaSet을 통해 구현하는 핵심 기능입니다. ReplicaSet만으로는 이런 정교한 업데이트 전략을 구사할 수 없습니다.
✨ Deployment를 이용한 선언적 배포
Deployment는 우리가 원하는 애플리케이션의 '바람직한 상태(Desired State)'를 선언하면, 현재 상태를 그에 맞게 자동으로 조절해 주는 컨트롤러입니다. "nginx 1.23.4 버전 컨테이너를 사용하는 파드 3개를 항상 유지해 줘!"라고 YAML 파일에 선언하고 제출하면, 나머지는 Deployment가 알아서 다 해줍니다.
Deployment의 핵심 기능
- 파드 복제 및 관리: ReplicaSet을 통해 지정된 수의 파드를 항상 유지합니다.
- 선언적 업데이트: YAML 파일의 이미지 버전만 바꾸고 적용하면, 알아서 무중단 롤링 업데이트를 수행합니다.
- 손쉬운 롤백: 업데이트에 문제가 생겼을 경우, 단 한 줄의 명령어로 이전 버전으로 안전하게 되돌릴 수 있습니다.
- 간편한 확장(Scaling): 필요에 따라 파드의 개수를 손쉽게 늘리거나 줄일 수 있습니다.
🚀 Deployment 생성 및 확장(Scaling) 실습
이제 직접 Deployment를 만들고 확장해 봅시다.
Deployment 생성하기
다음은 3개의 nginx 파드를 실행하는 간단한 Deployment YAML 파일입니다.
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 1. 이 Deployment가 관리할 파드의 개수는 3개입니다.
selector:
matchLabels:
app: nginx # 2. 이 Deployment는 'app: nginx' 라벨을 가진 파드를 찾아서 관리합니다.
template: # 3. 파드를 만들 때 사용할 '설계도(template)'입니다.
metadata:
labels:
app: nginx # 파드에 'app: nginx' 라벨을 붙여줍니다. (selector와 일치해야 함)
spec:
containers:
- name: nginx
image: nginx:1.23.4 # 사용할 컨테이너 이미지
ports:
- containerPort: 80
위 파일을 저장하고 아래 명령어로 쿠버네티스 클러스터에 적용합니다.
kubectl apply -f nginx-deployment.yaml
생성된 Deployment와 그로 인해 만들어진 파드들을 확인해 봅시다.
# Deployment 상태 확인
kubectl get deployment nginx-deployment
# 파드 목록 확인 (app=nginx 라벨을 가진 파드 필터링)
kubectl get pods -l app=nginx
replicas에 선언한 대로 3개의 파드가 정상적으로 실행 중인 것을 볼 수 있습니다!
Deployment 확장(Scaling)하기
트래픽이 증가하여 웹 서버를 5대로 늘려야 하는 상황입니다. 스케일링은 정말 간단합니다.
방법 1: kubectl scale 명령어로 직접 변경 (명령형) 가장 빠르고 직관적인 방법입니다.
kubectl scale deployment nginx-deployment --replicas=5
방법 2: YAML 파일 수정 후 재적용 (선언형, ✨ 권장) GitOps 등 형상 관리를 위해 더 권장되는 방식입니다. nginx-deployment.yaml 파일의 replicas 값을 3에서 5로 수정한 뒤, 다시 apply 명령어를 실행하면 됩니다.
...
spec:
replicas: 5 # 3에서 5로 변경
...
kubectl apply -f nginx-deployment.yaml
어떤 방법을 사용했든, 다시 파드 목록을 확인하면 파드가 5개로 늘어난 것을 볼 수 있습니다. 반대로 숫자를 줄이면 파드가 줄어듭니다.
kubectl get pods -l app=nginx
✅ 정리하며
오늘은 쿠버네티스에서 상태 없는(stateless) 애플리케이션을 배포하고 관리하는 표준 방식인 Deployment에 대해 알아보았습니다.
- Deployment는 ReplicaSet을 제어하여 파드의 개수를 보장하고, 선언적으로 애플리케이션 상태를 관리합니다.
- YAML 파일에 원하는 상태(replicas, image 등)를 정의하고 kubectl apply만 하면, Deployment가 알아서 롤링 업데이트, 롤백, 스케일링을 처리해 줍니다.
- 이제 더 이상 파드를 수동으로 관리하지 마세요. Deployment에게 맡기고 우리는 더 중요한 일에 집중할 수 있습니다!
Deployment는 쿠버네티스 생태계의 가장 기본적이면서도 강력한 컨트롤러이므로, 반드시 그 원리와 사용법을 숙지하시기 바랍니다.
태그: Kubernetes, K8s, Deployment, ReplicaSet, 쿠버네티스, 배포, 스케일링, 롤링 업데이트, DevOps, MSA
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| 📦 쿠버네티스 앱 관리의 끝판왕, Helm 기본 사용법 정복하기 (2) | 2025.09.02 |
|---|---|
| 🚀 무중단 배포의 마법, Kubernetes Deployment 롤링 업데이트! (4) | 2025.09.02 |
| Kubernetes ServiceAccount: Pod에 맞춤형 신분증과 권한을 부여하는 방법 (4) | 2025.09.02 |
| ⚖️ Kubernetes Requests & Limits: 우리 앱 안정성 지키는 최소한의 약속 (4) | 2025.09.02 |
| 🔐 Kubernetes Secret: API 키와 DB 비밀번호, 이제 안전하게 관리하세요! (1) | 2025.09.02 |