오늘은 쿠버네티스(Kubernetes)를 사용하면서 가장 빈번하게 접하고, 실제 운영 환경에서 애플리케이션 배포의 표준으로 자리 잡은 **Deployment(디플로이먼트)**에 대해 다루어 보겠습니다.
쿠버네티스에서 컨테이너를 실행하는 최소 단위는 Pod입니다. 하지만 우리가 실제 운영 환경에서 Pod를 직접 하나하나 관리하는 일은 거의 없습니다. 서비스의 가용성을 보장하고, 업데이트를 자동화하며, 장애 발생 시 스스로 복구하는 기능이 필요하기 때문이죠.
이 모든 과정을 책임지는 컨트롤러가 바로 Deployment입니다.
이전 시간에 학습한 [Kubernetes] Kubernetes ReplicaSet과 Replicas 완벽 이해하기 바로가기
[Kubernetes] Kubernetes ReplicaSet과 Replicas 완벽 이해하기
안녕하세요! 오늘은 쿠버네티스(Kubernetes) 운영의 핵심이자, 서비스의 안정성을 책임지는 **ReplicaSet(레플리카셋)**과 Replicas(레플리카) 설정에 대해 깊이 있게 알아보겠습니다. 특히 이론뿐만 아니
couquedassee.tistory.com
1. Deployment란 무엇인가?
Deployment는 **Pod와 ReplicaSet에 대한 선언적 업데이트(Declarative Updates)**를 제공하는 리소스입니다.
- 상태 관리: 사용자가 원하는 Pod의 상태(개수, 버전 등)를 정의하면, Deployment 컨트롤러가 현재 상태를 원하는 상태로 일치시키기 위해 지속적으로 작동합니다.
- 배포 전략: 중단 없는 배포(Rolling Update)나 기존 버전을 모두 삭제 후 새로 생성하는 방식(Recreate) 등을 선택할 수 있습니다.
- 롤백(Rollback): 배포 중 문제가 발생하면 이전 버전으로 즉시 되돌릴 수 있는 히스토리 기능을 제공합니다.

2. Deployment 구성 요소 (YAML 실습)
가장 대중적인 웹 서버인 nginx를 활용해 Deployment를 정의해 보겠습니다.
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 유지하고 싶은 Pod의 개수
selector:
matchLabels:
app: nginx # 이 라벨을 가진 Pod들을 관리합니다.
template:
metadata:
labels:
app: nginx # 생성될 Pod에 부여할 라벨
spec:
containers:
- name: nginx
image: nginx:1.14.2 # 사용할 이미지 버전
ports:
- containerPort: 80
3. Hands-on: 배포 및 상태 확인
위에서 작성한 YAML 파일을 클러스터에 적용하고 결과를 확인해 보겠습니다.
배포 실행
kubectl apply -f nginx-deployment.yaml
상태 확인 (Test Results)
명령어를 실행하면 Deployment가 ReplicaSet을 생성하고, ReplicaSet이 정의된 개수(3개)만큼 Pod를 생성한 것을 확인할 수 있습니다.
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 20s
$ kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-75675f5897 3 3 3 25s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-75675f5897-abc12 1/1 Running 0 30s
nginx-deployment-75675f5897-def34 1/1 Running 0 30s
nginx-deployment-75675f5897-ghi56 1/1 Running 0 30s
4. 핵심 기능: 전략적 업데이트와 롤백
Deployment의 진가는 이미지 업데이트 상황에서 드러납니다. nginx:1.14.2 버전을 1.16.1로 업데이트해 보겠습니다.
이미지 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1
이때 쿠버네티스는 Rolling Update를 수행합니다. 한 번에 모든 Pod를 끄는 것이 아니라, 새로운 버전의 Pod를 하나씩 생성하면서 기존 버전의 Pod를 하나씩 제거합니다. 이를 통해 서비스 중단 없이 배포가 가능해집니다.
롤백(Rollback) 실행
만약 업데이트한 버전에 심각한 버그가 발견되었다면? 단 한 줄의 명령어로 이전 상태로 돌아갈 수 있습니다.
$ kubectl rollout undo deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back
5. Deployment 사용 시 주의할 점 (Tips)
- Selector와 Labels의 일치: spec.selector.matchLabels와 spec.template.metadata.labels는 반드시 일치해야 합니다. 일치하지 않으면 Deployment가 Pod를 인식하지 못해 무한 루프에 빠질 수 있습니다.
- 무상태(Stateless) 애플리케이션 권장: Deployment는 기본적으로 Pod를 교체하는 방식이므로, 데이터 저장이 필요한 DB 같은 애플리케이션은 StatefulSet을 고려하는 것이 좋습니다.
- Liveness/Readiness Probe 활용: Deployment가 새 Pod가 "정말 정상인지" 판단하게 하려면 프로브(Probe) 설정을 병행해야 진정한 무중단 배포를 완성할 수 있습니다.
💡 Insight: 왜 Deployment인가?
기술적으로 Deployment는 **'선언적 프로그래밍'**을 보여줍니다.
과거의 인프라 관리가 "A 서버에 접속해서 패키지를 설치하고 서비스를 재시작하라"는 명령형(Imperative) 방식이었다면, 쿠버네티스의 Deployment는 "나는 nginx 3개가 항상 떠 있는 상태를 원해"라고 **원하는 상태(Desired State)**를 선언하는 방식입니다.
이러한 패러다임의 변화는 개발자가 인프라의 복잡한 절차에 신경 쓰지 않고, 비즈니스 로직과 서비스 가용성에만 집중할 수 있게 해줍니다. 롤링 업데이트와 셀프 힐링(Self-healing)은 그 과정에서 얻어지는 강력한 부수 효과일 뿐입니다.
오늘 공유해 드린 내용이 쿠버네티스 환경에서 안정적인 서비스를 운영하는 데 도움이 되길 바랍니다.
다음에는 Deployment와 찰떡궁합인 'Service' 리소스를 통해 외부에서 이 Pod들에 접속하는 방법을 알아보도록 하겠습니다.
더 읽어볼 만한 글:
'DevOps > Kubernetes' 카테고리의 다른 글
| [Kubernetes] ReplicaSet과 Deployment, 대체 뭐가 다른 걸까? (차이점 명확히 알기) (1) | 2026.03.11 |
|---|---|
| [Kubernetes] Pod의 생명주기(Lifecycle)와 리스타트 정책(Restart Policy) 완벽 이해 (0) | 2026.03.09 |
| [Kubernetes] Kubernetes ReplicaSet과 Replicas 완벽 이해하기 (0) | 2026.03.04 |
| [Kubernetes] 어플리케이션의 생명주기와 관리: 프로브(Probes)와 레이블(Labels) (0) | 2026.03.03 |
| Ubuntu 기반 Kubernetes kubeadm 설치 가이드 (containerd + Cilium) (0) | 2026.02.18 |
댓글