Kubernetes에서 Pod는 개별적으로 배포할 수 있지만, 장애 발생 시 자동으로 복구되지 않습니다.
이를 해결하기 위해 등장한 것이 ReplicaSet과 Deployment입니다.
이번 글에서는 ReplicaSet과 Deployment의 개념, 차이점, 그리고 실전 활용법을 정리하겠습니다.
🔹 ReplicaSet이란?
ReplicaSet은 특정 개수의 Pod를 유지하는 컨트롤러입니다.
✔️ Pod 개수를 자동으로 유지
✔️ Pod 장애 발생 시 자동 복구
✔️ Deployment에서 내부적으로 사용됨
💡 ReplicaSet은 단독으로 사용되지 않고, 일반적으로 Deployment를 통해 관리됩니다.
🔹 ReplicaSet YAML 예제
아래 예제는 Nginx 컨테이너를 3개의 복제본(Replica)로 유지하는 ReplicaSet을 생성하는 예제입니다.
apiVersion: apps/v1 # ReplicaSet을 정의하는 API 버전
kind: ReplicaSet # 생성할 리소스 종류 (ReplicaSet)
metadata:
name: my-replicaset # ReplicaSet의 이름
spec:
replicas: 3 # 유지할 Pod 개수
selector:
matchLabels:
app: my-app # 이 레이블을 가진 Pod만 관리
template: # Pod의 템플릿 (ReplicaSet이 생성할 Pod의 정의)
metadata:
labels:
app: my-app # Pod에 부여할 레이블 (selector와 일치해야 함)
spec:
containers:
- name: my-container # 컨테이너 이름
image: nginx # 사용할 컨테이너 이미지 (Nginx)
ports:
- containerPort: 80 # 컨테이너에서 오픈할 포트 (Nginx 기본 포트)
📌 주요 필드 설명
필드 설명
replicas: 3 | 유지할 Pod 개수 |
selector.matchLabels | 특정 레이블을 가진 Pod만 관리 |
template | 생성할 Pod의 템플릿 |
containers.image | 사용할 컨테이너 이미지 |
🔹 ReplicaSet 배포 및 확인
kubectl apply -f replicaset.yaml
kubectl get pods
kubectl get rs
💡 ReplicaSet은 Pod를 자동으로 생성하여 3개를 유지합니다.
📌 Pod 강제 삭제 후 복구 확인
kubectl delete pod <pod-name>
kubectl get pods # 삭제한 Pod가 다시 생성됨!
💡 ReplicaSet은 Pod가 삭제되면 자동으로 새로운 Pod를 생성합니다.
🔹 Deployment란?
Deployment는 ReplicaSet을 관리하며, 버전 업데이트(롤링 업데이트) 및 롤백을 지원하는 컨트롤러입니다.
✔️ 애플리케이션 배포 및 업데이트
✔️ 롤링 업데이트 (Rolling Update) 지원
✔️ 버전 롤백 가능
✔️ ReplicaSet을 자동으로 관리
💡 Deployment는 ReplicaSet을 포함하여 관리합니다.
🔹 Deployment YAML 예제
아래 예제는 Nginx 애플리케이션을 Deployment로 배포하는 예제입니다.
apiVersion: apps/v1 # Deployment를 정의하는 API 버전
kind: Deployment # 생성할 리소스 종류 (Deployment)
metadata:
name: my-deployment # Deployment의 이름
spec:
replicas: 3 # 유지할 Pod 개수
selector:
matchLabels:
app: my-app # 이 레이블을 가진 Pod만 관리
template: # 생성할 Pod의 템플릿 (ReplicaSet이 관리)
metadata:
labels:
app: my-app # Pod에 부여할 레이블
spec:
containers:
- name: my-container # 컨테이너 이름
image: nginx:1.19 # 사용할 컨테이너 이미지 (Nginx 1.19 버전)
ports:
- containerPort: 80 # 컨테이너에서 오픈할 포트
💡 Deployment는 nginx:1.19 버전의 컨테이너를 배포하며, 이후 업데이트 및 롤백이 가능합니다.
🔹 Deployment 배포 및 확인
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods
💡 Deployment는 새로운 ReplicaSet을 생성하고 Pod를 관리합니다.
🔹 Deployment의 롤링 업데이트
Deployment는 **롤링 업데이트(Rolling Update)**를 지원하여 서비스 중단 없이 새로운 버전으로 변경할 수 있습니다.
📌 버전 업데이트 (롤링 업데이트)
spec:
template:
spec:
containers:
- name: my-container
image: nginx:1.20 # 새로운 버전으로 변경
kubectl apply -f deployment.yaml
kubectl rollout status deployment my-deployment
💡 기존 Pod를 점진적으로 종료하며 새 버전의 Pod를 배포합니다.
🔹 Deployment의 롤백
업데이트 후 문제가 발생하면 롤백할 수 있습니다.
📌 롤백 실행
kubectl rollout undo deployment my-deployment
💡 이전 버전의 Pod로 되돌아갑니다.
📌 특정 버전으로 롤백
kubectl rollout history deployment my-deployment
kubectl rollout undo deployment my-deployment --to-revision=2
💡 원하는 버전으로 롤백할 수도 있습니다.
🔹 ReplicaSet vs Deployment 비교
기능 ReplicaSet Deployment
Pod 개수 유지 | ✅ 가능 | ✅ 가능 |
롤링 업데이트 | ❌ 지원 안 함 | ✅ 지원 |
롤백 기능 | ❌ 지원 안 함 | ✅ 지원 |
애플리케이션 관리 | ❌ 직접 업데이트 필요 | ✅ 선언적 관리 가능 |
💡 일반적으로 ReplicaSet을 직접 사용하지 않고, Deployment를 통해 관리하는 것이 바람직합니다.
🔹 Deployment 배포 실전 예제
📌 1. Deployment 배포
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl get pods
📌 2. 새로운 버전으로 업데이트
spec:
template:
spec:
containers:
- name: my-container
image: nginx:1.21 # 새로운 버전
kubectl apply -f deployment.yaml
kubectl rollout status deployment my-deployment
📌 3. 롤백 실행
kubectl rollout undo deployment my-deployment
🚀 마무리
ReplicaSet과 Deployment는 Kubernetes에서 애플리케이션을 안정적으로 배포하고 운영하는 핵심 요소입니다.
✔️ ReplicaSet은 Pod 개수를 유지하지만 직접 사용되지는 않음
✔️ Deployment는 ReplicaSet을 관리하며, 업데이트 및 롤백을 지원
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #5: Job & CronJob (워크로드 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #4: DaemonSet (워크로드 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #3: StatefulSet (워크로드 리소스) (0) | 2025.03.04 |
Kubernetes 리소스 시리즈 #1: Pod (워크로드 리소스) (0) | 2025.03.04 |
Kubernetes 리소스 정리: 개념과 종류 (0) | 2025.03.04 |