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를 달아야 함
출처
인프런 - 대세는 쿠버네티스
'네트워크 > k8s' 카테고리의 다른 글
[k8s] 24. Service - Headless, Endpoint, ExternalName (0) | 2021.02.18 |
---|---|
[k8s] 23. Pod - Node Scheduling - 실습 (0) | 2021.02.17 |
[k8s] 21. Pod - QoS Classes (0) | 2021.02.17 |
[k8s] 20. Pod - ReadinessProbe, LivenessProbe - 실습 (0) | 2021.02.17 |
[k8s] 19. Pod - ReadinessProbe, LivenessProbe (0) | 2021.02.17 |