Statefulset
어플리케이션의 상태를 유지할 수 있도록 하는 워크로드 API
배포나 인스턴스 갯수 조정등의 상황에서 파드의 순서, 유일성을 보장한다.
배포 과정에서 container spec 정의서를 따르지만, 파드 끼리 서로 대체되지 않는다.
비휘발성 데이터, 각각의 파드가 서로 다른 용도로 네트워크 통신이 이루어질 경우 채택해볼만 하다.
Using StatefulSet
- 통신을 위하여 고정된 네트워크 식별자가 필요한 경우
- 비휘발성 데이터 처리가 필요한 경우
- 순차적이고, graceful 배포가 필요한경우
- 순차적 업데이트가 필요한 경우
Limitation
- 파드 스토리지 스펙은 'storage class - PersistentVolume Provisioner' 혹은 관리자에 의해서 설정되어야 한다.
- 파드 스케일링 과정에서 볼륨 데이터를 유지함.
- Headless Service(파드 그룹 로드 밸런싱 되지 않고 각각이 서비스 IP를 갖도록 함.) 필수
- StatefulSet이 삭제될 때 파드의 종료를 보장하지 않는다. 파드 종료가 먼저 필요하다면 StatlefulSet의 스케일을 0으로 변경 후 삭제해야 한다.
- 기본 파드 관리정책으로 롤링 업데이트중 에러 발생 시 수동으로 조작해야 할 수 있습니다.
Components
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx # has to match .spec.template.metadata.labels
serviceName: "nginx"
replicas: 3 # by default is 1
minReadySeconds: 10 # by default is 0
template:
metadata:
labels:
app: nginx # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: registry.k8s.io/nginx-slim:0.24
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "my-storage-class"
resources:
requests:
storage: 1Gi
- headless 서비스로 구성, selector 로 nginx
- .spec.selector 와 .spec.template.metadata.labels 동일해야 함.
- volumeClaimTemplates
- 다이나믹 프로비저닝 or PersistentVolume 이용해야함.
- .spec.minReadySeconds
- 파드가 정상적으로 생성됐다고 판단하는 설정 시간 값. 기본값은 0이며 파드가 ready 되자마자 available 로 간주됨.
PVC 란?
쿠버네티스 환경에서는 스토리지를 효율적으로 사용하기 위해 PVC, PV 개념을 두었는데요.
PVC : 사용자가 PV에게 하는 요청
PV : 볼륨 자체
라고 할 수 있습니다.
Pod Identity
StatefulSet의 파드는 각각 고유한 네트워크 식별값을 가진다.
Ordinal Index
StatefulSet 의 replicas(N) 구성을 위해서 내부 파드들은 0부터 (N-1) 까지 증가하는 순서값을 갖는다.
.spec.ordinals.start 를 이용하여 순서 시작값을 설정할 수 있다.
Stable Network ID
각각의 파드는 StatefulSet 안에서 {호스트네임-순서값} 네트워크 ID를 갖는다.
Headless 서비스로 {서비스네임.네임스페이스} 값이 들어가도록 설정할 수도 있다.

※주의 DNS 클러스터 구성 시 새로 생성된 파드에 직접접근 할 수 없을수도 있다.
- kubernates api 를 직접 사용하여 접근
- kubernates DNS provider 캐싱 시간 줄이기
Stable Storage
VolumeClaimTemplate 정의된 값에 따라 각 파드들은 PVC를 할당 받음.
StorageClass가 설정되어있지 않으면 기본(default) 가 사용된다.
PVC 는 파드와 함께 삭제되는것이 아니라 StatuefulSet 과 함께 삭제된다는 점 유의해야 한다.
Pod Index Label
StatefulSet 생성 시 각 파드는 apps.kubernates.io/pod-index 로 라벨링된다.
이 인덱스를 이용해서 파드에 직접 접근할 수 있고, 로그, 메트릭 정보 필터링도 가능하다.
Deployment and Scaling Guarantees
- 배포시 파드는 차례로 생성된다.
- 파드 삭제시 역순으로 삭제된다.
pod.Spec.TerminationGracePeriodSeconds 을 0으로 설정해두는 것은 위험하다.
web-0, web-1, web-2 파드가 있다고 했을 때, web-0 이 배포 완료되지 않아도 web-1 파드가 생성되기 시작하지만, 결국 모든 파드가 ready여야만 배포가 종료된다.
Pod Management Policies
.spec.podManagementPolicy 필드로 설정 가능하다.
Parallel and OrderedReady 설정 가능.
Update Strateages
.spec.updateStrategy 필드로 설정
On Delete
설정시 컨트롤러가 파드를 업데이트 하지않고 사용자가
직접 파드를 삭제하고 신규 파드가 생성될때 적용됨.
Rolling Update (기본)
컨트롤러가 자동으로 롤링 업데이트 수행
Rolling Updates
.spec.updateStrategy.type: RollingUpdate 로 설정되었을 때 컨트롤러가 순차적으로 (N-1 ~ 0) 자동으로 파드를 삭제하고 재생성함.
컨트롤러는 이전 파드의 업데이트 상태를 기다리고 업데이트를 진행하는데, 이 때 추가적으로 시간이 필요하다면 .spec.minReadySeconds 설정을 고려해볼 수 있다.
Partitioned rolling updates
.spec.updateStrategy.rollingUpdate.partition 로 롤링업데이트를 파티셔닝할 수 있다.
해당 값보다 크거나 같은 index 의 파드들이 업데이트 된다. 이 값보다 작은 파드들은 삭제되고 재생성되어도 업데이트가 적용되지 않는다.
.spec.updateStrategy.rollingUpdate.partition 이 값이 .spec.replicas 보다 크다면 아무일도 발생하지 않는다.
스테이지, 카나리, 롤아웃 상황에 적합하다.
Maximum unavailable Pods
업데이트 상황에서 unavailable 상태인 파드를 최대 몇개까지 허용할것인지 값. 갯수 , 퍼센트 (소수점 올림 적용된다.)로 설정할 수 있다.
현재 feature gates 상태 (v1.24)이다.
https://kubernetes.io/blog/2022/05/27/maxunavailable-for-statefulset/
Forced rollback
Roliing Updates, OrderedReady 로 배포중 문제상황이 발생할 수 있다. 이때 StatefulSet 은 무한정 파드들이 Ready 가 되는것을 기다리므로
신규 configuration 으로 업데이트 된 모든 파드들을 삭제해주어야 한다.
PersistentVolumeClaim retention
.spec.persistentVolumeClaimRetentionPolicy 설정값으로 StatefulSet 라이프사이클 중 pvc 가 어떻게 삭제될지 정의할 수 있다.
- whenDeleted
- whenScaled
- Delete
- Retain(default)
파드 삭제가 pvc 삭제에 영향미치지 않음.
위의 정책들중 pvc 삭제는 오로지 파드가 의도한 "삭제" 일때만 적용된다. 만약 장애상황이라면 retain 으로 적용된다.
Replicas
Optional 필드. 기본값은 1이다.
값을 증가시키면 컨트롤러가 파드를 추가 생성한다. (HPA 를 이용중이면 값을 설정하지 말자.)