쿠버네티스 [스테이트풀셋]이란?

JACKJACK·2023년 2월 7일
1
post-thumbnail

📄스테이트풀셋이란?

애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트

레플리카셋은 하나의 파드템플릿에서 여러 파드(레플리카)를 생성하는데 이 때 모든 파드가 동일한 PVC와 PV를 사용하게 된다. 그렇기에 각각의 인스턴스에 별도의 스토리지가 필요하거나 분산 데이터 저장소를 실행(feat. 클러스터 애플리케이션)하기 위해서는 수동으로 파드를 생성 혹은 인스턴스별로 각각 레플리카셋을 만들어줘야한다. 하지만 이렇게 되면 파드의 업데이트나 레플리카셋의 종류가 늘어나기 때문에 번거로움이 존재하게 된다. 그리하여 스테이트풀셋이 쓰이게 되었다.

  • 앞서 말했던것과 같이 스테이트풀셋은 레플리카셋의 대체제이며 애플리케이션 각각의 상태 값이 필요한 경우 사용하는 리소스이다.
  • 책에서 본 예로는 스테이트풀셋은 애완동물 레플리카셋은 가축과 같다고 한다. 가축은 죽어도 다른 가축을 문제없이 데려와 기를 수 있지만 애완동물은 이전 애완동물과 같은 아이덴티티를 가질 수 없기 때문이라는데 비유가 꽤 적절한것 같다. 이렇게 스테이트풀셋에서의 인스턴스는 아이덴티티와 상태를 유지시켜야하는 특징을 지닌다.
  • 다음과 같이 스테이트풀셋은 예측가능한 이름을 생성하며 레플리카셋과 다르게 파드가 죽어도 동일한 이름으로 파드가 생성된다. 만약 스케일 다운이 일어난다면 항상 인덱스 서순이 높은 인스턴스를 먼저 제거한다.(레플리카셋은 랜덤) 이 때문에 스케일 다운이 일어날 땐 인스턴스가 비정상인것이 없는지 확인하는 작업이 필요하다.
  • 스테이트풀셋은 파드를 생성할때 인덱스를 부여해 파드를 구분짓듯이 볼륨도 인덱스로 구분짓는다.
  • 스테이트풀셋에서 스케일업이 일어나면 API오브젝트에서 PVC를 생성해 PV를 바인딩 해주고 스케일 다운이 일어나면 파드만 삭제하고 PVC, PV는 그대로 유지한다.
  • 쿠버네티스가 파드의 상태를 확신할 수 없을 때 동일한 아이덴티티를 가진 인스턴스가 생성되어 동일한 스토리지에 바인딩 될 수 있으므로, 스테이트풀셋은 파드 인스턴스에 최대 하나의(at-most-one semantics)를 보장해야한다. 즉 교체 파드를 생성하기전에 이전 파드가 실행되지 않음을 확신해야한다. 클러스터 관리자는 이를 위해 파드나 노드를 수동으로 삭제해주어야한다.



📑스테이트풀셋의 생성

  • 만약 스테이트풀셋에 세개의 레플리카를 스케일링 하려면 세개의 pv가 필요하다. pv-a,b,c라는 볼륨을 각각 생성하고 스테이프풀셋에 필요한 거버닝 서비스를 생성해야한다.
  • 거버닝 서비스는 헤드리스 서비스를 생성해 파드간 피어 디스커버리가 가능하도록 하면된다.
  • 이제 스테이풀셋의 생성이 가능하며 디플로이먼트와 크게 차이가 없다. 다른점은 volumnClainTempletes 항목이 있다는 점이다. volumnClainTempletes>metadata>name을 통해 pvc의 참조가 가능하다.
  • 스테이트풀셋을 생성하면 디플로이먼트와는 다르게 파드를 순차적으로 생성한다.(레이스 컨디션 우려) 스테이트풀셋 생성 후 파드를 조회하면 volumnMount 항목을 통해 각 파드가 다른 pv를 참고하고 있음을 확인할 수 있다.
  • 앞으로 파드가 삭제되더라도 파드는 노드 어디에나 스케줄링 될 수 있으며 아이덴티티는 유지된다.
  • 클라이언트의 요청이 클러스터 노드 중 하나에 도달하면 스테이트풀셋으로 만들어진 모든 파드의 피어를 디스커버리해 클라이언트로 보내준다.

스테이트풀셋의 업데이트

  • 스테이트풀셋의 레플리카를 업데이트 할 경우 디플로이먼트와는 다르게 템플릿이 수정될 때 자동으로 롤아웃을 수행하지 않는다. 따라서 spec.updateStrategy 옵션을 통해 롤링 업데이트를 수행할 수 있도록 지정해야한다.




💡결론

- 스테이트풀셋은 애플리케이션의 스테이트풀(아이덴티티와 유사)을 관리하는데 사용하는 워크로드 API 오브젝트

- 스테이트풀셋에서 파드를 생성할 때는 순차적으로 생성(레이스컨디션 우려)하며 생성된 파드는 삭제되어 재생성 되더라도 이전 파드의 아이덴티티를 유지한다.

profile
러닝커브를 빠르게 높이자🎢

0개의 댓글