학습 예시 안내: 본문의 상황과 출력은 개념 설명을 위한 예시로 정리했습니다. 당시 실행 여부는 확인되지 않았으며, 현재 환경에서의 클러스터 실습도 별도 검증이 필요합니다.
🎯 학습 목표
이 글을 통해 다음을 학습할 수 있습니다:
- 단일 Pod 관리의 한계점과 해결책
- ReplicaSet의 개념과 동작 원리
- Deployment를 통한 선언적 업데이트 관리
- 스케일링과 롤링 업데이트 실습
- CKA 준비 과정에서 연습할 패턴들
📝 앞선 개념과 이번 예제
지난 글에서는 Pod의 기본 개념과 관리 방법을 다뤘습니다. 이번에는 단독 Pod를 삭제하거나 교체해야 하는 상황을 가정해 봅니다.
단일 Pod의 한계점들
# 지난번에 만든 Pod 확인
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# nginx-pod 1/1 Running 0 1d
이 Pod에 문제가 생기면 어떻게 될까요?
# Pod 삭제 시뮬레이션
kubectl delete pod nginx-pod
kubectl get pods
# No resources found in default namespace.
가정한 상황의 문제점:
- Pod가 삭제되면 서비스가 완전히 중단됨
- 트래픽이 많아져도 확장할 수 없음
- 업데이트할 때 서비스 다운타임 발생
- 수동으로 다시 생성해야 함
Pod 복제본 수와 업데이트를 관리하는 ReplicaSet과 Deployment를 살펴보겠습니다.
🔄 ReplicaSet 이해하기
ReplicaSet이란?
ReplicaSet은 지정된 수의 Pod 복제본을 유지하도록 생성과 삭제를 조정하는 컨트롤러입니다. 노드 자원 부족이나 이미지 오류가 있으면 원하는 수만큼 준비되지 않을 수 있습니다.
첫 번째 ReplicaSet 만들어보기
# nginx-replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
# ReplicaSet 생성
kubectl apply -f nginx-replicaset.yaml
# 생성 확인
kubectl get replicaset
kubectl get pods
출력 형식 예시:
NAME DESIRED CURRENT READY AGE
nginx-replicaset 3 3 3 30s
NAME READY STATUS RESTARTS AGE
nginx-replicaset-abc12 1/1 Running 0 30s
nginx-replicaset-def34 1/1 Running 0 30s
nginx-replicaset-ghi56 1/1 Running 0 30s
ReplicaSet의 자동 복구 기능 테스트
Pod를 삭제했을 때 ReplicaSet이 복제본 수를 복구하는지 확인하는 실습 예제입니다:
# Pod 하나를 강제로 삭제
kubectl delete pod nginx-replicaset-abc12
# 즉시 확인
kubectl get pods
출력 형식 예시:
NAME READY STATUS RESTARTS AGE
nginx-replicaset-def34 1/1 Running 0 2m
nginx-replicaset-ghi56 1/1 Running 0 2m
nginx-replicaset-xyz78 0/1 ContainerCreating 0 3s
위 출력 예시는 삭제된 Pod를 대신할 새 Pod가 생성 중인 상태입니다. 실제 실습에서는 원하는 복제본 수와 Ready 상태가 회복되는지 확인해야 합니다.
ReplicaSet 구성 요소 분석
ReplicaSet YAML에서 각 부분의 역할을 살펴보겠습니다:
spec:
replicas: 3 # 원하는 Pod 개수
selector: # 관리할 Pod를 선택하는 조건
matchLabels:
app: nginx
template: # 새 Pod를 만들 때 사용할 템플릿
metadata:
labels:
app: nginx # selector와 일치해야 함!
spec:
containers:
- name: nginx
image: nginx:1.21
중요한 포인트:
selector.matchLabels
template.metadata.labels
이 두 값이 일치해야 합니다!
📈 스케일링 실습
수동 스케일링
# 현재 상태 확인
kubectl get replicaset
# 5개로 확장
kubectl scale replicaset nginx-replicaset --replicas=5
# 확인
kubectl get pods
YAML 파일 수정을 통한 스케일링
# nginx-replicaset.yaml 수정
spec:
replicas: 2 # 3에서 2로 변경
# 변경사항 적용
kubectl apply -f nginx-replicaset.yaml
# Pod가 줄어드는 것 확인
kubectl get pods
적용 후에는 원하는 복제본 수가 2로 바뀌고, 현재 수가 그 값에 맞춰 조정되는지 확인합니다.
🚀 Deployment 등장 배경
ReplicaSet은 복제본 수를 관리하지만, 업데이트와 롤백에는 추가적인 관리 기능이 필요합니다:
ReplicaSet의 한계점
- 업데이트 문제: 이미지 버전을 바꾸려면?
- 롤백 기능 부족: 문제 생겼을 때 이전 버전으로 되돌리려면?
- 배포 전략 부족: 무중단 배포가 어려움
이런 문제들을 해결하기 위해 Deployment가 등장했습니다.
📦 Deployment 완전 정복
Deployment란?
Deployment는 ReplicaSet을 관리하는 상위 컨트롤러입니다. ReplicaSet + 배포 관리 기능이라고 생각하면 됩니다.
첫 번째 Deployment 생성
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
# 기존 ReplicaSet 정리
kubectl delete replicaset nginx-replicaset
# Deployment 생성
kubectl apply -f nginx-deployment.yaml
Deployment 구조 확인
kubectl get deployments
kubectl get replicaset
kubectl get pods
출력 형식 예시:
# Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 1m
# ReplicaSet (Deployment가 자동 생성)
NAME DESIRED CURRENT READY AGE
nginx-deployment-7d4c8f5d6c 3 3 3 1m
# Pods (ReplicaSet이 자동 생성)
NAME READY STATUS RESTARTS AGE
nginx-deployment-7d4c8f5d6c-abc12 1/1 Running 0 1m
nginx-deployment-7d4c8f5d6c-def34 1/1 Running 0 1m
nginx-deployment-7d4c8f5d6c-ghi56 1/1 Running 0 1m
구조 이해:
Deployment → ReplicaSet → Pods
↓ ↓ ↓
배포관리 복제본관리 실제컨테이너
🔄 롤링 업데이트 실습
Deployment의 이미지 버전을 바꾸고 Pod 교체 과정을 확인하는 실습 예제입니다.
이미지 버전 업데이트
# 현재 이미지 확인
kubectl describe deployment nginx-deployment | grep Image
# 이미지 버전 업데이트
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 실시간으로 업데이트 과정 관찰
kubectl rollout status deployment/nginx-deployment
업데이트 과정 관찰:
# 다른 터미널에서 실시간 모니터링
watch kubectl get pods
실습에서는 새 버전의 Pod 생성과 기존 Pod 종료 과정을 확인합니다. 이 명령의 성공만으로 요청 중단이 없었다고 판단할 수는 없으며, 요청 실패 여부를 별도로 측정해야 합니다.
롤링 업데이트가 모든 환경에서 무중단을 보장하는 것은 아닙니다. 실제 서비스에서는 readiness 검사, 복제본 수, 종료 처리와 maxUnavailable·maxSurge 설정을 함께 확인해야 합니다. Deployment 공식 문서
롤링 업데이트 전략 설정
# nginx-deployment.yaml에 전략 추가
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 최대 1개까지 unavailable 허용
maxSurge: 1 # 최대 1개까지 추가 생성 허용
selector:
matchLabels:
app: nginx
template:
# ... 나머지 동일
업데이트 히스토리 확인
# 롤아웃 히스토리 확인
kubectl rollout history deployment/nginx-deployment
# 특정 리비전 상세 정보
kubectl rollout history deployment/nginx-deployment --revision=2
⏪ 롤백 기능 활용
업데이트 후 문제가 생겼다고 가정하고 이전 버전으로 되돌리는 예제입니다.
# 문제가 있는 버전으로 업데이트 (시뮬레이션)
kubectl set image deployment/nginx-deployment nginx=nginx:wrong-tag
# 업데이트 실패 확인
kubectl get pods
kubectl rollout status deployment/nginx-deployment
# 이전 버전으로 롤백
kubectl rollout undo deployment/nginx-deployment
# 특정 리비전으로 롤백
kubectl rollout undo deployment/nginx-deployment --to-revision=1
롤백 후에는 이미지 버전, Pod의 Ready 상태와 요청 실패 여부를 확인합니다. 이 글에서 롤백 중 무중단 동작을 검증한 것은 아닙니다.
🎯 명령어를 통한 빠른 생성 (CKA 시험 대비)
명령어로 Deployment를 생성하고 YAML을 확인하는 방법도 함께 정리합니다.
# Deployment 빠른 생성
kubectl create deployment web-app --image=nginx --replicas=3
# 생성된 Deployment를 YAML로 확인
kubectl get deployment web-app -o yaml
# 기존 Deployment 스케일링
kubectl scale deployment web-app --replicas=5
# 이미지 업데이트
kubectl set image deployment/web-app nginx=nginx:1.22
# 롤백
kubectl rollout undo deployment/web-app
🔍 상태 확인과 디버깅
주요 확인 명령어들
# Deployment 상태 확인
kubectl get deployments -o wide
kubectl describe deployment nginx-deployment
# ReplicaSet 상태 확인
kubectl get replicaset
kubectl describe replicaset nginx-deployment-7d4c8f5d6c
# 롤아웃 상태 확인
kubectl rollout status deployment/nginx-deployment
kubectl rollout history deployment/nginx-deployment
# Pod 상태 확인
kubectl get pods -l app=nginx
kubectl describe pod <pod-name>
문제 상황 대처법
업데이트가 멈춘 경우:
# 진행 중인 롤아웃 일시 정지
kubectl rollout pause deployment/nginx-deployment
# 롤아웃 재개
kubectl rollout resume deployment/nginx-deployment
# 현재 롤아웃 취소
kubectl rollout undo deployment/nginx-deployment
Pod가 생성되지 않는 경우:
# ReplicaSet 이벤트 확인
kubectl describe replicaset <replicaset-name>
# 리소스 제한 확인
kubectl describe nodes
💡 실전 예제: 웹 애플리케이션 배포
앞의 개념을 연결하기 위한 가상의 웹 애플리케이션 배포 시나리오입니다.
# web-app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
version: v1
spec:
replicas: 4
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
version: v1
spec:
containers:
- name: web-container
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
# 배포
kubectl apply -f web-app-deployment.yaml
# 상태 확인
kubectl get deployment web-app
kubectl get pods -l app=web-app
# 부하 테스트를 위한 스케일링
kubectl scale deployment web-app --replicas=8
# v2로 업데이트
kubectl set image deployment/web-app web-container=nginx:1.22
# 업데이트 과정 모니터링
kubectl rollout status deployment/web-app
📊 CKA 대비 연습 패턴
연습할 문제 유형
-
Deployment 생성과 관리
# 문제: nginx 이미지로 3개 복제본을 가진 'web' Deployment 생성 kubectl create deployment web --image=nginx --replicas=3 -
스케일링
# 문제: 기존 Deployment를 5개로 확장 kubectl scale deployment web --replicas=5 -
롤링 업데이트
# 문제: 이미지를 nginx:1.22로 업데이트 kubectl set image deployment/web nginx=nginx:1.22 -
롤백
# 문제: 이전 버전으로 롤백 kubectl rollout undo deployment/web -
문제 해결
- Deployment가 정상적으로 업데이트되지 않는 이유 찾기
- Pod가 생성되지 않는 문제 해결
시간 단축 팁
# alias 설정 (시험 시작 시)
alias k=kubectl
# 빠른 YAML 생성
k create deployment web --image=nginx --dry-run=client -o yaml > web-deployment.yaml
# 리소스 강제 삭제
k delete deployment web --force --grace-period=0
📚 오늘의 핵심 정리
ReplicaSet vs Deployment 비교
| 기능 | ReplicaSet | Deployment |
|---|---|---|
| Pod 복제본 관리 | ✅ | ✅ |
| 자동 복구 | ✅ | ✅ |
| 스케일링 | ✅ | ✅ |
| 롤링 업데이트 | ❌ | ✅ |
| 롤백 | ❌ | ✅ |
| 배포 전략 | ❌ | ✅ |
| 히스토리 관리 | ❌ | ✅ |
필수 명령어 정리
# Deployment 관리
kubectl create deployment <name> --image=<image> --replicas=<num>
kubectl get deployments
kubectl describe deployment <name>
kubectl delete deployment <name>
# 스케일링
kubectl scale deployment <name> --replicas=<num>
# 업데이트와 롤백
kubectl set image deployment/<name> <container>=<image>
kubectl rollout status deployment/<name>
kubectl rollout history deployment/<name>
kubectl rollout undo deployment/<name>
kubectl rollout pause deployment/<name>
kubectl rollout resume deployment/<name>
# ReplicaSet 관리
kubectl get replicaset
kubectl describe replicaset <name>
중요한 개념들
- 선언적 관리: YAML 파일로 원하는 상태를 정의
- 컨트롤러 패턴: 현재 상태를 원하는 상태로 지속적으로 조정
- 레이블 셀렉터: Pod를 선택하고 관리하는 메커니즘
- 롤링 업데이트: 무중단 배포를 위한 점진적 업데이트 전략
🚀 다음 학습 계획
Deployment의 다음 학습 주제는 여러 Pod에 접근하는 경로를 제공하는 Service입니다.
다음 주제들
- Service를 통한 Pod 네트워킹 - 가장 우선적으로 학습 필요
- ConfigMap과 Secret으로 설정 관리
- Pod 리소스 제한과 요청 설정
- Liveness와 Readiness Probe 구성
- Ingress를 통한 외부 트래픽 관리
개인 학습 목표
- kubectl 명령어 속도 더욱 향상시키기
- 복잡한 배포 시나리오에서의 문제 해결 능력 기르기
- CKA 시험 문제 패턴에 더욱 익숙해지기
이 글은 원하는 복제본 수를 선언하고 컨트롤러가 이를 맞추는 구조, Deployment의 업데이트와 롤백 방법을 정리했습니다. 가용성은 실제 요청과 애플리케이션 상태를 함께 관찰하며 검증할 항목입니다.
다음 글에서는 여러 Pod에 안정적인 접근점을 제공하는 Service를 다룹니다.
🔗 참고 자료:
yellow.log · 2025.07.30에 작성 · 2026.09.29에 수정
CKA 준비 전체 8편
- 1.Pod 생성과 관리 - 쿠버네티스의 기본 단위 이해하기
- 2.ReplicaSet과 Deployment로 Pod 관리하기 - 확장성과 가용성 확보읽는 중
- 3.Service를 통한 Pod 네트워킹 - 안정적인 접근 경로 만들기
- 4.ConfigMap과 Secret으로 설정 관리하기 - 환경별 설정 분리
- 5.Pod 리소스 제한과 요청 설정 - 안정적인 클러스터 운영을 위한 리소스 관리
- 6.Liveness와 Readiness Probe 구성 - 헬스체크와 자동 복구
- 7.네임스페이스를 통한 리소스 격리와 다중 테넌시 - 팀별, 환경별 격리
- 8.Ingress를 통한 외부 트래픽 관리와 라우팅 - 클러스터의 똑똑한 관문 구축