-
Kubernetes - Deployment vs StatefulSet개발 2022. 6. 17. 20:00
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 - Service (0) 2022.06.20 Reverse Proxy (0) 2022.06.20 kubernetes - Configmap 생성하기 (0) 2022.06.10 kubernetes - Configmap (0) 2022.06.08 Kafka 용어 정리 (0) 2022.05.31