WEB BE Repository/kubernetes, k8s

[쿠버네티스 튜토리얼] 2. Deployment 생성과 ReplicaSet 이해

조금씩 차근차근 2025. 12. 18. 00:13

Deployment는 Kubernetes에서 애플리케이션의 배포(Deployment)와 업데이트를 관리하는 상위 리소스이다.
Deployment를 생성하면 Kubernetes는 자동으로 ReplicaSet이라는 객체를 만들고, ReplicaSet이 정의된 수만큼 Pod를 생성하여 애플리케이션을 실행한다.
Deployment를 통해 롤링 업데이트, 자동 복구, 배포 이력관리 등이 가능하며, 운영 환경에서 주로 사용된다.

ReplicaSet은 말 그대로 Pod 레플리카(복제본) 집합을 관리하는 객체이다.
“이런 Pod를 N개 running 시켜라”라는 역할을 하며, 자체적으로는 수평 확장만 관리할 뿐 업데이트 전략 등은 없다.
Deployment가 ReplicaSet을 감싸서 관리한다고 이해할 수 있다.

 

요약하면, Deployment → ReplicaSet → Pod의 계층 구조로 한 Deployment가 새로운 버전을 배포하면, 새로운 ReplicaSet이 생성되어 기존 Pod들을 교체하게 된다.

예제: Deployment로 Nginx 애플리케이션 배포

앞에서는 Pod 하나를 수동으로 만들었는데, 이번에는 Deployment를 이용해 Nginx 서버 여러 개의 복제본을 실행해보자.

  1. Deployment 매니페스트 작성: hello-deploy.yaml 파일에 다음 내용을 작성한다.

  1. replicas: 3은 원하는 Pod 복제본 개수를 지정한다.
    • 이 예시는 동일한 Pod 3개를 운영하겠다는 의미이다.
  2. selector.matchLabels는 이 Deployment가 관리할 Pod들의 라벨을 지정한다.
    • 여기선 app: hello 라벨을 가진 Pod를 타겟으로 한다.
  3. template 아래는 Pod 템플릿으로, 새로운 Pod 생성 시 사용할 스펙이다.
    • 여기서 정의한 내용(app: hello 레이블 및 Nginx 컨테이너)은 ReplicaSet이 Pod를 생성할 때 사용된다.
  4. 결국 template.metadata.labels의 app: hello와 위 selector.matchLabels의 라벨이 일치해야 Deployment-ReplicaSet-Pod가 올바르게 연결된다.
    • Kubernetes가 이걸 기준으로 어떤 Pod가 이 Deployment의 소속인지 구분한다.
  5. 적용 및 확인

  • 조금 기다린 후

  • READY 3/3은 3개 중 3개 ReplicaSet Pod가 가동 중임을 나타낸다.
  • UP-TO-DATE는 최신 템플릿으로 생성된 Pod 수, AVAILABLE은 서비스 가능한 Pod 수이다.

주의: 이 이미지와 달리 우리가 설정한 app 이름은 hello에 주의하자.

 

Pod 이름을 보면 공통 접두사 뒤에 고유 ID가 붙어 있다.
56668d479 부분은 ReplicaSet의 UID 일부이며,
뒤의 랜덤 문자열은 Pod 개별 ID이다.

 

이 3개 Pod를 생성한 ReplicaSet을 조회해보자.

hello-deployment-5c8b5bbd6f라는 ReplicaSet이 하나 있고, DESIRED(요구) 3개에 CURRENT(현재) 3개를 충족시켜 READY 상태임을 보여준다.
이 ReplicaSet이 바로 Deployment에 의해 생성된 객체이다.

  1. 스케일링(확장/축소): Deployment는 실행 중인 복제본 수를 자유롭게 변경할 수 있다.

다시 확인해보자.

주의: 이 이미지와 달리 우리가 설정한 app 이름은 hello에 주의하자.

  • Pod가 5개로 늘어난 것을 볼 수 있다. 반대로 줄이는 것도 가능하다.

업데이트 전략

Deployment를 사용하면 이미지 버전을 업데이트하는 롤링 업데이트를 수행할 수 있다.
예를 들어 Nginx 버전을 변경한다면

$ kubectl set image deployment/hello-deployment hello-container=nginx:1.23  
  deployment.apps/hello-deployment image updated
  • 이렇게 이미지를 바꾸면 Deployment가 새 ReplicaSet을 생성하여 새로운 버전의 Pod들을 순차적으로 생성하고, 기존 Pod들은 종료한다(무중단 업데이트 시도).
  • 업데이트 상태는 kubectl rollout status deployment/hello-deployment로 모니터링할 수 있다.
  • 만약 문제가 생기면 kubectl rollout undo deployment/hello-deployment로 이전 버전으로 롤백도 가능하다.

이상은 간략한 소개이며, Deployment에는 최대 서브 파센트 조정, 지연시간 등의 다양한 설정이 있다.
기본값으로도 안전하게 롤링업데이트를 수행하지만 필요에 따라 maxSurge, maxUnavailable 등을 조절할 수 있다.

예제 정리

  • Deployment를 지우면 관련 ReplicaSet 및 Pod들도 모두 삭제된다.
    • 기본 PropagationPolicy에 따라 연쇄 삭제됨.

요약

  • Deployment를 사용하여 다중 복제 Pod 관리롤링 업데이트 개념을 실습했다.
  • Deployment는 선언한 원하는 상태(예: 3개의 Nginx Pod 실행)를 지속적으로 유지해주며, ReplicaSet을 생성하여 Pod 생명주기를 관리한다.

배운 개념

  • Deployment(디플로이먼트)를 통한 앱 배포
  • ReplicaSet의 역할(지정한 수의 Pod 보장)
  • 스케일링과 업데이트 (롤링 업데이트, 롤백) 등.