Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #26] StatefulSet에서 Multi-AZ(다중 가용 영역) 배포 전략

ygtoken 2025. 3. 15. 11:21
728x90

 

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를 활용하여 트래픽을 분산할 수 있음

 

728x90