쿠버네티스에서 애플리케이션의 가용성을 보장하려면, Pod이 항상 원하는 개수만큼 실행되고 유지되어야 합니다.
이 글에서는 ReplicaSet을 활용하여 애플리케이션의 가용성을 유지하고, 롤링 업데이트를 적용하여 무중단 배포를 수행하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. ReplicaSet을 활용한 애플리케이션의 가용성 유지
2. Pod이 삭제되었을 때 자동으로 복구되도록 설정
3. 롤링 업데이트를 적용하여 무중단 배포 수행
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ ReplicaSet을 활용한 애플리케이션의 가용성 유지
❓ 문제 상황
운영팀에서 애플리케이션이 항상 3개의 Pod으로 실행되도록 유지해야 합니다.
특정 Pod이 장애로 인해 삭제되더라도, 자동으로 새로운 Pod이 생성되어 서비스 가용성이 유지되어야 합니다.
• ReplicaSet 이름: web-replicaset
• Pod 개수: 3개
• 컨테이너 이미지: nginx:1.21.1
• 포트: 80
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. ReplicaSet을 생성하여 항상 3개의 Pod이 유지되도록 설정합니다.
2. kubectl을 사용하여 Pod이 삭제되더라도 자동으로 복구되는지 확인합니다.
✅ 정답 Manifest (ReplicaSet 생성)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: web-replicaset # ReplicaSet 이름
spec:
replicas: 3 # 유지할 Pod 개수
selector:
matchLabels:
app: web # Pod 선택 기준 레이블
template:
metadata:
labels:
app: web # Pod에 할당될 레이블
spec:
containers:
- name: nginx
image: nginx:1.21.1 # 컨테이너 이미지
ports:
- containerPort: 80 # 컨테이너에서 사용할 포트
📌 적용 후 예상 결과 값
1. ReplicaSet이 정상적으로 생성되었는지 확인
kubectl get replicasets
💡 예상 출력 값
NAME DESIRED CURRENT READY AGE
web-replicaset 3 3 3 5s
2. 배포된 Pod 목록 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-replicaset-rp7fd 1/1 Running 0 5s
web-replicaset-m2d8l 1/1 Running 0 5s
web-replicaset-k9c3w 1/1 Running 0 5s
2️⃣ Pod이 삭제되었을 때 자동으로 복구되도록 설정
❓ 문제 상황
운영팀에서 실수로 특정 Pod을 삭제했을 때, ReplicaSet이 새로운 Pod을 생성하여 자동으로 복구되는지 확인해야 합니다.
• Pod이 삭제되더라도, ReplicaSet이 자동으로 새로운 Pod을 생성해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl delete pod 명령어로 특정 Pod을 삭제합니다.
2. ReplicaSet이 자동으로 새로운 Pod을 생성하는지 확인합니다.
✅ Pod 삭제 및 자동 복구 확인
🔹 특정 Pod 삭제
kubectl delete pod web-replicaset-m2d8l
💡 예상 출력 값
pod "web-replicaset-m2d8l" deleted
🔹 새로운 Pod이 자동 생성되었는지 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-replicaset-rp7fd 1/1 Running 0 2m
web-replicaset-k9c3w 1/1 Running 0 2m
web-replicaset-x1z2y 1/1 Running 0 5s # 새로운 Pod 생성됨
3️⃣ 롤링 업데이트를 적용하여 무중단 배포 수행
❓ 문제 상황
운영팀에서 애플리케이션을 새로운 버전(1.23.0)으로 업데이트하려고 합니다.
Pod이 한꺼번에 종료되지 않고, 무중단 배포(Rolling Update) 방식으로 점진적으로 업데이트되도록 구성해야 합니다.
• 업데이트할 Nginx 버전: 1.23.0
• Pod을 한 번에 모두 교체하지 않고, 한 개씩 새로운 버전으로 변경해야 함
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. kubectl set image 명령어를 사용하여 ReplicaSet의 컨테이너 이미지를 업데이트합니다.
2. 롤링 업데이트를 수행하고, 배포 상태를 모니터링합니다.
✅ 정답 Manifest (Rolling Update 적용)
🔹 Nginx 버전 업데이트
kubectl set image rs/web-replicaset nginx=nginx:1.23.0
🔹 배포 상태 확인
kubectl rollout status rs/web-replicaset
💡 예상 출력 값
replicaset "web-replicaset" successfully rolled out
🔹 업데이트 후 실행 중인 Pod 확인
kubectl get pods -l app=web
💡 예상 출력 값
NAME READY STATUS RESTARTS AGE
web-replicaset-vp8fd 1/1 Running 0 10s # 새로운 버전의 Pod
web-replicaset-xy2k3 1/1 Running 0 8s
web-replicaset-m3n5q 1/1 Running 0 5s