[kubernetes] 토폴로지 분배 제약 조건(topologySpreadConstraints)

vinca·2023년 12월 16일
0

☸️ kubernetes

목록 보기
29/35
post-thumbnail
post-custom-banner

Introduction

우리는 현재까지 파드를 분배하는 방법에서 노드 레이블에 따라서 배포하는 방법과 기준을 파드로 잡아서 파드의 레이블에 따라서 배포하는 방법 알아보았다.

이제 마지막으로 특별한 상황에서 완.벽.하.게 배포하는 방법인 토폴로지 분배 제약 조건(topologySpreadConstraints)에 대해서 알아보자.

토폴로지 분배 제약 조건

토폴로지 분배 제약 조건(Topology Spread Constraints)은 파드(Pod)들이 클러스터 내의 다양한 물리적 또는 논리적 위치균등하게 분포되도록 하는 기능이다.

예시를 보자. ap-northeast-2 즉 서울 지역의 데이터 센터 ab에 각각 노드가 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번 배포되는 모습)

IF 워커노드 3번에 부하가 있다면?

만약 워커노드 3번에 12개의 파드가 미리 배포가 되어있는 상황에서는 어떨까?

즉, topology.kubernetes.io/zone=ap-northeast-2a 지역의 노드 중 하나에 과부화가 있다면 어떻게 배포가 진행될까?

1a 지역의 워커노드 1, 2번2a 지역의 워커노드 4번에 균일하게 배포된 것을 확인할 수 있다.

정리

end..

이처럼 토폴로지 분배 제약 조건(Topology Spread Constraints)을 사용함으로써, Kubernetes에서의 특정 지역이나 구역에 고가용성을 높이고, 파드들을 균일하게 분배할 수 있다.

Reference

그림으로 배우는 쿠버네티스

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps
post-custom-banner

0개의 댓글