1️⃣ 개요
StatefulSet을 운영하는 애플리케이션(데이터베이스, 메시지 브로커, 분산 스토리지 등)은 단일 가용 영역(Availability Zone, AZ) 장애 시에도 서비스가 지속적으로 운영될 수 있도록 Multi-AZ 환경에서 배포하는 것이 중요합니다.
이번 글에서는 StatefulSet을 Multi-AZ 환경에서 배포하는 전략과, 네트워크 및 스토리지 고려 사항을 포함한 실전 적용 방법을 정리하겠습니다. 🚀
2️⃣ StatefulSet에서 Multi-AZ 배포가 필요한 이유
📌 Multi-AZ 배포의 주요 필요성
이유 | 설명 |
가용성 향상 | 특정 AZ에서 장애 발생 시에도 다른 AZ에서 서비스 지속 |
데이터 손실 방지 | 여러 AZ에 데이터 복제하여 장애 발생 시 복구 가능 |
부하 분산 최적화 | 특정 AZ에만 부하가 집중되는 문제 방지 |
✅ Multi-AZ 배포를 활용하면, 클라우드 환경(AWS, GCP, Azure)에서 고가용성을 유지하면서 StatefulSet을 운영할 수 있습니다.
3️⃣ StatefulSet Multi-AZ 배포 전략
✅ 1. Node Affinity를 활용한 StatefulSet Multi-AZ 배포
📌 Kubernetes 노드에 AZ 정보를 라벨링
kubectl label nodes node-1 topology.kubernetes.io/zone=us-east-1a
kubectl label nodes node-2 topology.kubernetes.io/zone=us-east-1b
kubectl label nodes node-3 topology.kubernetes.io/zone=us-east-1c
📌 StatefulSet에서 특정 AZ로 Pod 배포
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
serviceName: redis
replicas: 3
template:
metadata:
labels:
app: redis
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: topology.kubernetes.io/zone
operator: In
values:
- us-east-1a
- us-east-1b
- us-east-1c
containers:
- name: redis
image: redis:latest
✅ 이제 StatefulSet Pod가 여러 AZ에 분산 배치됩니다.
✅ 2. Pod Anti-Affinity를 활용한 StatefulSet 노드 분산 배포
Pod Anti-Affinity를 사용하면 StatefulSet의 여러 Pod가 동일한 AZ에 몰리지 않도록 강제할 수 있습니다.
📌 Pod Anti-Affinity 설정 예제
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: redis
topologyKey: "topology.kubernetes.io/zone"
✅ 이제 동일한 AZ에 StatefulSet Pod가 몰리지 않도록 보장할 수 있습니다.
4️⃣ Multi-AZ 환경에서 StatefulSet 스토리지 관리 전략
✅ 1. AZ 간 데이터 복제 기능을 지원하는 스토리지 사용
일반적으로 Persistent Volume(PV)은 특정 AZ에 귀속되므로, Multi-AZ 배포 시 다음과 같은 방법을 고려해야 합니다.
📌 Multi-AZ에서 사용 가능한 스토리지 옵션
스토리지 유형 | 지원 여부 | 설명 |
AWS EBS | ❌ (AZ 제한) | PV가 특정 AZ에 귀속됨, AZ 장애 시 접근 불가 |
AWS EFS / FSx | ✅ (Multi-AZ 지원) | 여러 AZ에서 공유 가능한 PV 사용 가능 |
CephFS, Portworx | ✅ (Multi-AZ 지원) | 클러스터 내부에서 자동 데이터 복제 가능 |
✅ AWS 환경에서는 EBS 대신 EFS를 활용하면 StatefulSet의 PV를 여러 AZ에서 공유할 수 있습니다.
✅ 2. AWS EFS를 활용한 StatefulSet Multi-AZ 스토리지 구성
📌 EFS 기반 Persistent Volume 정의
apiVersion: v1
kind: PersistentVolume
metadata:
name: efs-pv
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteMany
nfs:
server: fs-12345678.efs.us-east-1.amazonaws.com
path: "/"
📌 Persistent Volume Claim (PVC) 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: efs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 20Gi
volumeName: efs-pv
📌 StatefulSet에서 EFS PVC 마운트
volumeClaimTemplates:
- metadata:
name: efs-data
spec:
accessModes: ["ReadWriteMany"]
storageClassName: ""
resources:
requests:
storage: 20Gi
✅ EFS를 사용하면 여러 AZ에서 동일한 데이터에 접근할 수 있습니다.
5️⃣ StatefulSet Multi-AZ 배포 시 네트워크 고려 사항
✅ 1. Multi-AZ 간 네트워크 레이턴시 최적화
AZ 간 데이터 동기화를 고려하여, 네트워크 설정을 최적화해야 합니다.
📌 멀티 클러스터 간 네트워크 최적화 방법
• AWS Transit Gateway 사용하여 AZ 간 네트워크 속도 개선
• Istio 등의 서비스 메시를 활용하여 트래픽 경로 최적화
• AZ 간 트래픽 비용이 발생할 수 있으므로, 필수 데이터만 전송하도록 설정
✅ 멀티 AZ 환경에서는 네트워크 비용과 레이턴시를 고려해야 합니다.
✅ 2. StatefulSet Multi-AZ 네트워크 트래픽 분산 설정
📌 Multi-AZ 환경에서 ExternalDNS 활용하여 트래픽 분산
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: redis-ingress
annotations:
external-dns.alpha.kubernetes.io/hostname: redis.example.com
spec:
rules:
- host: redis.example.com
http:
paths:
- path: /
backend:
service:
name: redis
port:
number: 6379
✅ 이제 여러 AZ에 배포된 StatefulSet이 동일한 도메인을 통해 트래픽을 수신할 수 있습니다.
🔥 6️⃣ 결론
✔ StatefulSet을 Multi-AZ 환경에서 배포하면 가용성이 향상됨
✔ Node Affinity 및 Pod Anti-Affinity를 활용하여 StatefulSet을 여러 AZ에 분산 배치 가능
✔ AWS EFS, CephFS 등의 Multi-AZ 스토리지를 활용하면 PV를 여러 AZ에서 공유할 수 있음
✔ AZ 간 네트워크 레이턴시를 최적화하고, ExternalDNS를 활용하여 트래픽을 분산할 수 있음