Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #2: ReplicaSet & Deployment (워크로드 리소스)

ygtoken 2025. 3. 4. 23:42
728x90

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란?

DeploymentReplicaSet을 관리하며, 버전 업데이트(롤링 업데이트) 및 롤백을 지원하는 컨트롤러입니다.
✔️ 애플리케이션 배포 및 업데이트
✔️ 롤링 업데이트 (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을 관리하며, 업데이트 및 롤백을 지원

 

728x90