우리는 현재까지 파드를 분배하는 방법에서 노드 레이블에 따라서 배포하는 방법과 기준을 파드로 잡아서 파드의 레이블에 따라서 배포하는 방법 알아보았다.
이제 마지막으로 특별한 상황에서 완.벽.하.게 배포하는 방법인 토폴로지 분배 제약 조건(topologySpreadConstraints)에 대해서 알아보자.
토폴로지 분배 제약 조건(Topology Spread Constraints)은 파드(Pod)들이 클러스터 내의 다양한 물리적 또는 논리적 위치에 균등하게 분포되도록 하는 기능이다.
예시를 보자. ap-northeast-2
즉 서울 지역의 데이터 센터 a
와 b
에 각각 노드가 2개씩 위치해 있다고 가정하자. 이를 토폴로지 도메인(Topology Domains)이라고 한다.
🗺토폴로지 도메인(Topology Domains)
파드가 분포될 수 있는 물리적 또는 논리적 영역을 의미한다.
(노드, 랙, 클라우드 제공업체의 데이터 센터 등)
이 경우 4개의 파드를 배포한다면, zone(a
, b
)에 각각 2개씩 배포하면 균등하게 배포되면 될 것이다.
각 노드에 레이블을 각각 추가해주도록 하자.
topology.kubernetes.io/region=ap-northeast-2
(둘 중 하나)
topology.kubernetes.io/zone=ap-northeast-2a
topology.kubernetes.io/zone=ap-northeast-2a
kubectl label node w1-k8s topology.kubernetes.io/region=ap-northeast-2 topology.kubernetes.io/zone=ap-northeast-2a
kubectl label node w2-k8s topology.kubernetes.io/region=ap-northeast-2 topology.kubernetes.io/zone=ap-northeast-2a
kubectl label node w3-k8s topology.kubernetes.io/region=ap-northeast-2 topology.kubernetes.io/zone=ap-northeast-2b
kubectl label node w4-k8s topology.kubernetes.io/region=ap-northeast-2 topology.kubernetes.io/zone=ap-northeast-2b
이를 통해 그림과 같이 topology.kubernetes.io 레이블이 추가되는 것을 확인할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: deploy-topologyspreadconstraints
name: deploy-topologyspreadconstraints
spec:
replicas: 4
selector:
matchLabels:
app: deploy-topologyspreadconstraints
template:
metadata:
labels:
app: deploy-topologyspreadconstraints
spec:
containers:
- image: nginx
name: nginx
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/region
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: deploy-topologyspreadconstraints
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: deploy-topologyspreadconstraints
입혔던 레이블을 바탕으로 토폴로지 제약조건(topologySpreadConstraints)을 걸어서 파드를 배포한다.
이에 관한 파라미터의 각 의미는 다음과 같다.
maxSkew
: 허용되는 최대 불균형으로 파드가 최대 1개 까지 불균형을 허용하는 것을 의미한다.topologyKey
: topology.kubernetes.io/region로 직접 레이블링 하였던 해당 레이블의 Key가 그대로 들어간다.whenUnsatisfiable
: DoNotSchedule로 제약 조건을 만족시킬 수 없는 경우 파드가 스케줄되지 않는다.labelSelector.matchLabels.app
:app: deploy-topologyspreadconstraints
레이블을 가진 파드에 이 제약 조건을 적용한다.
기존 워커노드에 배포되어 있는 상황을 바탕으로 워커노드가 분배되는 것을 확인할 수 있다.
(2번 노드에 net 파드가 배포되어있으므로 1번 노드에 2번 배포되는 모습)
만약 워커노드 3번에 12개의 파드가 미리 배포가 되어있는 상황에서는 어떨까?
즉, topology.kubernetes.io/zone=ap-northeast-2a
지역의 노드 중 하나에 과부화가 있다면 어떻게 배포가 진행될까?
1a
지역의 워커노드 1, 2번 및 2a
지역의 워커노드 4번에 균일하게 배포된 것을 확인할 수 있다.
end..
이처럼 토폴로지 분배 제약 조건(Topology Spread Constraints)을 사용함으로써, Kubernetes에서의 특정 지역이나 구역에 고가용성을 높이고, 파드들을 균일하게 분배할 수 있다.