StatefulSets
beta feature in 1.7
이전에는 PetSets이였고 이제부터 StatefulSets로 변경되었다.
사용용도
- 안정적인 고유한 네트워크 식별자
- 안정적인 영구 스토리지
- 순서 있는 안전한 배포 및 확장
- 순서 있는 안전한 삭제 및 종료
- 순서가 지정된 자동 롤링 업데이트
stateless한 요구사항은 Deployment나 ReplicaSet을 이용한다.
한계
- Kubernetes 1.5+
- alpha/beta 기능이라서 apiserver에서
--runtime-config
옵션으로 기능 비활성화 가능함 - 스토리지는
storage class
를 이용해서 프로비저닝을 하거나 아니면 미리 만들어 둔 디스크를 사용함 - 삭제나 스케일 다운을 할 경우 스토리지빼고는 모두 지움(스토리지의 안정성을 위함)
- Pods의 네트워크를 식별을 책임지기 위해 Headless Service가 꼭 필요함
구성요소
Headless Service
network domain 관리용
StatefulSet
N개의 Replica Unique Pod를 생성하는 일을 함
volumeClaimTemplates
PersistentVolumes을 프로비저닝 하는 역할
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: gcr.io/google_containers/nginx-slim:0.8
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
Pod Idenity
Ordinal Index
N replica 가 존재함 정수형 순서값을 할당 받음 [0, N)
Stable Network ID
- Pod Hostname :
$(statefulset name)-$(ordinal)
- StatefulSet Domain :
$(service name).$(namespace).svc.cluster.local
- Pod DNS :
$(podname).$(govering service domain)
Stable Storage
VolumeClaimTemplate
에 명시된 PersistentVolume을 생성함- StorageClass로 생성하고 없으면 기본 StorageClass를 사용
- Pod가 스케쥴이 될때 PersistentVolume을
volumeMounts
함 - Pod나 StatefulSet이 삭제될때 PersistentVolume은 삭제 되지 않음
- 삭제는 수동으로 해야함
배포와 확장 보증
- StatefulSet에 N replica 값으로 Pods가 순서대로 배포됨(0...N-1)
- Pods가 삭제되면 생성된 순서와 반대순으로 종료됨(N-1...0)
- 모든 선행 작업이 기동되고 준비가 되어야 Pod 확장이 적용됨
- 모든 선행 종료가 되어야 Pod가 종료됨
Pod 관리 정책
.spec.podManagementPolicy
OrderedReady
StatefulSets의 기본정책
Parallel
병렬로 배포되고 종료되게 함 다른 Pod의 작업을 기다리지 않음
업데이트 전략
.spec.updateStrategy
On Delete
- 업데이트 내용 반영은 pod 삭제 후에 반영됨
.spec.updateStrategy
값이 없으면 선택되는 기본값.spec.updateStrategy.type
필드에OnDelete
값 설정
Rolling Updates
.spec.updateStrategy.type
을RollingUpdate
설정함- Pod 업데이트 순서는 삭제 순서와 같고 선행 작업이 완전히 완료되야만 다음 진행
Partitions
.spec.updateStrategy.rollingUpdate.partition