Kubernetes

Kubernetes 기초 - Controller(5)

사실 나도 모름 2023. 12. 14. 13:41
  1. ReplicationController
  2. ReplicaSet
  3. Deployment
  4. DaemonSet
  5. StatefulSet         ←  오늘 볼 내용
  6. Job
  7. CronJob

5. StatefulSet

StatefulSet은 쿠버네티스에서 제공하는 컨트롤러 중 하나로, 상태를 가지는 애플리케이션을 관리하는 데 사용된다.

즉, Pod의 이름이나 볼륨(스토리지) 등의 상태를 유지해주는 역할을 한다.

주로 데이터베이스나 메시지 큐와 같은 서비스에 적합하다.

 

StatefulSet의 특징

  • 고유한 식별자 : 각 파드에 고유한 식별자가 할당되어 순차적으로 증가하며 관리됩니다. 이는 파드가 삭제되거나 실패한 경우에도 같은 식별자를 유지하는 데 도움이 됩니다.
  • 안정적인 네트워크 식별자 : StatefulSet은 각 파드에 안정적인 DNS 이름을 할당하여 네트워크 식별을 쉽게 할 수 있도록 합니다.
  • 볼륨 보존 : StatefulSet은 각 파드에 지속적인 스토리지를 할당하여 데이터를 유지하도록 합니다. 이는 파드를 삭제하거나 재시작해도 데이터가 보존되는 것을 의미합니다.
  • 백업 및 롤백 : StatefulSet은 업데이트된 컨테이너 이미지로 업데이트할 수 있으며, 이전 상태로 롤백하는 기능도 제공합니다.

StatefulSet의 구성은 기본 파드 템플릿과 함께 볼륨 클레임, 서비스 등을 정의하는 것이 포함된다.

StatefulSet을 사용하면 각 파드가 고유한 식별자와 안정적인 DNS 이름을 가지므로 복잡한 상태를 가지는 애플리케이션을 쉽게 관리할 수 있다.

DaemonSet과 달리 StatefulSet은 특정 노드에 실행이 되도록 보장하지는 않는다.

 

 

기본 형태

ReplicaSet definition StatefulSet definition
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 3

  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.24  
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-nginx
spec:
  replicas: 3
  serviceName: sts-nginx-service
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.24  

 

 

ReplicaSet 및 이전에 살펴본 컨트롤러들의 경우는 파드를 생성할 때 컨트롤러의 이름 뒤에 랜덤한 해시값이 붙어서 이름이 생성된다.

이렇게 생성된 파드는 삭제되더라도 자신의 이름을 유지하지 않고 다시 새로운 해시값을 가지고 다른 이름으로 생성된다.

하지만 StatefulSet의 경우는 프로그래밍의 배열과 같이 컨트롤러 이름 뒤에 0, 1, 2, 3... 과 같은 형태로 이름이 생성된다.

 

 


예제

StatefulSet yaml 파일 생성
# sts-exam.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts-nginx
spec:
  replicas: 3
  serviceName: sts-nginx-service
# podManagementPolicy: OrderedReady		# default
  podManagementPolicy: Parallel
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.24
  • podManagementPolicy: OrderedReady : 파드 생성 시 순차적으로 하나씩 생성
  • podManagementPolicy: Parallel : 파드 생성 시 동시에 생성

 

 

StatefulSet 실행

StatefulSet

 

 

이렇게 실행된 파드들은 삭제가 되더라도 그 이름이 변하지 않는다.

다시 생성되어도 이름이 변하지 않음

 

 

 

Scale 변경

 

replicas의 값을 변경하여 파드의 수를 늘린다면 숫자가 순서대로 계속 붙을 것이다.

반대로 파드의 수를 줄인다면 어떻게 될까?

대충 예상하는대로 파드는 큰 숫자 먼저 제거가 된다.

# Scale Out
kubectl scale statefulset sts-nginx --replicas=4

# Scale In
kubectl scale statefulset sts-nginx --replicas=2

Scale Out
Scale In

 

 

 

Rolling Update

 

롤링 업데이트도 가능하다.

# Rolling Update
kubectl edit sts sts-nginx

1.25로 변경
종료하고 새로 업데이트 중

 

버전이 변경되었는지 자세하게 보고 싶으면 describe 명령으로 확인 가능하다.

 

 

 

Roll Back

 

롤링 업데이트가 된다면 당연히 롤백도 가능하다.

# Roll Back
kubectl rollout undo sts sts-nginx

 

 


 

 

스토리지에 대해서는 아직 다루지 않았지만 스토리지도 상태를 유지하도록 만들 수 있다.

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'Kubernetes' 카테고리의 다른 글

Kubernetes 기초 - Controller(7)  (0) 2023.12.15
Kubernetes 기초 - Controller(6)  (0) 2023.12.15
Kubernetes 기초 - Controller(4)  (0) 2023.12.14
Kubernetes 기초 - Controller(3)  (0) 2023.12.14
Kubernetes 기초 - Controller(2)  (0) 2023.12.12