StatefulSet
- pod의 상태를 유지해주는 컨트롤러
- pod 이름
- pod의 볼륨(스토리지)
- rc-nginx-까지는 컨트롤러의 이름이고 그뒤가 pod 고유 이름인데 hash 값으로 랜덤하게 만들어진다.
- pod를 지우면 컨트롤러가 pod를 다시 생성할텐데 이때도 이름은 랜덤
- statefulSet은 이 이름이나 볼륨을 유지시켜준다.
- statefulSet으로 3개를 실행한다면 이름이 0번부터 시작한다.
- scale out으로 5로 늘리면 3,4번 추가 scale in으로 2로 줄이면 2,3,4 삭제
- 이것이 지금까지 봤던 컨트롤러들과 다른 점으로 statefulSet은 어떤 번호가 추가될 것인지, 삭제될 것인지 알 수 있다.
- 만약 1번 pod에 문제가 생겼다면 pod를 제거 후 다시 1번 pod를 생성한다.
- 다만 DeamonSet과 다르게 하나의 node당 하나의 pod를 보장하는 식은 아니라 다른 node에 생성 될 수도 있다.
StatefulSet definition
ReplicaSet definition | StatefulSet definition |
apiVersion: apps/v1 kind: ReplicaSet metadata: name: rs-nginx spec: replicas: 3 selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14 |
apiVersion: apps/v1 kind: StatefulSet metadata: name: sf-nginx spec: replicas: 3 serviceName: sf-nginx-service selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.14 |
Statefulset volume example
$cat statefulset-exam.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sf-nginx
spec:
replicas: 3
serviceName: sf-service
#podManagementPolicy: OrderedReady
podManagementPolicy: Parallel
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
- ServiceName은 필수로 statefulset과 연결될 Service의 이름을 정의한다.
- podManagementPolicy는 OrderedReady가 Default다.
- 순차적으로 0번 만들고 0번 성공하면 1번, 1번 성공하면 2번 이런식
- Parallel은 한번에, replicas가 3이니 0~2번을 한번에 생성
TEST
Rolling Update
- Statefulset도 Daemonset처럼 Rolling update를 할 수 있다.
- kubectl edit statefulset <sf-name>
$kubectl edit statefulset sf-nginx
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: "2023-08-02T08:27:30Z"
generation: 3
name: sf-nginx
namespace: default
resourceVersion: "602438"
uid: a070d029-2f4b-49f5-bf69-438e5d316102
spec:
persistentVolumeClaimRetentionPolicy:
whenDeleted: Retain
whenScaled: Retain
podManagementPolicy: Parallel
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: webui
serviceName: sf-service
template:
metadata:
creationTimestamp: null
labels:
app: webui
name: nginx-pod
spec:
containers:
- image: nginx:1.14
imagePullPolicy: IfNotPresent
name: nginx-container
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
status:
availableReplicas: 2
collisionCount: 0
currentReplicas: 2
currentRevision: sf-nginx-66f56bb7cb
observedGeneration: 3
readyReplicas: 2
replicas: 2
updateRevision: sf-nginx-66f56bb7cb
updatedReplicas: 2
- image: nginx:1.14 에서 버전을 바꿔주고 저장한다.
$kubectl edit statefulset sf-nginx
...
kind: StatefulSet
metadata:
annotations:
kubernetes.io/change-cause: version 1.16
...
containers:
- image: nginx:1.16
...
- daemonset에서 추가했던거처럼 내용을 추가한다.
- 지금 1.15니까 내용을 추가하면서 1.16으로 Rolling Update도 해준다