🤔 Deployment란?
간단히 말해, Deployment는 Pod를 선언적으로 배포, 관리, 업데이트할 수 있게 해주는 상위 컨트롤러입니다. ‘Pod 매니저’라고 생각하면 쉽습니다.
핵심 개념은 우리가 “원하는 상태(Desired State)”를 정의하면, Deployment가 현재 상태를 감시하며 그 상태를 알아서 유지해준다는 점입니다. 예를 들어, “나는 Nginx 웹 서버 Pod를 3개 실행하고 싶다”라고 YAML 파일에 선언해두면, Deployment는 무슨 일이 있어도 Pod 3개를 유지하기 위해 노력합니다. Pod 하나가 갑자기 죽으면 즉시 새로 만들고, 실수로 4개를 띄우면 하나를 삭제하는 식이죠.
✨ Deployment가 제공하는 주요 기능
Deployment는 단순한 Pod 생성기를 넘어, 안정적인 서비스 운영에 필수적인 여러 강력한 기능을 제공합니다.
1. Pod 수 관리 (Replica 관리)
- 항상 지정한 수의 Pod가 실행되도록 보장합니다. YAML에
replicas: 3
이라고 정의했다면, Deployment는 3개의 Pod가 항상 떠 있도록 관리합니다. - 장애 발생 시 자동으로 새 Pod를 생성합니다. 노드 문제나 애플리케이션 오류로 Pod가 죽더라도, Deployment가 이를 감지하고 즉시 새로운 Pod를 생성해 서비스 공백을 최소화합니다.
2. 무중단 배포 (롤링 업데이트)
- 새 버전 배포 시, 기존 버전을 점진적으로 교체합니다. 새 버전의 Pod를 하나 띄우고, 정상 실행이 확인되면 기존 버전의 Pod를 하나 내리는 과정을 반복합니다.
- 이 덕분에 사용자는 서비스 중단 없이 새로운 기능이 적용된 서비스를 이용할 수 있습니다. 운영의 안정성을 크게 높여주는 핵심 기능입니다.
3. 버전 롤백
- 새 버전을 배포했는데 심각한 버그가 발견되었나요? 걱정할 필요 없습니다.
kubectl rollout undo
라는 간단한 명령어로, 이전의 안정적인 버전으로 신속하게 복원할 수 있습니다. 이 롤백 과정 또한 무중단 방식으로 안전하게 진행됩니다.
4. 선언적 관리 (Declarative Management)
- 모든 배포 설정은 YAML 파일로 정의되고 관리됩니다.
- 이는 배포 상태를 코드로 관리(Infrastructure as Code)할 수 있게 해주며, Git과 같은 버전 관리 시스템을 통해 변경 이력을 추적하고 협업을 용이하게 만듭니다.
💻 기본 예시: Deployment YAML
가장 기본적인 Deployment YAML 파일의 구조입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
위 YAML의 의미:
nginx:1.25
이미지를 사용하는 컨테이너를 가진 Pod를 3개(replicas: 3
) 실행해줘.- Deployment는
app: my-app
이라는 라벨(selector
)을 가진 Pod들을 자신의 관리 대상으로 삼을 거야. - Pod를 만들 때는 이 템플릿(
template
)을 사용하고, 생성된 Pod에app: my-app
라벨을 붙여줘. - 만약 Pod 수가 3개보다 부족하면 자동으로 생성하고, 많으면 자동으로 삭제해서 항상 3개를 유지해줘.
🔗 Deployment와 함께 작동하는 컨트롤러
사실 Deployment는 혼자 모든 일을 하지 않습니다. 내부적으로 다른 컨트롤러와 협력하여 동작합니다.
Deployment
↓
ReplicaSet
↓
Pod (n개)
- Deployment: 배포 전략(예: 롤링 업데이트)을 관리하고 버전 기록을 유지하는 최상위 사령관입니다. 업데이트 명령이 내려지면 새로운 ReplicaSet을 생성합니다.
- ReplicaSet: Deployment의 하위 컨트롤러로, 오직 ‘지정된 수의 Pod 복제본을 유지’하는 임무만 수행하는 실행 담당자입니다. Deployment가 생성하고 관리하므로 우리가 직접 다룰 일은 거의 없습니다.
- Pod: 실제 애플리케이션 컨테이너가 실행되는 기본 단위입니다.
🚀 개발자 관점 요약
• Deployment는 Pod를 안정적이고 선언적으로 관리할 수 있게 해주는 핵심 컨트롤러입니다.
• 서비스 무중단 배포, 롤백, 리소스 유지 관리 기능을 제공하여 운영 부담을 크게 줄여줍니다.
• 실서비스 환경에서는 항상 Deployment를 통해 Pod를 관리해야 합니다.
•kubectl get deployment
,kubectl rollout status
등의 명령어를 통해 배포 상태를 손쉽게 추적할 수 있습니다.