티스토리 뷰
* 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
'쿠버네티스' 카테고리의 다른 글
CKA 기출문제 정리 HPA (0) | 2025.01.01 |
---|---|
CKA 기출 문제 정리 Multi-container Pods (0) | 2025.01.01 |
CKA 기출개념 정리 Job (0) | 2025.01.01 |
CKA 기출개념 파드: 특정 노드에서만 생성하기 (1) | 2025.01.01 |
CKA 기출개념 정리 리소스 제한 (1) | 2024.12.31 |