Node Schedule

2023. 2. 8. 12:30· Kubernetes
목차
  1. 1. 직접 선택하여 할당
  2. 2. 스케쥴러가 판단하여 할당
  3. Scheduling 방식
  4. Node 선택
  5. NodeAffinity
  6. Pod간 집중/분산
  7. Node에 할당 제한
반응형

1. 직접 선택하여 할당

Node 생성 시 Label을 등록하고 Pod에 해당 node의 label을 작성

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  nodeSelector:
    hostname: node1
  containers:
  - name: container
    image: kube/something

2. 스케쥴러가 판단하여 할당

현재 node들의 남은 자원을 기준으로 판단하여 적절한 Node에 배치

node1의 잉여 메모리: 1Gi
node2의 잉여 메모리: 4Gi
새로운 Pod의 필요 메모리: 2Gi
→ 스케쥴러가 node2에 pod를 배치함

 

pod 안에 있는 app에 부하가 생길 때 node의 자원을 무한정 사용하려 할 경우 해당 Node의 다른 pod들도 함께 죽을 수 있음

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  containers:
  - name: container
    image: kube/something
    resources:
      requests:
        memoty: 2Gi
      limits:
        memory: 3Gi

limits

  • Memory: 초과시 pod 종료
  • Cpu: 초과시 request로 낮춤, Over시 종료되지 않음

Scheduling 방식

Node 선택

NodeName

  • node의 이름을 선택하여 배포
  • node의 이름은 변경되므로 비추천되는 방식

NodeSelector

  • node의 label을 선택하여 배포
  • 일치하는 label의 node가 2개 이상일 경우 스케쥴러가 판단하여 더 자원이 많은 node에 배포
  • key, value가 모두 일치해야 배포하고, 하나라도 다를 경우 배포 실패되는 단점

NodeAffinity

  • Node의 label의 key를 선택하여 배포
  • 일치하는 Key의 node 중 스케쥴러가 판단하여 더 자원이 많은 node에 배포
  • 일치하는 Key가 없을 경우 스케쥴러가 판단하여 전체 node 중 가장 자원이 많은 곳에 배포

NodeAffinity 옵션

  • matchExpressions : 조건을 만족하는 label을 가진 node에 배포
    • Exists
    • DoesNotExist
    • In
    • NotIn
    • Gt
    • Lt
  • required : 지정한 Key와 동일한 node가 없을 경우 배포 x
apiVersion: v1
 kind: Pod
 metadata:
   name: pod-match-expressions1
 spec:
   affinity:
     nodeAffinity:
       requiredDuringSchedulingIgnoredDuringExecution:
         nodeSelectorTerms:
         - matchExpressions:
           - {key: kr, operator: Exists}
   containers:
   - name: container
     image: something

 

  • preferred : 지정한 Key와 동일한 node가 없을 경우에도 스케쥴러가 배포

apiVersion: v1
 kind: Pod
 metadata:
   name: pod-match-expressions1
 spec:
   affinity:
     nodeAffinity:
       preferredDuringSchedulingIgnoredDuringExecution:
         - weight: 1
           preference:
             matchExpressions:
             - {key: kr, operator: Exists}
   containers:
   - name: container
     image: something

 

  • preferred weight : 지정한 Key와 동일한 node가 다수일 경우 가중치를 줄 점수

 

Pod간 집중/분산

Pod Affinity

  • 다수의 Pod가 동일한 node에 배포되어야 할 때 사용
  • podAffinity.matchExpressions 에 찾을 Pod의 key와 expressions를 명시
  • podAffinity를 가진 Pod이 대상 Pod보다 먼저 배포가 되면 Pending 상태로 대상 Pod의 배포를 기다림
  • topologyKey 에 해당하는 node에서만 Pod을 찾음
예시) 같은 hostpath를 사용하는 다수의 Pod이 있을 경우
apiVersion: v1
 kind: Pod
 metadata:
   name: server1
 spec:
   affinity:
     podAffinity:
       requiredDuringSchedulingIgnoredDuringExecution:
       - topologyKey: a-team
         labelSelector:
           matchExpressions:
           - {key: type, operator: In, values: [web1]}
   containers:
   - name: container
     image: something

Anti Affinity

  • 다수의 Pod가 서로 다른 node에 배포되어야 할 때 사용
  • podAntiAffinity.matchExpressions 에 찾을 Pod의 key와 expressions를 명시→ 해당 node에 배포 X
  • topologyKey 에 해당하는 node에서만 Pod을 찾음
  • 예시: master, slave 관계인 Pod의 경우
    apiVersion: v1
     kind: Pod
     metadata:
       name: slave
     spec:
       affinity:
         podAntiAffinity:
           requiredDuringSchedulingIgnoredDuringExecution:
           - topologyKey: a-team
             labelSelector:
               matchExpressions:
               - {key: type, operator: In, values: [master]}
       containers:
       - name: container
         image: something

Node에 할당 제한

Toleration / Taint

  • 특정 Node에는 특정 Pod만 배포하고 싶을 경우 사용
  • Taint 설정이 되어 있는 Node에는 Toleration을 달고 있는 Pod만 배포 가능
  • 주의사항
    • Toleration이 있는 Pod도 Taint node가 아닌 다른 node에 배포될 수 있으므로 nodeSelector 옵션으로 Taint node를 선택해주어야 한다.
    • Node에 Taint가 설정돼도 기존에 있던 Pod들은 영향을 받지 않음 → NoExecute로 종료 가능
  • 옵션
    • effect
      • NoSchedule: Taint와 Toleration이 매핑되어야만 배포 가능
      • PreferNoSchedule: 배포 가능한 다른 Node가 없을 경우 Taint가 있는 Node에도 배포 가능
      • NoExecute: 기존에 있던 Pod들도 node의 Taint와 매핑되지 않으면 종료
        • Pod의 Toleration.tolerationSec , Toleration.effect: NoExecute 가 설정되어 있다면 Node에 NoExecute가 걸려도 tolerationSec 이후에 종료
    • operator
      • Equal
      • Exists
$ kubectl taint nodes node1 hw=gpu;NoSchedule
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-toleration
spec:
  nodeSelector:
    gpu: no1
  tolerations:
  - effect: NoSchedule
    key: hw
    operator: Equal
    value: gpu
  containers:
  - name: container
    image: something
반응형

'Kubernetes' 카테고리의 다른 글

Volume  (0) 2023.02.08
Service  (0) 2023.02.08
Pod  (0) 2023.02.08
QoS Classes (Quality of Service)  (0) 2023.02.08
Pod Life Cycle  (0) 2023.02.08
  1. 1. 직접 선택하여 할당
  2. 2. 스케쥴러가 판단하여 할당
  3. Scheduling 방식
  4. Node 선택
  5. NodeAffinity
  6. Pod간 집중/분산
  7. Node에 할당 제한
'Kubernetes' 카테고리의 다른 글
  • Service
  • Pod
  • QoS Classes (Quality of Service)
  • Pod Life Cycle
dongb
dongb
Actions lead thoughts.
dongb
Now or Never
dongb
전체
오늘
어제
  • 분류 전체보기 (87)
    • Kotlin (23)
    • Spring (24)
    • Java (5)
    • Istio (7)
    • Kubernetes (19)
    • CICD (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ChatGPT
  • 네트워크
  • configmap
  • spring data jpa
  • volume
  • Service
  • GPT-4
  • oauth2.0
  • Test
  • java
  • Database
  • POD
  • Kotlin
  • skaffold
  • GPT
  • kubernetes
  • 챗GPT

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
dongb
Node Schedule
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.