본문 바로가기
네트워크/k8s

[k8s] 22. Pod - Node Scheduling

by Lauren X Ming 2021. 2. 17.

Node Scheduling

  • 파드는 기본적으로 스캐줄러에 의해서 노드에 할당하지만, 사용자나 운영자가 직접 스캐줄할 수 있음

1. NodeName, NodeSelector, NodeAffinity --> Node 선택

  • 파드를 특정 노드에 할당되도록 선택하기 위해 사용
  • 노드들이 있고, 노드마다 가용한 CPU와 라벨이 있음
  • 노드1-3은 한국에 있고, 4-5는 미국에 있음
  • 이 때, 파드를 만들면 스캐줄러는 CPU 자원이 많은 노드1에 할당
  • NodeName: 스캐줄러와 상관없이 해당 노드의 이름으로 파드가 할당
    • 실제로 잘 사용 안 함
  • NodeSelector: 파드의 키와 벨류를 달면, 해당 라벨이 달린 노드에 할당됨
    • 여러 노드에 같은 키와 벨류를 가진 라벨이 있을 수 있어, 스캐줄러에 의해서 라벨이 달린 노드들 중 자원이 많은 노드에 할당됨
    • 키와 벨류가 매칭이 되는 노드에만 할당이 되고, 매칭이 되는 라벨이 없으면 파드는 어느 노드에도 할당이 되지 않음
  • NodeAffinity: 파드에 키만 설정을 해도, 해당 그룹 중에 스캐줄러를 통해서 자원이 많은 노드에 할당
    • 만약 해당 조건에 맞지 않은 키를 가지고 있어도, 스캐줄러가 판단을 해서 자원이 많은 노드에 할당되도록 옵션을 줄 수 있음

2. Pod Affinity, Pod Anti-Affinity --> Pod간 집중/분산

  • 여러 파드들을 한 노드에 집중해서 할당하거나 파드들간의 겹치는 노드없이 분산해서 할당

Pod Affinity

  • 웹과 서버가 있는데, 두 파드가 한 PV에 연결되고, 이 PV가 hostPath를 쓴다고 하면 두 파드는 같은 노드상에 있어야 함
    • 즉, 한 노드에 집중해서 할당해야 함
  • 두 파드를 같은 노드에 할당하려면 Pod Affinity를 사용해야 함
    • 처음 웹 파드가 스캐줄러에 의해서 한 노드에 할당되면 그 hostPath에 PV가 생김
    • 서버 파드가 웹 파드에 있는 노드에 들어가게 하려면, 파드를 만들 때, Pod Affinity 속성을 넣고 웹에 있는 라벨을 지정

Pod Anti-Affinity

  • 마스터가 죽으면 슬레이브가 백업을 해야해서 같은 노드로 들어가면 안 됨
  • 마스터가 스캐줄러에 의해서 한 노드에 들어가고, 슬레이브 파드를 만들 때, Anti-Affinity를 설정하여 마스터와 다른 노드에 할당

3. Toleration / Taint

  • 특정 노드에는 아무 파드나 할당되지 않도록 제한하기 위해 사용
  • 노드5는 높은 사양의 앱을 돌리는 용도로 Taint를 설정하여 파드에 Toleration을 단 것만 할당되게 함
    • 그냥 파드, Node5 라벨을 단 파드 전부 노드5에 할당되지 않음

NodeAffinity, Pod Affinity, Pod Anti-Affinity, Toleration/Taint

Node Affinity

matchExpressions

  • 여러 조합으로 파드들을 선택
  • operator는 ReplicaSet에서 봤던 것과 동일
  • Gt와 Lt가 추가됨

required vs preferred

  • required 속성을 가진 파드가 노드에 없는 키를 가지고 있으면 노드에 스캐줄링되지 않음
  • preferred 속성을 가진 파드는 키를 선호하는 것이지, 해당 키가 없더라도 노드에 할당됨

preferred weight

  • 키가 다른 라벨을 가진 두 노드가 있고 CPU가 50, 30임
  • preferred 속성을 가진 파드가 있는데, 두 노드의 키가 모두 있어, 두 노드 중 CPU가 많은 노드1에 할당될 것
  • 그런데 weight 옵션이 있으면, 그림과 같이 점수가 대략적으로 합산돼서 스캐줄러에 영향을 줌

Pod Affinity

  • 노드4개가 있음
  • 2개는 a-team, 나머지 2개는 b-team
  • type:web인 웹 파드가 노드1에 할당되었고, 서버 파드가 같은 노드에 할당받고 싶은 상황
  • 서버 파드의 matchExpressions에 키와 벨류를 웹 파드의 라벨에 맞게 설정하면 그 노드에 할당됨
  • 이 때, topologyKey의 값에 한정된 노드만 봄
  • 만약 서버 파드의 topologyKey가 a-team이고 웹 파드가 노드3에 할당되었으면 pending

Pod Anti-Affinity

  • 마스터 파드가 노드4에 할당되었을 때, 슬레이브 파드는 노드4에 할당되기 싫은 상황
  • matchExpressions에 마스터 파드의 라벨을 달면 그 노드에 할당되지 않음
  • topologyKey를 주면, 그 키를 가진 노드로 범위를 한정

Taint, Toleration

  • 노드들이 있고, 노드1은 타노드들과 달리 GPU가 있음
  • 일반적인 파드들이 노드1에 스캐줄되지 않게 하려면 Taint를 노드1에 달아줌
  • Taint에는 Taint를 식별하는 라벨인 키와 벨류가 있고, effect라는 옵션이 있음
  • effect에 NoSchedule을 주면 타파드들이 이 노드에 할당되지 않음
    • NoSchedule은 마스터노드에 기본적으로 달려 있음
  • effect에 PreferNoSchedule도 있는데, 파드들이 할당될 노드가 없으면 마지못해 할당해줌
  • effect에 NoExecute도 있는데, 파드1이 노드2에 할당되어서 운영된다고 하자
    • 이 상태에서 갑자기 노드2에 NoSchedule을 단 Taint가 노드2에 생긴다면?
    • 이미 파드가 노드2에 할당되어 있기 때문에 파드1이 삭제되진 않음
    • 그런데 NoExecute를 달았다면 이런 상황에서 삭제가 됨 --> Pod2 상황
    • NoExecute를 노드에 설정했을 때, 파드가 삭제되지 않으려면 effect: NoExecute를 설정한 Toleration을 파드에 달아야 함
    • TolerationSeconds: 해당 시간 후에 삭제됨, 만약 이게 없으면 삭제는 안 됨
    • 노드에서 장애가 발생하면 파드를 삭제하고 재생성해야 하니, ReplicaSet을 통해서 운영한다면, 쿠버네티스가 자체적으로 장애가 발생한 노드에 NoExecute를 담
  • 만약 GPU를 사용해야할 파드라면, 파드에 Toleration을 줌
  • Toleration에는 key, operator, value, effect가 있는데 이 조건이 Taint의 라벨과 맞아야 함
  • operator에는 Equal과 Exists가 있음
  • 모두 매칭이 되어야 노드에 할당되고, 하나라도 틀리면 할당되지 않음
  • Toleration을 단 파드가 Taint가 있는 노드에 무조건 스캐줄되는게 아니라 다른 노드에도 스케줄 될 수 있음
  • Toleration을 단 파드가 Taint가 있는 노드에 스케줄 되려면 nodeSelector를 달아야 함

출처

인프런 - 대세는 쿠버네티스