StatefulSet 복제본 분산 배치 점검

같은 장애 영역에 복제본이 집중되지 않도록 배치 정책을 확인하세요.

설명

StatefulSet 복제본이 같은 노드에 모이면 한 노드 장애가 여러 Pod에 동시에 영향을 줄 수 있습니다. Pod 안티어피니티나 토폴로지 분산 제약으로 배치를 제어할 수 있으며, 선택자가 실제 Pod 라벨과 맞아야 합니다.

required 규칙은 배치 조건을 강제하고 preferred 규칙은 우선순위로 작용합니다. 호스트 단위 분산만으로 영역 장애나 애플리케이션의 복제 정족수까지 보호되지는 않습니다.

잠재적 영향

  • 한 노드 장애로 여러 복제본이 함께 중단될 수 있습니다.
  • 너무 엄격한 분산 조건에 맞는 노드가 부족하면 Pod가 Pending 상태로 남을 수 있습니다.

해결 방법

  • 워크로드의 장애·정족수 요구에 맞춰 podAntiAffinity나 토폴로지 분산 제약을 구성하세요. 실제 Pod 라벨과 topologyKey를 확인하세요.
  • 강제 규칙에 필요한 노드 수, 용량과 스토리지 배치 제약을 확인하고 실제 배치를 시험하세요. IgnoredDuringExecution 규칙은 이미 실행 중인 Pod를 자동으로 옮기지 않습니다.

예시

기존 ZooKeeper 이미지로 배치 규칙만 비교합니다. 실제 운영에는 지원되는 이미지를 선택하고 zk-hs Headless Service를 별도로 준비하세요. 변경 후에는 조건을 만족하는 서로 다른 노드가 최소 3개 필요합니다.

변경 전

yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  serviceName: zk-hs
  replicas: 3
  selector:
    matchLabels:
      app: zk
  template:
    metadata:
      labels:
        app: zk
    spec:
      containers:
        - name: zookeeper
          image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10

세 복제본을 정의하지만 이 발췌에는 분산 규칙이 없습니다. 실제 배치와 다른 정책을 확인해야 합니다.

변경 후

yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: zk
spec:
  serviceName: zk-hs
  replicas: 3
  selector:
    matchLabels:
      app: zk
  template:
    metadata:
      labels:
        app: zk
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: zk
              topologyKey: kubernetes.io/hostname
      containers:
        - name: zookeeper
          image: k8s.gcr.io/kubernetes-zookeeper:1.0-3.4.10

app: zk Pod가 같은 호스트에 배치되지 않도록 강제합니다. 조건에 맞는 노드가 부족하면 모든 복제본이 실행되지 못할 수 있습니다.

참조