Kubernetes - StatefulSet

현시기얌·2022년 1월 18일
0

Kubernetes

목록 보기
19/23

Stateless Application vs Stateful Application

Application의 종류에는 Stateless Application과 Stateful Application이 있다.

Stateless는 대표적으로 Web Server이고 Apache, Nginx 등이 있고 Stateful은 대표적으로 Datebase이고 Mysql, MongoDB, Redis 등이 있다.

Stateless는 App이 여러개 배포되더라도 다 똑같은 역할을 하지만 Stateful은 App이 각각 다른 역할을 한다.

만약 App이 다운되면 Stateless는 단순히 같은 서비스 역할을 하는 App을 하나 만들어 주면 되고 이름은 어떻게 만들던 상관이 없다. 반면 Stateful은 특정 역할을 하는 App이 죽으면 반드시 그 역할을 하는 App을 새로 만들어야 한다. 또한 이름 또한 변경이 되어선 안된다.

Stateless는 Volume이 반드시 필요하지 않고 만들더라도 하나의 Volume에 모든 App을 연결할 수 있지만 Stateful은 각각의 역할이 다른 만큼 Volume도 각각 써야 한다.

Stateless App은 주로 사용자들이 접속을 하고 이 접속된 네트워크 트래픽은 여러 App에 분산이 되는 형태다.

Stateful App은 주로 내부의 시스템들이 데이터베이스 연결을 위해 접속을 하고 이 때 트래픽은 각 App의 특징에 맞게 들어와야 한다.
Primary는 Read/Write 권한이 있기 때문에 연결 할려는 시스템에서 CRUD를 모두 할려면 접속해야 한다.
Secondary는 Read 권한만 있기 때문에 조회용으로 접속해야 한다.
Arbiter는 Primary와 Secondary의 상태를 감지해야 하기 때문에 App1과 App2에 연결되어야 한다.

쿠버네티스에서는 Stateless Application을 ReplicaSet으로 이용하고 Stateful Application은 StatefulSet으로 이용한다. 또한 StatefulSet은 목적에 따라 해당 Pod에 접근하기 위해서 Headless Service를 달아준다.

StatefulSet Controller

StatefulSet은 Controller이고 ReplicaSet으로 비교해서 설명하자면

replicas=1로 Controller를 만들게 된다면 StatefulSet도 ReplicaSet처럼 replica의 개수 만큼 Pod가 생성이 되는데 ReplicaSet은 Random으로 Pod의 이름이 생성되는 반면 StatefulSet는 Index 번호로 이름이 생성된다.

그래서 replicas=3으로 늘려보면 ReplicaSet은 2개의 추가적인 Pod가 동시에 생성 되는 반면 StatefulSet은 1개씩 순차적으로 생성된다.

이상태에서 하나의 Pod가 삭제가 되면 ReplicaSet은 랜덤 이름으로 Pod를 재생성하지만 StatefulSet은 기존의 이름으로 Pod를 재생성한다.

마지막으로 replicas=0으로 줄이면 ReplicaSet은 3개의 Pod가 동시에 삭제되지만 StatefulSet은 Index가 높은 Pod부터 순차적으로 삭제가 된다.

PersistentVolumeClaim, Headless Service

ReplicaSet은 PV를 연결하려면 PVC를 별도로 직접 생성 해놔야 한다.
그리고 ReplicaSet을 만들면 template에 Pod의 내용에 persistentVolumeClaim으로 PVC를 지정하기 때문에 바로 연결이 된다.

StatefulSet은 template을 통해 Pod가 만들어지고 추가적으로 volumeClaimTemplates가 있는데 이걸 통해서 PVC가 동적으로 생성되고 PV와도 바로 연결이 된다.

replicas=3으로 변경하면 ReplicaSet은 모든 Pod들이 똑같은 persistentVolumeClaim의 이름으로 PVC을 가지고 있기 때문에 한 PVC에 모두 연결이 된다.

replicas=3으로 변경하면 StatefulSet은 volumeClaimTemplates 때문에 Pod가 추가될 때 마다 새로운 PVC가 생성이 되서 연결이된다. 그래서 Pod마다 각자의 역할에 따른 데이터를 저장할 수 있다. 그리고 Pod가 삭제가 되면 똑같은 역할의 Pod가 그대로 재생성되면서 기존에 연결되어있던 PVC에 연결이 된다.

ReplicaSet은 PVC가 Node1에 만들어졌다면 그 PVC에 연결하는 Pod도 Node1에 있어야 한다. 만약 Node2에 Pod가 생성이 되면 PVC랑 연결이 안되서 Pod가 생성되지 않는다. 그래서 template nodeSelector를 통해서 Node1에 연결시켜야 한다.

StatefulSet은 PVC가 동적으로 Pod와 같은 Node에 만들어지기 때문에 알아서 모든 Node에 균등하게 배포가 된다.

replicas=0으로 변경하면 StatefulSet은 Pod를 순차적으로 삭제하지만 PVC는 삭제하지 않는다. Volume은 함부로 지우면 안되기 때문에 지울거면 사용자가 직접 지워야 한다.

StatefulSet을 만들 때 ServiceName이라는 속성으로 Service의 이름을 넣을 수 있는데 이 이름과 매칭되는 HeadlessService를 만들게되면 Pod에 예측 가능한 도메인 이름이 만들어지기 때문에 내부서버의 특정 Pod의 입장에서 원하는 StatefulSet의 Pod에 연결을 할 수 있다.

profile
현시깁니다

0개의 댓글