스테이트풀셋(StatefulSet)과 레플리카셋(ReplicaSet) 차이
- 생성되는 파드명의 접미사는 숫자 인덱스가 부연된다.
sample-statefulset-0
, sample-statefulset-1
, …
- 파드명이 바뀌지 않는다.
- 데이터를 영구적으로 저장하기 위한 구조로 되어 있다.
- 영구 볼륨(PersistentVolume)을 사용하는 경우에는 파드를 재기동할 때 같은 디스크를 사용하여 다시 생성한다.
스테이트풀셋 생성
- 스테이트풀셋에서는
spec.volumeClaimTemplates
를 지정할 수 있다.
- 스테이트풀셋으로 생성되는 각 파드에 영구 볼륨 클레임(영구 볼륨 요청)을 설정할 수 있다.
- 영구 볼륨 클레임을 사용하면 클러스터 외부의 네트워크를 통해 제공되는 영구 볼륨을 파드에 연결할 수 있으므로, 파드를 재기동할 때나 다른 노드로 이동할 때 같은 데이터를 보유한 상태로 컨테이너가 다시 생성된다.
- 볼륨 리소스를 생성하여 영구 볼륨을 확보한다.
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.16
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
스테이트풀셋 스케일링
kubectl apply -f
또는 kubectl scale
을 사용하여 스케일링
kubectl scale statefulset sample-statefulset --replicas=5
- 스테이트풀셋에서 레플리카 수를 변경하여 파드를 생성하고 삭제하면 레플리카셋이나 데몬셋 등과 달리 기본적으로 파드를 동시에 하나씩만 생성하고 삭제하기 때문에 시간이 소요된다.
- 스케일 아웃일 때는 인덱스가 가장 작은 것부터 하나씩 생성
- 이전에 생성된 파드가 Ready 상태가 되고 나서 다음 파드를 생성
- 스케일 인일 때는 인덱스가 가장 큰 파드(가장 최근에 생성된 컨테이너)부터 삭제
스테이트풀셋의 라이프사이클
- 스테이트풀셋에서도
spec.podManagementPolicy
를 Parallel
로 설정하여 레플리카셋 등과 마찬가지로 병렬로 동시에 파드를 기동시킬 수 있다.
spec.podManagementPolicy
기본값: OrderedReady
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
스테이트풀셋 업데이트 전략
OnDelete
와 RollingUpdate
전략이 있다.
OnDelete
- 스테이트풀셋 매니페스트가 변경되었을 때 파드를 업데이트하지 않고 다른 이유로 파드가 다시 생성될 때 새로운 설정으로 파드가 생성
RollingUpdate