Kubernetes는 기본적으로 Container를 빠르게 생성하고 삭제하는 환경에 최적화되어 있습니다.
하지만 모든 Application이 동일한 방식으로 운영되는 것은 아닙니다.
웹 서버와 같은 Stateless Application은 새로운 Pod를 생성해도 문제가 없습니다.
예:
Web Server Pod
↓
삭제
↓
새로운 Pod 생성
↓
서비스 유지
하지만 Database, Message Queue, Storage System 같은 Application은 고유한 데이터와 상태를 유지해야 합니다.
예:
MySQL
Redis
MongoDB
Kafka
이러한 Application은 일반적인 Deployment 방식만으로 운영하기 어렵습니다.
Kubernetes에서는 상태를 유지해야 하는 Application을 위해 StatefulSet 기능을 제공합니다.
StatefulSet은 Pod의 고유한 이름, 안정적인 Network Identity, 순차적인 배포와 Storage 연결을 관리하는 Kubernetes Resource입니다.
| 구성 요소 | 역할 |
|---|---|
| StatefulSet | 상태 유지 Pod 관리 |
| Headless Service | 고정 Network Identity 제공 |
| Persistent Volume | 데이터 유지 |
| Ordered Deployment | 순차 생성 관리 |
StatefulSet 구조를 이해하면 Kubernetes 환경에서 Database와 같은 Stateful Application을 안정적으로 운영할 수 있습니다.
Kubernetes StatefulSet이 필요한 이유
일반적인 Deployment는 Pod를 동일한 Replica로 관리합니다.
예:
Deployment
↓
Pod
- app-7f8d
- app-9k3m
- app-2x5p
Pod 이름은 랜덤하게 생성됩니다.
웹 서버에서는 문제가 없습니다.
하지만 Database에서는 문제가 됩니다.
예:
Database Cluster:
mysql-0
mysql-1
mysql-2
각각의 Server Identity가 필요합니다.
Kubernetes StatefulSet은 이러한 고유한 상태를 관리합니다.
StatefulSet과 Deployment 차이
두 Resource는 목적이 다릅니다.
| 구분 | Deployment | StatefulSet |
|---|---|---|
| 목적 | Stateless Application | Stateful Application |
| Pod 이름 | 랜덤 | 고정 |
| Storage | 공유 가능 | 개별 연결 |
| 생성 순서 | 동시 생성 | 순차 생성 |
| 삭제 순서 | 무관 | 역순 삭제 |
Application 특성에 따라 선택해야 합니다.
Kubernetes StatefulSet Pod 이름 구조
StatefulSet은 고정된 Pod 이름을 제공합니다.
예:
StatefulSet 이름:
mysql
생성 Pod:
mysql-0
mysql-1
mysql-2
Pod가 삭제되어도 같은 이름으로 다시 생성됩니다.
예:
mysql-1 삭제
↓
새로운 Pod 생성
↓
mysql-1 복구
안정적인 Identity를 유지합니다.
StatefulSet과 Headless Service 관계
StatefulSet은 일반 Service보다 Headless Service를 주로 사용합니다.
일반 Service:
Client
↓
하나의 ClusterIP
↓
여러 Pod
Load Balancing 목적
Headless Service:
Client
↓
개별 Pod DNS
↓
특정 Pod 접근
Database Cluster 구성에 적합합니다.
Kubernetes StatefulSet Network Identity
StatefulSet Pod는 고유 DNS 이름을 가집니다.
예:
mysql-0.mysql.default.svc.cluster.local
mysql-1.mysql.default.svc.cluster.local
Application은 특정 Pod를 직접 찾을 수 있습니다.
Database Replication 환경에서 중요합니다.
StatefulSet Storage 구조
StatefulSet은 각 Pod마다 개별 Storage를 연결합니다.
구조:
mysql-0
↓
PVC-0
↓
PV-0
mysql-1
↓
PVC-1
↓
PV-1
각 Pod가 독립적인 데이터를 유지합니다.
StatefulSet VolumeClaimTemplates란?
StatefulSet에서는 VolumeClaimTemplates를 사용해 PVC를 자동 생성합니다.
구조:
StatefulSet 생성
↓
PVC Template 확인
↓
Pod별 PVC 생성
↓
Storage 연결
예:
mysql-0
↓
mysql-data-mysql-0
mysql-1
↓
mysql-data-mysql-1
자동으로 Storage를 관리합니다.
StatefulSet 생성 순서
StatefulSet은 순서를 보장합니다.
예:
Replica 3개 생성:
1단계
mysql-0 생성
↓
Ready 확인
↓
2단계
mysql-1 생성
↓
Ready 확인
↓
3단계
mysql-2 생성
순차적인 시작이 필요한 Application에 적합합니다.
StatefulSet 삭제 순서
삭제도 순서가 있습니다.
예:
mysql-2
↓
mysql-1
↓
mysql-0
역순으로 종료합니다.
Database Cluster 안정성을 위해 필요한 구조입니다.
StatefulSet 활용 사례
대표적인 사용 환경:
| Application | 이유 |
|---|---|
| MySQL | Database Identity 필요 |
| PostgreSQL | Persistent Data 필요 |
| MongoDB | Node Identity 필요 |
| Redis Cluster | Replication 관리 |
| Kafka | Broker 관리 |
상태 관리가 필요한 시스템에서 사용합니다.
StatefulSet 운영 시 주의사항
StatefulSet은 강력하지만 모든 Application에 적합하지 않습니다.
주의:
| 항목 | 설명 |
|---|---|
| Backup | 별도 구성 필요 |
| Storage 성능 | Database 영향 |
| Replication | Application 설정 필요 |
| Scaling | 순서 고려 필요 |
Database 운영에서는 Kubernetes 기능만으로 모든 문제가 해결되지는 않습니다.
StatefulSet Scaling 방식
Replica 증가:
현재:
mysql-0
mysql-1
↓
Scale Up
↓
mysql-2 생성
순서대로 추가됩니다.
Scale Down:
mysql-2 제거
↓
mysql-1
↓
mysql-0
순서를 유지합니다.
StatefulSet과 Backup 전략
Database 운영에서는 Backup이 중요합니다.
구성:
StatefulSet
↓
Persistent Volume
↓
Backup System
↓
외부 Storage
Volume만 믿는 것은 충분하지 않습니다.
StatefulSet 장애 분석 방법
문제 발생 시 확인:
Pod 확인
kubectl get pods
StatefulSet 확인
kubectl get statefulset
PVC 확인
kubectl get pvc
Event 확인
kubectl describe pod pod-name
Storage와 Network를 함께 확인해야 합니다.
StatefulSet과 Deployment 선택 기준
선택 기준:
Stateless:
- Web Server
- API Server
- Frontend
↓
Deployment
Stateful:
- Database
- Message Queue
- Cluster System
↓
StatefulSet
Application 성격에 따라 결정합니다.
StatefulSet 장점
| 장점 | 설명 |
|---|---|
| 고정 Identity | Pod 이름 유지 |
| Stable Storage | 데이터 유지 |
| 순차 관리 | 안정적인 배포 |
| Cluster 구성 | Database 운영 가능 |
Stateful Application 운영의 핵심 Resource입니다.
자주 묻는 질문
Database는 무조건 StatefulSet을 사용해야 하나요?
아닙니다.
Managed Database를 사용하는 경우 Kubernetes 외부에서 운영하기도 합니다.
StatefulSet과 Deployment를 같이 사용할 수 있나요?
가능합니다.
예를 들어 API Server는 Deployment, Database는 StatefulSet으로 구성할 수 있습니다.
StatefulSet Pod를 삭제하면 데이터가 사라지나요?
PVC와 PV를 사용하면 Container 삭제와 관계없이 데이터를 유지할 수 있습니다.
마무리
Kubernetes StatefulSet은 데이터와 상태를 유지해야 하는 Application을 위한 Kubernetes Resource입니다.
| 구성 요소 | 역할 |
|---|---|
| StatefulSet | 상태 유지 Pod 관리 |
| Headless Service | 고정 Network 제공 |
| PVC | 개별 Storage 연결 |
| PV | 데이터 유지 |
StatefulSet 구조를 이해하면 Kubernetes 환경에서 Database와 같은 중요한 Application을 안정적으로 운영할 수 있습니다.
다음 글에서는 Kubernetes에서 자동화 작업을 처리하는 Kubernetes Job 완벽 가이드! 일회성 Batch 작업과 Container 실행 관리 구조 이해하기를 알아보겠습니다.