마구잡

Statefulset - 장애 케이스 본문

Kubernetes/작은팁-짧은글

Statefulset - 장애 케이스

MAGUJOB 2025. 5. 26. 15:27
728x90

Statefulset

스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다.

파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다.

 

디플로이먼트와 유사하게, 스테이트풀셋은 동일한 컨테이너 스펙을 기반으로 둔 파드들을 관리한다. 디플로이먼트와는 다르게, 스테이트풀셋은 각 파드의 독자성을 유지한다. 이 파드들은 동일한 스팩으로 생성되었지만, 서로 교체는 불가능하다. 다시 말해, 각각은 재스케줄링 간에도 지속적으로 유지되는 식별자를 가진다.

 

스토리지 볼륨을 사용해서 워크로드에 지속성을 제공하려는 경우, 솔루션의 일부로 스테이트풀셋을 사용할 수 있다. 스테이트풀셋의 개별 파드는 장애에 취약하지만, 퍼시스턴트 파드 식별자는 기존 볼륨을 실패한 볼륨을 대체하는 새 파드에 더 쉽게 일치시킬 수 있다.

공식 문서

 

 

스테이트풀셋

스테이트풀셋은 애플리케이션의 스테이트풀을 관리하는데 사용하는 워크로드 API 오브젝트이다. 파드 집합의 디플로이먼트와 스케일링을 관리하며, 파드들의 순서 및 고유성을 보장한다 . 디플

kubernetes.io

728x90

Statefulset 장애 케이스

장애 현상:  특정 노드의 메모리원이 과 점유 되어있는 상태에서 배포되어있는 statefulset 워크로드가 다른 노드로 재 스케줄링 되지 않고 동일 노드에 지속적으로 스케줄링 되는 현상

 

노드의 프로세스 중 출처 미상의 프로세스가 메모리를 지속적으로 과점유 하는 상태, 메모리가 과점유 될 시 우선순위가 낮은 프로세스들은 죽이기 시작한다. 이때 자원을 할당 받지 못 한 statefulset 워크로드 pod가 Terminating 되는 상태 이때

 

그렇다면 왜 pod는 다른곳으로 재배치 되지 않았을까?

 

쿠버네티스 환경에서 특정 노드의 메모리가 순간적으로 피크에 도달하면 kubelet이 API 서버로 정상적인 노드 상태 정보를 전송하지 못하는 경우가 발생할 수 있다. 이때 스케줄러는 해당 노드의 최신 리소스 정보를 수신하지 못하므로, 이전에 수집한 상태(즉 피크 이전의 상태)를 기반으로 점수를 계산하게 된다.

 

그 결과, 해당 노드가 여전히 스케줄링 가능하다고 판단되어 새 파드가 계속해서 같은 노드에 재생성되는 현상이 반복될 수 있다. 이는 특히 StatefulSet처럼 재스케줄링이 발생할 경우 같은 노드로 배치되는 원인 중 하나로 작용할 수 있다.

 

결국 이는 스케줄링 로직 자체의 문제가 아니라 노드 상태 정보의 지연된 반영에서 비롯된 문제이며, 노드의 과도한 메모리 사용으로 인한 kubelet 응답 지연이 핵심 원인이라 볼 수 있다.

 

728x90