Backend/Docker, Kubernetes

StatefulSet

findmypiece 2022. 8. 29. 14:09
728x90

상태를 유지하는 데이타베이스와 같은 애플리케이션을 관리하기 위한 컨트롤러가 StatefulSet 컨트롤러이다. (StatefulSet은 쿠버네티스 1.9 버전 부터 정식 적용 되었다. )

 

Pod 이름에 대한 규칙성 부여

StatefulSet에 의해서 생성되는 Pod들의 이름은 규칙성을 띈다. 생성된 Pod들은 {Pod 이름}-{순번} 식으로 이름이 정해진다. 예를 들어 Pod 이름을 mysql 이라고 정의했으면, 이 StatefulSet에 의해 생성되는 Pod 명들은 mysql-0, mysql-1,mysql-2 … 가 된다.

배포시 순차적인 기동과 업데이트

또한 StatefulSet에 의해서 Pod가 생성될때, 동시에 모든 Pod를 생성하지 않고, 0,1,2,.. 순서대로 하나씩 Pod를 생성한다. 이러한 순차기동은 데이타베이스에서 마스터 노드가 기동된 후에, 슬레이브 노드가 기동되어야 하는 조건등에 유용하게 사용될 수 있다.

개별 Pod에 대한 디스크 볼륨 관리

ReplicaSet 기반의 디스크 볼륨 관리의 문제는 하나의 컨트롤러로 여러개의 Pod에 대한 디스크를 각각 지정해서 관리할 수 없는 문제가 있었는데, StatefulSet의 경우 PVC (Persistent Volume Claim)을 템플릿 형태로 정의하여, Pod 마다 각각 PVC와 PV를 생성하여 관리할 수 있도록 한다.

이건 설명이 더 필요한데 PV와 PVC는 무조건 1:1 이기 때문에 PVC를 3개 사용한다면 PV도 3개가 필요하다. 특정 PVC에 의해 사용되는 PV를 다른곳에서 사용할 수 없다는 말이다.

이에 Deployment 에서 replicas 를 2개 이상으로 지정했는데 볼륨에 미리 정의된 PV를 persistentVolumeClaim 로 연결하려고 하면 첫번째 pod은 정상 기동되지만 2번째 pod 은 아래 오류로 구동이 실패할 것이다.

Volume is already used by pod(s) ...
 
 

볼륨(PV)이 다른 Pod 에 의해 이미 사용되고 있기 때문에 볼륨을 사용할 수 없어 Pod 생성이 되지 않고 있는 상황이다. 이 문제를 해결하려면 persistentVolumeClaim 이 아니라 volumeClaimTemplates 를 통해서 PVC를 동적으로 정의해야 한다. 이 경우 pod 갯수만큼 PV, PVC 가 자동으로 생성되어 연결된다.

 

https://stackoverflow.com/questions/41583672/kubernetes-deployments-vs-statefulsets
https://bcho.tistory.com/1306
728x90