Kubernetes StatefulSet
목차
읽기전 Volume PV&PVC 와 Volume StorageClass먼저 읽어 볼 것
애플리케이션의 statefulSet을 관리하는 workload 리소스
Stateless 애플리케이션은 Deployment로 배포하고, Stateful인 DB 같은 경우는 StatefulSet로 배포
- StatefulSet으로 실행시킨 Pod는 Deployment(deploy-app-5skdw)와 다르게 pod-0, pod-1과 같은 순서값과 안적적인 네트워크 ID를 Pod에 할당
- Pod는 오름차순으로 생성되고, 다음 Pod는 이전 Pod가 준비되고 실행상태가 된 후에만 생성, 삭제는 큰 수의 Pod부터 삭제됨 → “OrderedReady”
- Pod를 순서없이 병렬로 실행되거나 종료 시킬려면 “Parallel” 사용(spec.podManagemetPolicy: “Parallel”)
- kubectl explain statefulset.spe.podManagementPolicy
특징
StatefulSet의 각 Pod들은 동일 spec으로 생성되지만 서로 교체는 불가능. 즉 re-scheduling이 되도 지속적으로 동일 식별자 유지
- sts-0-pod를 지워도 sts-0-pod 이름으로 재생성됨
statefulSet 애플리케이션은 서버, 클라이언트, 애플리케이션에서 사용 할 수 있도록 영구볼륨에 데이터 저장 → StorageClass를 사용한 PVC 사용(동적 볼륨)
- 복제본 증가 시 자동으로 PV/PVC 생성
- 복제본 축소 시 사용했던 PV/PVC는 삭제되지 않고 유지
- 유지되는 이유는 스토리지지가 고유한 상태를 유지해야하는데 scale로 인해 삭제되면 상태 데이토도 같이 삭제 되기 때문
- StatefulSet은 Headless service를 사용해야한다
- StatefulSet은 논리적으로 Pod집합을 만들어주는 Service만 있으면 되므로 Headless Service를 사용한다.
- IP가 없어도 DNS에 등록되므로 nslookup을 통해 Pod의 주소를 확인하여 연결 가능하다.
- https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
- visit-cnt-stfs.yaml
apiVersion: v1
kind: Service
metadata:
name: visit-cnt-stfs-svc
labels:
app: visit-cnt-stfs
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: visit-cnt-stfs
clusterIP: None #headless
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: visit-cnt-stfs
spec:
selector:
matchLabels:
app: visit-cnt-stfs
serviceName: visit-cnt-stfs-svc
replicas: 2
template:
metadata:
labels:
app: visit-cnt-stfs
spec:
containers:
- name: stfs-container
image: dbgurum/mynode:fc.stfs
ports:
- name: http
containerPort: 8080
volumeMounts:
- name: data
mountPath: /var/data
volumeClaimTemplates:
- metadata:
name: data
spec:
resources:
requests:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: \"openebs-hostpath\" #StorageClass 이해 필요$ kubectl apply -f visit-cnt-stfs.yaml
service/visit-cnt-stfs-svc created
$ kubectl get sts,po,svc -o wide | grep visit
statefulset.apps/visit-cnt-stfs 2/2 46s stfs-container dbgurum/mynode:fc.stfs
pod/visit-cnt-stfs-0 1/1 Running 0 46s 10.111.156.102 k8s-node1 <none> <none>
pod/visit-cnt-stfs-1 1/1 Running 0 30s 10.109.131.27 k8s-node2 <none> <none>
service/visit-cnt-stfs-svc ClusterIP None <none> 8080/TCP 46s app=visit-cnt-stfs
#scale 확장
$ kubectl scale sts visit-cnt-stfs --replicas 4
$ kubectl get sts,po,svc,pv -o wide | grep visit
statefulset.apps/visit-cnt-stfs 4/4 2m42s stfs-container dbgurum/mynode:fc.stfs
pod/visit-cnt-stfs-0 1/1 Running 0 2m42s 10.111.156.102 k8s-node1 <none> <none>
pod/visit-cnt-stfs-1 1/1 Running 0 2m26s 10.109.131.27 k8s-node2 <none> <none>
pod/visit-cnt-stfs-2 1/1 Running 0 68s 10.109.131.29 k8s-node2 <none> <none>
pod/visit-cnt-stfs-3 1/1 Running 0 62s 10.111.156.104 k8s-node1 <none> <none>
service/visit-cnt-stfs-svc ClusterIP None <none> 8080/TCP 2m42s app=visit-cnt-stfs
persistentvolume/pvc-02ea5060-56b1-45f3-80b2-8fa66bd43481 1Gi RWO Delete Bound default/data-visit-cnt-stfs-3 openebs-hostpath 58s Filesystem
persistentvolume/pvc-1ef8c4b4-467c-4fd8-8b0d-b42afc561316 1Gi RWO Delete Bound default/data-visit-cnt-stfs-1 openebs-hostpath 2m23s Filesystem
persistentvolume/pvc-50de5316-9381-4341-8a0e-c934888756b2 1Gi RWO Delete Bound default/data-visit-cnt-stfs-2 openebs-hostpath 64s Filesystem
persistentvolume/pvc-5ddc0d34-5183-4f7a-84a8-a10106d93b6d 1Gi RWO Delete Bound default/data-visit-cnt-stfs-0 openebs-hostpath 2m39s Filesystem
#scale 축소
$ kubectl scale sts visit-cnt-stfs --replicas 2
#Pod가 줄었지만 volume 유지 확인
#높은 번호 부터 삭제
$ kubectl get sts,po,svc,pv -o wide | grep visit
statefulset.apps/visit-cnt-stfs 2/2 6m24s stfs-container dbgurum/mynode:fc.stfs
pod/visit-cnt-stfs-0 1/1 Running 0 6m24s 10.111.156.102 k8s-node1 <none> <none>
pod/visit-cnt-stfs-1 1/1 Running 0 6m8s 10.109.131.27 k8s-node2 <none> <none>
service/visit-cnt-stfs-svc ClusterIP None <none> 8080/TCP 6m24s app=visit-cnt-stfs
persistentvolume/pvc-02ea5060-56b1-45f3-80b2-8fa66bd43481 1Gi RWO Delete Bound default/data-visit-cnt-stfs-3 openebs-hostpath 4m40s Filesystem
persistentvolume/pvc-1ef8c4b4-467c-4fd8-8b0d-b42afc561316 1Gi RWO Delete Bound default/data-visit-cnt-stfs-1 openebs-hostpath 6m5s Filesystem
persistentvolume/pvc-50de5316-9381-4341-8a0e-c934888756b2 1Gi RWO Delete Bound default/data-visit-cnt-stfs-2 openebs-hostpath 4m46s Filesystem
persistentvolume/pvc-5ddc0d34-5183-4f7a-84a8-a10106d93b6d 1Gi RWO Delete Bound default/data-visit-cnt-stfs-0 openebs-hostpath 6m21s Filesystem