rueki

쿠버네티스 스테이트풀셋 본문

쿠버네티스, 도커

쿠버네티스 스테이트풀셋

륵기 2022. 2. 24. 13:31
728x90
반응형

스테이트풀셋 :  애플리케이션의 상태를 저장하고 관리하는 데 사용되는 쿠버네티스 객체

                     레플리카셋의 특수한 형태, 상태를 갖고있는 pod를 관리하는 컨트롤러

                     레플리카셋과 다르게 파드명이 변경되지 않으며, 데이터를 영구적으로 저장하기 위한 구조로 구성

 

 

1. 스테이트풀셋 생성

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sample-statefulset
spec:
  serviceName: sample-statefulset
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.12
          ports:
            - containerPort: 80
          volumeMounts:
          - name: www
            mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1G

- 스테이트풀셋 생성

kubectl apply -f sample-statefulset.yaml

스테이트풀셋 생성 특징은 파드에 인덱스 번호가 붙는다.

그리고 yaml 파일에서 영구 볼륨을 선언 했는데 스테이트풀셋에서 사용되고 있는 영구볼륨을 확인해보면 1G씩 할당되어 있는 것을 볼 수 있다.

kubectl get persistentvolumes

2. 스테이트풀셋 스케일링

kubectl scale statefulset sample-statefulset --replicas=5

스케일링 할 경우 인덱싱 번호는 스케일을 키울 경우에는 +1 되서 늘어나고 줄일 경우에는 신규로 생성된 파드부터 삭제가 된다.

레플리카셋의 경우에는 무작위로 파드가 삭제되어서 특정파드가 파스터가 되는 애플리케이션에는 적합하지가 않다.

 

3. 라이프 사이클

일반적으로는 하나씩 파드가 생성되어 순차적으로 상태를보고 생성되지만, podManagementPolicy를 parallel로 선언하면 병렬로 생성이 된다.

apiVersion: apps/v1
kind: Statefulset
metadata:
  name: sample-statefulset-parallel
spec:
  podManagementPolicy: Parallel
  serviceName: sample-statefulset-parallel
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16

 

4. 스테이트풀셋 업데이트

* OnDelete

수정해서 이미지 변경해도 기존파드는 업데이트 되지않음

수동으로 업데이트 할 경우 임의 시점 및 재가동 시 업데이트 진행하는데 사용

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sample-statefulset-ondelete
spec:
  updateStrategy:
    type: OnDelete
  serviceName: sample-statefulset-ondelete
  replicas: 3
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16

* RollingUpdate

스테이트풀셋에는 영속성 데이터가 있기에 동시에 업데이트가 불가능하다. 그래서 파티션이라는 특정 값을 통해서

전체 파드 중 어떤 파드까지 업데이트 할 지를 지정할 수가 있다. 이를 통해서 전체에 영향을 주지않고 부분 업데이트가 가능하다.

업데이트 방식은 파티션 지정값보다 이전인덱스를 가진 파드는 업데이트 되지않는다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sample-statefulset-rollingupdate
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 3
  serviceName: sample-statefulset-rollingupdate
  replicas: 5
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16

5. 영구볼륨데이터 저장 확인

컨테이너 내부에 영구 볼륨이 마운트 되어 있는지 확인하기

kubectl exec -it sample-statefulset-0 -- df -h | grep /dev/sd

영구볼륨에 샘플파일 생성

kubectl exec -it sample-statefulset-0 -- touch /usr/share/nginx/html/sample.html

샘플파일 있는지 확인

kubectl exec -it sample-statefulset-0 -- ls /usr/share/nginx/html/sample.html

 

파드를 삭제하거나 컨테이너 에러로 인해 정지된 경우에 복구하고 나서도 파일이 존재하는 것을 확인해보자

kubectl delete pod sample-statefulset-0
kubectl exec -it sample-statefulset-0 -- /bin/bash -c 'kill 1'

먼저 파드 0을 삭제를 하고, 파드 1은 그럼 파드 0으로 될테고 새로운 파드 0에서 nginx 프로세스를 정지했는데

샘플파일 있는지 확인하면 그대로 존재하는 것을 확인할 수가 있다.

스테이트풀셋 상태를 확인하면 파드명도 그대로인 것을 확인 할 수가 있다.

 

6. 스테이트풀셋 삭제, 영구볼륨 삭제

 

kubectl delete statefulset sample-statefulset

삭제를 했으나 영구 볼륨이 동시 해제가 되지 않는데, 볼륨에서 데이터를 백업할 수 있도록 여분의 시간을 부여해준다고 한다.

그래서 다시 같은 이미지의 스테이트풀셋을 생성하면 영구볼륨이 유지된채로 파드가 가동이된다.

아래의 명령어로 각 파드의 영구볼륨을 모두 삭제할 수 있다.

kubectl delete persistentvolumeclaims www-sample-statefulset-{0..2}

728x90
반응형

'쿠버네티스, 도커' 카테고리의 다른 글

쿠버네티스 디플로이먼트  (0) 2022.02.23
쿠버네티스 레플리카셋  (0) 2022.02.23
쿠버네티스 파드  (0) 2022.02.22
쿠버네티스 리소스 종류  (0) 2022.02.21
쿠버네티스 환경  (0) 2022.02.21
Comments