Kubernetes는 기본적으로 Stateless Application 운영에 최적화되어 있습니다.
하지만 실제 운영 환경에서는 Database, Message Queue, Storage System처럼 데이터와 순서가 중요한 Stateful Application을 많이 사용합니다.
예를 들어 Database Cluster에서는 각 Instance가 고유한 이름과 저장 공간을 유지해야 하며, Pod가 재생성되어도 이전 데이터를 그대로 사용할 수 있어야 합니다.
일반적인 Deployment는 Pod를 동일하게 관리하지만 고유한 Identity와 Persistent Storage 관리가 필요한 Application에는 적합하지 않습니다.
Kubernetes에서는 이러한 문제를 해결하기 위해 StatefulSet 기능을 제공합니다.
StatefulSet은 Stateful Application을 위해 Pod Identity, 순서 보장, Persistent Storage 연결을 제공하는 Kubernetes Controller입니다.
| 구성 요소 | 역할 |
|---|---|
| StatefulSet | Stateful Application 관리 |
| Pod Identity | 고유한 Pod 이름 유지 |
| Persistent Volume | 데이터 저장 |
| Headless Service | Pod DNS 제공 |
StatefulSet 구조를 이해하면 Kubernetes에서 Database와 같은 상태 저장 Application이 안정적으로 운영되는 방식을 이해할 수 있습니다.
Kubernetes StatefulSet이란 무엇인가?
StatefulSet은 Kubernetes에서 상태(State)를 유지해야 하는 Application을 관리하기 위한 Controller입니다.
Deployment와 비슷하게 Pod를 생성하고 관리하지만 각 Pod에 고유한 Identity와 Storage를 제공합니다.
Deployment:
web-7d8f9c-x1a2
web-7d8f9c-y3b4
StatefulSet:
database-0
database-1
database-2
Pod 이름과 순서가 유지되기 때문에 Stateful Application 운영에 적합합니다.
Kubernetes StatefulSet이 필요한 이유
일반적인 Deployment는 모든 Pod를 동일한 Instance로 취급합니다.
하지만 Database 같은 Application은 각 Instance를 구분해야 합니다.
문제:
| 상황 | 문제 |
|---|---|
| Pod 재생성 | 새로운 Identity 생성 |
| Database Cluster | Node 구분 필요 |
| Storage 연결 | 기존 데이터 유지 필요 |
| 순서 관리 | Startup 순서 필요 |
StatefulSet은 이러한 문제를 해결합니다.
Kubernetes StatefulSet 동작 구조
StatefulSet은 Pod 생성과 관리를 특별한 방식으로 수행합니다.
구조:
| 구성 요소 | 역할 |
|---|---|
| StatefulSet | Pod 관리 |
| Pod | 고유 Identity 보유 |
| Headless Service | DNS 제공 |
| PVC | 개별 Storage 연결 |
동작 과정:
| 단계 | 내용 |
|---|---|
| 1단계 | StatefulSet 생성 |
| 2단계 | Pod 순서대로 생성 |
| 3단계 | 각 Pod Identity 부여 |
| 4단계 | PVC 연결 |
| 5단계 | Application 실행 |
각 Pod는 독립적인 Identity를 유지합니다.
Kubernetes StatefulSet과 Deployment 차이
두 Controller는 목적이 다릅니다.
| 구분 | Deployment | StatefulSet |
|---|---|---|
| 대상 | Stateless Application | Stateful Application |
| Pod 이름 | 랜덤 생성 | 고정 이름 |
| Storage | 공유 가능 | 개별 Storage |
| 순서 관리 | 없음 | 지원 |
| 대표 사용 | Web Server | Database |
Application 특성에 따라 선택해야 합니다.
Kubernetes StatefulSet Pod Identity란?
StatefulSet의 가장 큰 특징은 Pod마다 고유한 이름을 가진다는 점입니다.
예:
StatefulSet 이름:
mysql
생성 Pod:
mysql-0
mysql-1
mysql-2
Pod가 삭제되어도 동일한 이름으로 다시 생성됩니다.
이를 Stable Network Identity라고 합니다.
Kubernetes StatefulSet Ordinal Index란?
StatefulSet Pod는 숫자 순서를 가집니다.
예:
redis-0
redis-1
redis-2
이 숫자를 Ordinal Index라고 합니다.
활용:
| Pod | 역할 |
|---|---|
| database-0 | Primary |
| database-1 | Replica |
| database-2 | Replica |
Database Cluster 구성에서 중요합니다.
Kubernetes StatefulSet Startup 순서
StatefulSet은 Pod 생성 순서를 보장합니다.
기본 방식:
database-0 생성
↓
Ready 상태 확인
↓
database-1 생성
↓
Ready 상태 확인
↓
database-2 생성
이를 통해 Cluster 초기화 과정을 안정적으로 관리할 수 있습니다.
Kubernetes StatefulSet 종료 순서
삭제 시에도 역순으로 처리됩니다.
예:
database-2 종료
↓
database-1 종료
↓
database-0 종료
Database Cluster 종료 과정에서 데이터 보호에 도움이 됩니다.
Kubernetes StatefulSet과 Persistent Volume 관계
StatefulSet은 각 Pod마다 독립적인 Storage를 제공합니다.
구조:
StatefulSet
↓
Pod
↓
PVC
↓
PV
↓
Storage
예:
mysql-0
↓
mysql-0-pvc
↓
mysql-0-pv
mysql-1
↓
mysql-1-pvc
↓
mysql-1-pv
각 Pod 데이터가 독립적으로 유지됩니다.
Kubernetes VolumeClaimTemplate이란?
StatefulSet에서는 VolumeClaimTemplate을 사용하여 Pod 생성 시 자동으로 PVC를 생성합니다.
구조:
StatefulSet 생성
↓
VolumeClaimTemplate 확인
↓
PVC 자동 생성
↓
PV 연결
Pod 개수만큼 Storage가 자동 생성됩니다.
Kubernetes Headless Service와 StatefulSet 관계
StatefulSet은 일반 Service보다 Headless Service를 주로 사용합니다.
일반 Service:
Service IP 제공
Headless Service:
개별 Pod DNS 제공
예:
database-0.mysql.default.svc.cluster.local
database-1.mysql.default.svc.cluster.local
각 Pod를 직접 접근할 수 있습니다.
Kubernetes StatefulSet DNS 구조
StatefulSet Pod는 고정된 DNS 이름을 가집니다.
형식:
pod-name.service-name.namespace.svc.cluster.local
예:
mysql-0.mysql.default.svc.cluster.local
Application이 특정 Instance를 찾을 수 있습니다.
Kubernetes StatefulSet 활용 사례
StatefulSet은 상태가 필요한 Application에서 사용됩니다.
| Application | 사용 이유 |
|---|---|
| MySQL | Database Identity 유지 |
| PostgreSQL | Replica 관리 |
| Redis Cluster | Node 구분 |
| Kafka | Broker Identity 유지 |
| Elasticsearch | Data Node 관리 |
Cloud Native 환경에서 중요한 Controller입니다.
Kubernetes StatefulSet Rolling Update
StatefulSet도 Version Update를 지원합니다.
하지만 Deployment와 다르게 순서 기반으로 진행됩니다.
예:
database-2 업데이트
↓
database-1 업데이트
↓
database-0 업데이트
서비스 안정성을 고려한 업데이트 방식입니다.
Kubernetes StatefulSet 운영 시 고려사항
Production 환경에서는 Stateful Application 특성을 고려해야 합니다.
| 항목 | 설명 |
|---|---|
| Backup | 데이터 보호 |
| Storage 관리 | PVC 유지 |
| Update 전략 | 순서 고려 |
| Replication | Cluster 구성 확인 |
StatefulSet은 단순한 Pod 배포보다 신중한 설계가 필요합니다.
Kubernetes StatefulSet 장애 상황
StatefulSet 문제가 발생하면 데이터와 Cluster 상태에 영향을 줄 수 있습니다.
주요 문제:
| 문제 | 결과 |
|---|---|
| PVC 연결 실패 | Pod 실행 실패 |
| DNS 문제 | Instance 접근 불가 |
| Storage 오류 | 데이터 접근 문제 |
| Replication 오류 | Cluster 불안정 |
Monitoring과 Backup 전략이 중요합니다.
Kubernetes StatefulSet 장점
| 장점 | 설명 |
|---|---|
| 고유 Identity | Pod 구분 가능 |
| Storage 유지 | 데이터 보호 |
| 순서 관리 | 안정적인 Startup |
| Cluster 구성 | Database 운영 지원 |
StatefulSet은 Kubernetes Stateful Application 운영의 핵심 기능입니다.
자주 묻는 질문
StatefulSet과 Deployment 차이는 무엇인가요?
Deployment는 동일한 Stateless Pod를 관리하고 StatefulSet은 고유 Identity와 Storage가 필요한 Stateful Application을 관리합니다.
StatefulSet에서도 자동 Scaling이 가능한가요?
가능하지만 Database처럼 순서와 데이터 관계가 중요한 Application은 Scaling 전략을 신중하게 설계해야 합니다.
모든 Database를 StatefulSet으로 운영해야 하나요?
아닙니다.
Kubernetes Operator와 Managed Database 서비스를 함께 사용하는 경우도 많습니다.
마무리
Kubernetes StatefulSet은 Database와 같은 Stateful Application을 안정적으로 운영하기 위한 핵심 Controller입니다.
| 구성 요소 | 역할 |
|---|---|
| StatefulSet | Stateful Application 관리 |
| Pod Identity | 고유 이름 유지 |
| PVC | 개별 Storage 제공 |
| Headless Service | Pod DNS 제공 |
StatefulSet 구조를 이해하면 Kubernetes 환경에서 데이터가 필요한 Application을 안정적으로 배포하고 관리하는 방식을 이해할 수 있습니다.
다음 글에서는 Kubernetes 작업 실행과 Batch 처리를 위한 Kubernetes Job 완벽 가이드! 일회성 작업과 Batch Processing 구조 이해하기를 알아보겠습니다.