콘텐츠로 이동

✅ AKS에서 Pod 분산 예제

AKS에서 Pod affinity와 anti-affinity로 워크로드를 분산하는 예제를 설명합니다.

PodAntiAffinity + TopologySpreadConstraints + HPA 예시


📌 Deployment YAML (PodAntiAffinity + SpreadConstraints)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 4
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - my-app
                topologyKey: "kubernetes.io/hostname"
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: "kubernetes.io/hostname"
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: my-app
      containers:
        - name: my-app
          image: myregistry.azurecr.io/my-app:latest
          resources:
            requests:
              cpu: "250m"
              memory: "256Mi"
            limits:
              cpu: "500m"
              memory: "512Mi"

✅ HPA YAML

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 4
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60

🔍 핵심 포인트

  • PodAntiAffinity: 동일 앱의 Pod가 같은 노드에 몰리지 않도록 설정.
  • TopologySpreadConstraints: Pod를 노드 단위로 균등하게 분산.
  • ScheduleAnyway 옵션으로 스케줄링 실패 방지.
  • 라벨(app: my-app)은 Deployment와 Constraints 모두 동일하게 유지.
  • AZ 기반 분산: topologyKey: topology.kubernetes.io/zone로 변경 가능.
  • HPA와 함께 사용 시 Cluster Autoscaler 활성화 권장.

📚 참고 링크


참고 문서