본문 바로가기

DevOps/[Kubernetes]

[Kubernetes] kubernetes 환경에서 Database 구축 시 Statefulset을 사용해야 하는 이유

반응형

 

INTRO


EKS환경(Kubernetes) 에서  Database 관련 서비스를 띄울 때에는,

Statefulset을 사용하는 것이 일반적이다.

아래는 왜 Statefulset을 사용해야 하는지

그리고 사용 중 알면 유용한 정보를 포스팅하고자 한다.

 


 

1. 개요

- Kubernetes 에는 pod 를 관리하기 위해 존재하는 stateless / stateful 한 컨트롤러들이 있다.  

- mongodb와 같은 데이터베이스를 서비스하기 위해선 어떤 컨트롤러를 사용해야 할까?

- 정답은 stateful 한 컨트롤러를 사용해야 한다. = Statefulset

- 많은 DB 환경에서는 데이터의 보존성과 안정성을 위해 Replication 환경을 제공한다.

- 아래는 mongodb에서의 기본적인 Replication 구조이다.

- 보다시피 각 노드들은 Primary, Secondary 등의 역할을 가지고 있고,

- 이는 다른 노드가 같은 역할을 100% 대체할 수 없다는 의미이다.

- 물론 아래 구조에서의 secondary와 secondary는 동일한 역할을 한다고 하지만,

- 이는 MongoDB에서 전적으로 제어하여 역할을 선출하기때문에 사용자가 노드를 하나 더 띄운다고해도

- 완벽히 대체한다고 볼 순 없다.

 

 

2. Stateful vs Stateless

- 위에서 Stateful한 컨트롤러를 사용해야한다고 적었다.

- Stateless로 구축한다면 어떤 문제점이 생길까?

 

 

1. Naming 문제

- 그림의 6개의 pod를 보면

- 위 3개의 pod는 statefulset 을 통해 생성된 pod,(Stateful)

- 아래 3개 pod는 deployment를 통해 생성된 pod이다.(Stateless)

- statefulset으로 생성된 pod들의 경우 이름이 순차적으로 정해지는 반면

- deployment로 생성된 pod들은 이름이 불규칙적으로 생성되는 것을 볼 수 있다.

 

- 아래는 Mongodb에서 Replication 설정을 위해 3개의 노드를 member로 구성한 것이다.

- hosts 구성을 보면, 각 [pod 이름.서비스 : 포트] 와 같이 구성되어 있는 것을 볼 수있다.

- Deployment를 통해 pod를 생성하면 이렇게 pod 이름을 지정하여 멤버로 추가하는 것이 불가능하다.

 

 

 

2. 실행 순서의 문제

- 아래 그림을 보면 deployment로 생성된 pod들의 경우 AGE가 같은 것을 볼 수 있다.

- 동시에 병렬로 생성된다는 의미

 

 

- 아래 그림은 statefulset로 생성된 pod들이다.

- 생성 시간이 각자 다른것을(Linear 한 것을) 볼 수 있다.

- DB Replication의 경우에는 실행 순서에 따라 엔진 내에서 Primary / Secondary 또는 Master/Slave 등을 선출하는 과정이 있다.

- 이러한 관점에서 봤을 때 병렬 생성은 올바르지 않아 보인다.

 

3. 볼륨 마운트의 문제

- Database 특성상 데이터는 영속적으로 저장되어야하며,

- Kubernetes환경에서 영속적으로 데이터를 저장하려면, PV를 사용해야 한다.

- 그리고 각 Pod들은 서로 다른 PV를 가지고 있어야 하나의 PV가 실패하더라도 다른 PV에서 데이터를 복구할 수 있다. 

 

- deployment에 볼륨 마운트 관련 설정을 추가하고 파드를 생성하면

- 병렬로 생성된 파드들 중 하나가 볼륨에 마운트될것이다.

- 그리고 나머지 파드들은 해당 볼륨이 이미 마운트되어있으므로, 마운트에 실패한다.

- 그렇기 때문에 deployment를 3개 생성하여 pv,pvc,pod 각각 하나씩 생성되도록 제어해야하는 번거로움이 있다.

 

- statefulset의 volumeClaimTemplate 에 PVC를 지정하면, 각 pod별 pv, pvc를 생성해준다.

 

마무리

결론적으로, 위의 문제들을 직면하지 않으려면 database를 k8s로 서비스할때에는 Stateful한 컨트롤러를 사용하는 것이 좋다.

 

참고 : https://bcho.tistory.com/1306

 

 

 

-퍼가실 때는 출처를 꼭 같이 적어서 올려주세요!

 

반응형