Kubernetes - StatefulSet
이번에는 Kubernetes의 StatefulSet에 대해 알아보려한다.
Stateless Application
stateless Application은 주로 애플리케이션이 여러 개 배포되더라도 다 같은 서비스로 유지된다.
주로 Web Server (Apache, Nginx, IIS) 와 같은 애플리케이션에 유용하다.
만일 하나의 애플리케이션이 죽을 경우, Stateless는 단순히 같은 서비스의 역할을 하는 앱을 복제하는 것으로 재생성 할 수 있다.
stateless Application은 대체로 사용자들이 네트워크에 접속하고, 트래픽은 한 애플리케이션에만 집중되면 서버에 문제가 생기기 때문에 여러 애플리케이션에 분산시키는 형태로 흘러간다.
이러한 Stateless Application은 앞서 포스팅했던 ReplicaSet Controller를 통해 활용된다.
Stateful Application
반면 stateful Application은 각각의 애플리케이션 마다 자신만의 역할을 가진 경우 사용된다.
주로 Database (mongoDB, MariaDB, Redis) 등에서 적용된다.
Stateful Application의 경우에는 하나의 애플리케이션이 죽었을 때, 반드시 해당 역할을 하는 애플리케이션이 만들어져야 하며, 애플리케이션의 이름 또한 고유 식별자이기 때문에 똑같은 이름으로 재생성 된다.
stateless의 경우는 Volume이 반드시 필요하진 않지만 Stateful의 경우에는 각각의 역할이 다른 만큼 각각의 Volume을 사용해야 한다.
stateful Application은 대체로 내부 시스템들이 데이터베이스에 저장하기 위해 연결되며, 이 트래픽은 각 애플리케이션의 특징에 맞게끔 들어와야 한다.
stateful Application은 stateless와 다르게 StatefulSet Controller를 활용하는데, 이 StatefulSet에 대해 조금 자세히 알아보려 한다.
StatefulSet
Replicas로 Controller를 만들게 되면, 해당 개수만큼 Pod가 생성되고 관리된다.
이 때 이름은 Original index 이름으로 순차적으로 숫자가 붙어 생성된다.(참고로 Stateless한 경우는 랜덤 이름이 부여됨)
ReplicaSet은 만약 Replicas가 3일 경우, 동시에 3개의 Pod가 생성되지만, StatefulSet은 이름이 순차적으로 붙으면서 생성되기 때문에 순차적으로 생성된다.
또한, 하나의 Pod가 삭제되면 ReplicaSet은 새 이름으로 재생성하지만 StatefulSet은 기존 이름으로 재생성한다. (앞서 말한 고유 식별의 이유로)
Replicas를 0으로 줄이게 된다면 ReplicaSet의 경우, 모든 Pod가 동시에 삭제된다. 그러나 StatefulSet은 순차적으로 삭제된다.
PVC, Headless Service
PVC와 Headless Service의 경우, StatefulSet은 template을 통해 Pod가 만들어지고 추가적으로 volumeClaimTemplates를 통해 PVC를 동적으로 생성한다.
이후 Pod가 추가될 때 마다 새로운 PVC가 추가되어 연결된다.
Replicas를 0으로 줄이게 되면, Pod는 순차적으로 삭제되지만, PVC는 삭제가 안되기 때문에 사용자가 직접 삭제해야한다.
StatefulSet을 만들 떄 ServiceName으로 서비스 속성을 넣는다고 하면, Headless 속성을 부여한다면 Pod에 예측 가능한 도메인 이름이 만들어지기 때문에 internalServer의 특정 Pod 입장에서 원하는 StatefulSet의 파드에 연결할 수 있다.
따라서 상황에 따라 Pod를 선택해서 접속할 수 있게 되는 것이다.