Kubernetes - Deployment vs StatefulSet
Kubernetes는 Pod을 배포하는 방법으로 StatefulSet과 Deployment를 제공한다. Deployment를 주로 사용해본 입장에선 StatefulSet이 Deployment와 어떤 차이가 있는 것인지 이해하는게 난감했다. 공식 문서상에선 Pod의 순서와 특징의 보존을 보장한다는 설명이 있는데 여전히 잘 와닿지 않는 개념이다.
Stateful and Stateless Application
StatefulSet을 이해하기 위해선 먼저 Stateful Application과 Stateless Application을 먼저 이해하는게 좋을 것 같다. Stateless 인 경우에는 상태를 저장할 필요가 없는 애플리케이션이다. 만약 서버상에 인스턴스가 저장 관련 작업이 모두 외부 클라우드에 업로드한 MySQL나 S3로 이뤄지며 인스턴스가 재생성 되더라도 내부 저장소를 버려도 되는 경우 이 애플리케이션은 Stateless 애플리케이션이다.
Stateful 은 상태를 저장해야하는 경우를 말한다. 서버 인스턴스가 데이터를 관리하는 MySQL 서버라 해보자. 데이터베이스가 서버 내부에서 관리되고 있기 때문에 이 경우에는 새로운 인스턴스를 만들더라도 내부에 저장된 데이터까지 복제돼야한다. 이처럼 동작 당시의 상태까지 고려해야하는 경우 Stateful Application 이라 한다.
Deployment vs StatefulSet
Deployment 의 경우 Stateless 방식으로 Pod을 배포한다. Pod을 관리하는 감독관(Supervisor)의 입장으로 Pod의 생성, 복제 삭제를 Deployment 에서 세팅된 상태로 처리한다. ReplicaSet으로 설정된 값에 따라 Pod이 갑자기 늘어날 수 있고 줄어들 수도 있다. 이 과정에서 Pod의 상태까지 저장하진 않는다. Pod이 내부적으로 사용하고 있는 Ephemeral 스토리지는 Pod이 동작하는 동안에만 유효하고 Pod이 삭제되면 따라서 같이 삭제되게 된다. 만약 Deployment 이면서 Pod 의 일부 상태를 저장하고 싶다면 외부 저장소를 마운트해서 사용하는 방법이 있다.
StatefulSet은 Stateful 방식으로 Pod을 관리한다. 초기 생성때 Pod 별로 별도의 identifier를 부여해서 혹시나 Pod이 재생성 되더라도 그 상태를 유지할 수 있게끔 유도하는 식이다. 고유한 이름이 있고 StatefulSet 내부의 Pod은 재생성 되더라도 순서도 동일하다. 논리적 컴퓨터를 할당해주는 방법이라고 보면 될 것 같다. 주로 Pod의 DNS를 고정시켜주고 싶은 경우나 스토리지가 동일한 상태를 유지하도록 세팅하는 경우에 사용한다. StatefulSet 에서 Pod은 PVC(Persistent Volume Claim) 이라는 스토리지를 개별로 할당 받아서 사용하게 된다. MySQL, Zookeeper, Kafka 를 배포할 때 Stateful 방식을 사용한다.
Kubernetes Deployment vs. StatefulSets | Baeldung
In this tutorial, we'll discuss two different ways to deploy our application(pods) on Kubernetes using two resources provided by Kubernetes: Deployment and StatefulSet.
www.baeldung.com