DevOps/Kubernetes

[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter12. 파드 스케줄링

noahkim_ 2021. 7. 21. 23:06

12. 1 노드 셀렉터

 

파드가 클러스터 안 어떤 노드에서 실행될 지를 키-값 쌍으로 결정함.

 

노드에서도 레이블 설정이 가능한데 보통 노드의 환경(os, arch 등)을 적어둠.

 

  • 노드에 레이블 추가

    ‘ kubectl label nodes “노드이름” 레이블키=레이블값 ’
  • 파드에 노드셀렉터 설정

 

spec.nodeSelector 에 키값을 설정함

-> 해당 레이블을 가진 노드에 실행될 것임을 설정할 있음.

 

12.2 어피니티와 안티 어피니티

 

  1. 노드 어피니티

 

노드셀렉터와 비슷하게 노드의 레이블 기반으로 파드를 스케줄링함.

 

 

  • spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution : 스케줄링하는 동안 꼭 필요한 조건

    .nodeSelectorTerms[].matchExpressions[]
      .key : 노드 레이블 키
      .operator : 키가 만족할 조건
        In : values[]에 설정한 값중 레이블과 일치하는게 하나라도 있으면 됨
        NotIn : 값이 모두 맞는지 확인
        Exists : 키를 노드가 가지면 됨   
  • spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution : 스케줄링하는 동안 만족하면 좋은 조건

 

    2. 파드의 어피니티와 안티 어피니티

 

  • 어피니티

디플로이먼트나 스테이트풀세트로 파드를 배포했을 때 파드 사이의 관계를 정의함.

 

서로 자주 통신하는 파드들을 같은 노드에 배치하도록 하여 효율을 높임

 

.spec.template.spec.affinity

 .podAffinity : 해당 레이블 키-값에 해당하는 노드에 배치함

.topology : 파드에 노드를 배치할 때 사용할 기준을 설정함

                   어피니티 혹은 안티어피니티의 기준을 만족할 시, topology에 설정된 기준으로 다른 노드에 파드를 실행함.

 

  • 안티 어피니티

하드웨어 자원을 많이 사용하는 앱 컨테이너가 있을 때 여러 노드로 파드를 분산함

 

.spec.template.spec.affinity 

 .podAntiAffinity : 해당 레이블 -값에 해당하는 노드에 배치를 피함 -> 파드 2개이상 같은 노드에 속하지 못함

 

12.3 테인트와 톨러레이션 사용하기

 

테인트를 설정한 노드에는 파드들을 스케줄링 하지 않음.

 

테인트를 설정한 노드에 파드들을 스케줄링하려면 톨러레이션을 설정해야함.

 

-> 노드를 특정 역할만 하도록 만들 떄 사용함

 

‘ Kubectl taint nodes “노드이름” 키=값:효과 ‘  : 테인트 설정

‘ Kubectl taint nodes “노드이름” 키=값:효과- ‘  : 테인트 해제

 

  • 테인트가 설정된 노드에 파드를 실행시키기 위해 톨러레이션 설정하기

 

.spec.template.spec.tolerations[] : 테인트가 설정된 노드의 키-값을 적어 배치되도록 함

 

  1. 테인트와 톨러레이션의 하위 필드

.spec.template.spec.tolerations[].effect : 효과 

 

 .NoSchedule : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음.

 .PreferNoSchedule : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음. 단, 클러스터 안 자원이 부족하면 테인트를 설정한 노드에도 스케줄링 가능.

 .NoExecute : 톨러레이션 설정이 없으면 파드를 스케줄링 하지 않음. 기존 파드도 톨러레이션 설정이 없으면 종료시킴

 

.spec.template.spec.tolerations[].operator :

 .Exists : 앞 세가지 필드를 선별해서 사용함. 만약 .key값만으로 톨러레이션 설정시 파드의 key값만 비교하여 같을 시 스케줄링함.

 .Equal : .key, .value, .effect값이 원하는 테인트의 설정값과 모두 같은지 확인

 

12.4 클러스터를 관리하는 커든과 드레인

 

특정 노드에 있는 파드들을 모두 다른 노드로 옮기거나 특정 노드에 파드들을 스케줄링 하지 않도록 제한할 수 있음

 

  1. 커든 설정하기

‘ Kubectl cordon “’노드이름” ‘ : 지정된 노드에 추가로 파드를 스케줄링해서 실행하지 않도록 함.

해당 노드에 커든 설정 시, Status에 SchedulingDisabled 가 추가됨

 

‘ Kubectl uncordon “노드이름” ‘ : 노드에 정상적으로 파드를 스케줄링하기
새로 생성된 파드가 노드에 배치됨. (이전에 설치된 것들은 자동이동이 안됨)

 

 

  2. 드레인 설정하기

 

지정된 노드에 있는 파드들을 다른 노드로 이동시키기

‘ Kubectl drain “노드이름” ‘ 

( 데몬세트로 실행한 파드들은 드레인 설정을 할 수 없음. 데몬세트가 즉시 재실행시키기 때문. —ignore-daemonsets=true 옵션과 함께 명령 실행함)

( 컨트롤러로 생성되지 않은 파드들은 —force 명령으로 drain명령을 실행시킴. 강제로 삭제시 파드는 사라짐. )

( 스태틱파드는 kubelet이 kube-apiserver 컴포넌트로 실행하지 않았으므로 삭제되지 않음. 드레인 설정을 적용시 그레이스풀하게 종료됨 )

 

먼저 새로운 파드를 노드에 스케줄링해서 실행하지 않도록 설정함.

 

  • Annotation
    - Kubernetes.io/config.source
    : file
       config.source가 file에서 실행되었음

    - Kubernetes.io/config.mirror : “해시값”
       config.mirror의 해시값을 확인할 수 있음.

‘ Kubectl uncordon “노드이름” ‘ : 드레인 설정 해제 (커든 해제 명령과 같음)