본문 바로가기

⭐ Kubernetes & EKS/StatefulSet (스테이트 풀셋)

스테이트 풀셋 내용 및 실습

StatefulSet.drawio
0.00MB

# 스테이트 풀셋 개요

- rs를 활용하여 구성이 가능하나, rs는 하나하나 저장소 경로를 지정해 줘야 하기 때문에... 편의성과 효율성 측면에서 좋지 않다.

그래서 스테이트 풀셋을 활용하여 rs의 번거로움을 해소 할 수 있다.

애플리케이션의 상태를 저장하고 관리하는 데 사용되는 쿠버네티스 객체다. 기존의 포드를 삭제하고 생성할 때 상태가 유지되지 않는 한계가 있다. 때문에 파드를 삭제하고 생성하면 완전히 새로운 가상환경이 시작된다. 하지만 필요에 따라 기존의 포드의 상태를 유지하고 싶을 수 있다. 응용프로그램의 로그나 기타 다른 정보들을 함께 저장하고자 하는 경우 단순히 PV를 하나 마운트해 이를 유지하기는 어렵다. 스테이트풀셋으로 생성되는 파드는 영구 식별자를 가지고 상태를 유지시킬 수 있다.

즉, 스테이트 풀셋은 문제가 생긴 파드와 완벽하게 똑같은 파드로 대체된다. 똑같은 이름과 똑같은 IP를 가진 파드로 교체한다는 의미이다.

- 스테이트 풀셋은 파드에 영구식별자를 부여하고 상태를 유지시킨다. 예를들어 응용프로그램 로그나 기타 다른 정보들을 함께 저장하고자 하는 경우에 스트에지 풀셋을 사용하면 된다.

- 파드의 고유한 네트워크 신원을 제공하기 위해서 헤드리스 서비스가 필요하다.
일반적인 서비스라면, 서비스는 기본적으로 레이블 셀렉터가 일치하는 랜덤한 포드를 선택해 트래픽을 전달하기 때문에 스테이트풀셋의 랜덤한 포드들에게 요청을 분산한다.
하지만,  스테이트풀셋의 각 파드는 고유하게 식별되야하며, 파드에 접근할 때에도 '랜덤한 포드'가 아닌 '개별 포드'에 접근해야 한다.
이런 경우 헤드리스 서비스는 서비스의 이름으로 포드의 접근 위치를 알아내기 위해 사용되며, 서비스의 이름과 포드의 이름을 통해서 포드에 직접 접근할 수 있다.

 

# 스테이트 풀셋 실습

vim nginx-statefulset.yaml
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
  serviceName: "nginx" # 헤드레스 서비스를 지정한다.
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10 # 강제 종료까지 대기하는 시간
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # PVC 설정을 저장하는 부분
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "standard"
      resources:
        requests:
          storage: 1Gi

- 작업 수행 및 확인

kubectl create -f nginx-statefulset.yaml

kubectl get svc

kubectl get all

kubectl get pvc

# 도메인 네임과 서비스 동작 확인

kubectl run -i --tty --image busybox:1.28 dns-test --restart=Never --rm /bin/sh

nslookup web-0.nginx.default.svc

nslookup web-1.nginx.default.svc

nslookup web-2.nginx.default.svc

kubectl get pod -o wide

# 스케일 업, 스케일 다운

gce 2번째 터미널 탭에서

kubectl get pod -w

지속적으로 모니터링 확인하기

- 스케일링 했을때 반응을 살펴보기

1번 터미널에서,

exit

kubectl scale statefulset web --replicas=5

kubectl scale statefulset web --replicas=1

kubectl get pvc

kubectl get pv

# 스테이트 풀셋 삭제

kubectl delete statefulsets web

kubectl get pv

kubectl get pvc

- 여전히 존재 하는것을 확인 할 수 있다.

# 다시 생성해 보기

kubectl create -f nginx-statefulset.yaml

- 새로 생성을 해도 이전에 바운드되었던 공간에 다시 할당되는것을 볼 수 있다.

# 업데이트 테스트

kubectl edit statefulsets.apps web

이미지 항목을 찾아 0.9로 변경한다.

- 변경 후 kubectl get pod -w 로 변경사항을 체크하자

kubectl get pod -w

kubectl get pod