앞선 MySQL Operator에서도 MySQL 서버와 볼륨이 Statefulset으로 관리되었습니다.
이 Stateful이 뭔지 알아봅시다.
statefulset은 레플리카셋과 같은 듯 다르기에 레플리카셋에 대하여 먼저 아는것이 필요합니다.
레플리카셋이 무엇인지 간단하게만 설명하자면,
파드 템플릿에서 파드의 복제본은 생성해 사용자가 선언적으로 정의한 replicas 수에 맞게끔 pod를 유지하고 관리하는 것입니다.
이때 레플리카셋은 파드 복제본을 생성할 때 파드의 이름, IP 주소를 제외한 볼륨 등 모든것을 동일하게 생성합니다. 따라서 다른 PVC는 사용이 불가능합니다.
위의 이미지처럼 말고 pod별로 개별 스토리지를 가지게 하려면 결국 1) pod 갯수만큼 레플리카셋을 생성해야합니다.
그러나 이는 그림에서도 알겠지만 각자 생성, 관리되어야하므로 너무 번거롭고 귀찮습니다.
두번째 방법은 2) 동일 볼륨을 여러 디렉토리로 분할 사용 이 있습니다.
하나의 PV에 각 파드들이 다른 디렉토리 공잔을 지정해서 사용하는 것입니다.
그러나 이 방법은 잘 동작된다는 보장이 불가하며 볼륨 병목현상이 발생합니다.
쿠버네티스에서 마이크로서비스 구조로 동작하는 애플리케이션은 대부분 상태를 갖지 않는 stateless입니다. 따라서 이런경우 디플로이먼트, 레플리카셋을 통해 쉽게 애플리케이션 배포가 가능합니다.
그러나 데이터베이스처럼 상태를 갖는 stateful 애플리케이션을 쿠버네티스에서 실행하는 것은 pod 내부의 데이터를 어떻게 관리할지, 상태를 갖는 pod에는 어떻게 접근할 수 있을 지 등등 고려할 사항이 많아 복잡합니다.
따라서, 결론적으로 레플리카셋은 stateless 애플리케이션에 대한 배포를 도와주며 스테이트풀셋은 state가 있는 애플리케이션에 대한 배포를 도와줍니다.
스테이트풀셋은 컨테이너 애플리케이션의 상태를 관리하는 데 사용하는 컨트롤러입니다.
디플로이먼트 컨트롤러와 같이 파드를 배포하고 복제본을 제공하며 스케일링을 관리할 수 있습니다. 그러나 디플로이먼트와 달리 파드의 순서 및 파드의 고유성을 보장하며, 동일한 스펙으로 생성되지만 각각 고유한 볼륨을 가지고 있습니다.