티스토리 뷰

* Topology Spread Constraint: Pod를 클러스터 내에서 균등하게 분산시키거나 특정 조건에 따라 배치하도록 제어하는 데 사용.  

1. 문제#1 Pod를 Zone간 균등 분산 

1)문제 시나리오

(1) 노드 레이블 설정 

- 클러스터의 각 노드에 topology.kubernetes.io/zone 레이블을 추가합니다.

- node-a: zone-a, node-b:zone-b,node-c: zone-c

(2) Deployment 생성 

- 이름: 'spread-deployment'  

- 6개의 replica

- 각 Zone('topology.kubernetes.io/zone')에 Pod가 균등하게 배치되도록 설정 

- Pod간의 Zone각 차이(maxSkew)는 최대 1로 설정 

2)해결과정 

(1)노드 레이블 추가

kubectl label nodes node-a topology.kubernetes.io/zone=zone-a
kubectl label nodes node-b topology.kubernetes.io/zone=zone-b
kubectl label nodes node-c topology.kubernetes.io/zone=zone-c

(2) Deployment YAML 작성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spread-deployment
spec:
  replicas: 6
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app: my-app
      containers:
      - name: nginx
        image: nginx

(3) Deployment 생성 

kubectl apply -f spread-deployment.yaml

(4) 결과 확인

kubectl get pods -o wide --selector=app=my-app

NAME                     READY   STATUS    NODE     ZONE
spread-deployment-1      1/1     Running   node-a   zone-a
spread-deployment-2      1/1     Running   node-a   zone-a
spread-deployment-3      1/1     Running   node-b   zone-b
spread-deployment-4      1/1     Running   node-b   zone-b
spread-deployment-5      1/1     Running   node-c   zone-c
spread-deployment-6      1/1     Running   node-c   zone-c

3) topologySpreadConstraints

topologySpreadConstraints:
- maxSkew: 1
  topologyKey: topology.kubernetes.io/zone
  whenUnsatisfiable: DoNotSchedule
  labelSelector:
    matchLabels:
      app: my-app

(1) topologySpreadConstraints: Pod를 클러스터 내에서 균등하게 분산시키는데 사용되는 설정으로 특정 조건(Zone,Hostname)을 기준으로 Pod가 특정 노드 그룹에 균등하게 배치되도록 제어

(2) maxSkew

- Pod간의 뷸균형 허용치를 정의

- 동일한 Topology Domain간의 Pod수 차이가 최대 maxSkew 값 이하가 되도록 보장 

- 'maxSkew: 1' : 각 Zone간의 POd수 차이가 최대 1이어야 한다. 

(3) topologyKey

- Pod를 분산시킬 기준이 되는 노드레이블의 키를 지정 

- 이 키는 노드에 설정된 레이블을 참조하며, Topology Domain을 정의

(4) whenUnsatisfiable

- Pod를 균등하게 분산시킬 수 없는 경우의 동작을 정의

- DoNotSchedule: 조건을 만족하지 못하면 POd르 스케줄링하지 않음, Pending 상태로 남음 

- ScheduleAnyway: 조건을 만족하지 못해도 Pod를 스케줄링하며 불균형 상태가 발생할 수 있음 

(5) labelSelector

- 분산 대상이 되는 Pod를 선택하기 위한 레이블 셀렉터

- 이 필드에 지정된 레이블(matchLabels)을 가진 Pod만 Topology Spread Constraints에 포함 

(6) 동작과정

- 스케줄러는 클러스터 내 노드를 탐색하여, 각 노드가 속한 Topology Domain 을 확인 

- 현재 실행 중인 Pod수와 새로 배치할 Pod 수를 계산하여, 각 Topology Domian 간 차이가 maxSkew이하기 되도록 배치 

- 만약 조건을 만족할 수 없다면 whenUnsatisfiable 값에 따라 동작 




2. 문제#2 특정 노드를 제외하고 균등 분산 

1) 문제 시나리오

- Pod간 노드간에 균등하게 분산되도록 설정해야 하지만, 특정 노드는 리소스 부족으로 인해 스케줄링 대상에서 제외

(1) 노드 레이블 설정

- 클러스터의 각 노드에 topology.kubernetes.io/zone 레이블을 추가합니다.

- node-a: zone-a, node-b:zone-b,node-c: zone-c

(2) Deployment 생성 

- 이름: 'exclude-node-deployment'  

- 4개의 replica

- 각 노드('topology.kubernetes.io/hostname')에 Pod가 균등하게 배치되도록 설정 

- 특정 노드(node-c)에는 Pod가 배치되지 않도록 설정

2) 문제 해결 과정 

(1) 노드 레이블 추가

kubectl label nodes node-a topology.kubernetes.io/hostname=node-a
kubectl label nodes node-b topology.kubernetes.io/hostname=node-b
kubectl label nodes node-c topology.kubernetes.io/hostname=node-c

(2) YAML 작성 

#exclude-node-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: exclude-node-deployment
spec:
  replicas: 4
  selector:
    matchLabels:
      app: exclude-app
  template:
    metadata:
      labels:
        app: exclude-app
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: topology.kubernetes.io/hostname
                operator: NotIn # 특정 노드를 제외함.
                values:
                - node-c # 제외할 노드.
      topologySpreadConstraints:
      - maxSkew: 1 # 균등 분산 설정.
        topologyKey: topology.kubernetes.io/hostname # Hostname 기준 분산.
        whenUnsatisfiable: DoNotSchedule # 조건 만족 불가 시 스케줄링하지 않음.
        labelSelector:
          matchLabels:
            app: exclude-app # 동일한 앱 기준으로 분산.
      containers:
      - name: nginx
        image: nginx

- nodeAffinity로 특정노드를 제외함

(3) Deployment 생성

kubectl apply -f exclude-node-deployment.yaml

(4) 결과 확인

kubectl get pods -o wide --selector=app=exclude-app

NAME                          READY   STATUS    NODE     HOSTNAME 
exclude-node-deployment-1     1/1     Running   node-a   hostname=node-a 
exclude-node-deployment-2     1/1     Running   node-a   hostname=node-a 
exclude-node-deployment-3     1/1     Running   node-b   hostname=node-b 
exclude-node-deployment-4     1/1     Running   node-b   hostname=node-b
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함