본문 바로가기

[ study ]

[k8s] deployment, statefulset 비교

반응형
SMALL

Kubernetes에서 디플로이먼트(Deployment)와 스테이트풀셋(StatefulSet)은 애플리케이션을 배포하고 관리하는 두 가지 리소스 유형입니다. 각각은 특정 유형의 애플리케이션 요구사항을 충족하기 위해 설계되었습니다. 아래에서는 전체 구성을 설명한 후, 각각에 대한 세부 설명을 제공하겠습니다.

전체 구성

디플로이먼트(Deployment): 주로 상태가 없는(stateless) 애플리케이션을 관리하기 위해 사용됩니다. 디플로이먼트는 애플리케이션의 복제본을 확장하거나 축소하는 등의 작업을 자동으로 처리할 수 있습니다. 또한, 새 버전으로의 롤링 업데이트, 롤백 등을 지원하여 애플리케이션의 배포 및 업데이트를 용이하게 합니다.

스테이트풀셋(StatefulSet): 상태를 가진(stateful) 애플리케이션을 관리하기 위해 사용됩니다. 스테이트풀셋은 파드에 고유한 식별자(예: 이름, 네트워크 식별자)를 부여하며, 이는 파드의 스케일링, 삭제, 재배포에도 변하지 않습니다. 이를 통해, 데이터 복제, 복구, 배포 순서 보장 등의 기능을 제공합니다.

세부 설명

디플로이먼트(Deployment)

  • 용도: 상태가 없는 서비스에 적합. 예를 들어, 웹 서버, 프론트엔드, 백엔드 애플리케이션 등이 해당됩니다.
  • 특징:
  1. 파드의 선언적 업데이트를 지원합니다.
  2. 롤링 업데이트 및 롤백 기능을 제공하여 애플리케이션의 무중단 배포를 가능하게 합니다.
    복제본 수를 지정하여 애플리케이션의 가용성을 높일 수 있습니다.

    스테이트풀셋(StatefulSet)

  • 용도: 상태를 유지하는 애플리케이션에 적합. 예를 들어, 데이터베이스, 메시징 시스템, 분산 시스템 등이 해당됩니다.
  • 특징:
  1. 파드에 안정적이고 고유한 식별자를 부여합니다.
  2. 스토리지 볼륨(Persistent Volume)을 사용하여 데이터의 영속성을 보장합니다.
  3. 배포 및 스케일링 시 순서를 보장합니다. 예를 들어, 파드는 순차적으로 생성되고 삭제됩니다.

예시 코드

디플로이먼트 생성 예시

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

스테이트풀셋 생성 예시

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  volumeClaimTemplates:
  - metadata:
      name: nginx-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Kubernetes에서 디플로이먼트(Deployment)와 스테이트풀셋(StatefulSet)은 파드(Pod)를 관리하는 컨트롤러입니다. 이러한 컨트롤러는 파드의 생성, 삭제 및 업데이트를 관리하여 애플리케이션의 운영을 자동화합니다. 아래에서는 디플로이먼트와 스테이트풀셋이 파드까지의 구조를 어떻게 구성하는지에 대해 설명하겠습니다.

디플로이먼트 구조

디플로이먼트(Deployment): 애플리케이션의 레플리카(복제본) 수, 업데이트 전략, 롤백 등을 정의하는 상위 레벨의 리소스입니다. 디플로이먼트는 아래 구조를 통해 파드를 관리합니다.

레플리카셋(ReplicaSet): 디플로이먼트에 의해 자동으로 생성되며, 실제로 파드의 복제본 수를 유지 관리합니다. 디플로이먼트가 업데이트를 수행할 때, 새로운 레플리카셋을 생성하고, 점진적으로 파드를 새 레플리카셋으로 이동시킵니다.

파드(Pod): 컨테이너의 그룹으로, 실제 애플리케이션 컨테이너와 관련 설정을 포함합니다. 레플리카셋은 이 파드를 특정 수만큼 유지 관리합니다.

스테이트풀셋 구조

스테이트풀셋(StatefulSet): 상태를 가지고 있는 애플리케이션을 위한 리소스로, 각 파드에 안정적인 고유 식별자와 순서를 부여합니다. 스테이트풀셋은 아래 구조를 통해 파드를 관리합니다.

파드(Pod): 스테이트풀셋에 의해 생성되는 각 파드는 고유한 식별자를 가지며, 이는 파드의 재생성, 스케일링, 업데이트 시에도 유지됩니다. 이를 통해, 네트워크 식별자, 스토리지 볼륨 등이 파드 간에 일관되게 유지됩니다.

퍼시스턴트 볼륨 클레임(Persistent Volume Claim, PVC): 스테이트풀셋은 각 파드에 대해 별도의 PVC를 사용하여 데이터의 영속성을 보장합니다. PVC는 실제 스토리지 볼륨에 대한 요구 사항을 정의하고, 이를 파드가 사용할 수 있게 연결합니다.

공통 요소

서비스(Service): 파드 그룹에 대한 안정적인 네트워크 주소를 제공합니다. 특히 스테이트풀셋에서는 각 파드에 대해 고유한 DNS 이름을 부여하는데 중요하게 사용됩니다.

예시: 파드까지의 구조를 반영한 디플로이먼트와 스테이트풀셋

디플로이먼트 예시

Deployment → ReplicaSet → Pods

디플로이먼트는 원하는 파드의 상태(예: 복제본 수, 이미지)를 정의하고, 이를 달성하기 위해 하나 이상의 레플리카셋을 관리합니다. 각 레플리카셋은 정의된 수의 파드 복제본을 유지합니다.

스테이트풀셋 예시

StatefulSet → Pods + PersistentVolumeClaims

스테이트풀셋은 각 파드에 대해 고유한 식별자와 순서를 부여하며, 각 파드는 고유한 PVC를 사용하여 데이터를 영속적으로 저장합니다.
이러한 구조를 통해, Kubernetes는 상태가 없는 서비스와 상태를 가진 서비스를 모두 효율적으로 관리할 수 있게 해줍니다. 디플로이먼트와 스테이트풀셋은 이러한 관리 작업을 추상화하고 자동화하는 중요한 역할을 합니다.

반응형
LIST