반응형
  • cordon
    • 지정한 노드에 Pod 를 스케줄링 하지 않는다.
  • taint
    • 지정한 노드에 Pod를 스케줄링 하지 않지만 tolerations 설정을 통해 스케줄링이 가능하다.

 

728x90
반응형
반응형

파드 스케줄링

파드를 만들때 어떤 노드에서 실행할지 다양한 옵션으로 선택할 수 있다.

NodeSelector(노드 셀렉터)

  • 설정
    spec:
      containers:
      nodeSelector:
        key: value

Node Affinity

  • 노드 레이블을 기반으로 파드를 스케줄링 한다.
  • 노드 셀렉터를 함께 설정할 경우 둘다 만족하는 노드에 스케줄링된다.
  • requiredDuringSchedulingIgnoredDuringExecution : 스케줄링 하는동안 꼭 필요한 조건
  • preferredDuringSchedulingIgnoredDuringExecution : 만족하면 좋은 조건. (필수아님)
  • 스케줄링 하는 동안 조건이 변경되더라도 무시한다.
  • 설정
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: beta.kubernetes.io/os
                operator: In
                values:
                - linux
                - window
              - key: disktype
                operator: Exists
          preferredDuringSchedulingIgnoredDuringExecution  
          - weight: 10
            preference:
              matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - worker-node01
    • operators : In, NotIn, Exists, DoesNotExist, Gt(Greater than), Lt(Lower than)

Pod affinity, antiAffinity

  • affinity: 서로 연관성이 있는 Pod 를 같은 노드에 배치
  • antiAffinity: 자원을 많이 차지 하는 Pod 를 서로 다른 노드에 배치
  • 설정
    spec:
        affinity:
          podAntiAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - store
              topologyKey: "kubernetes.io/hostname"
    • app 필드 값이 store 인 노드는 피해서 스케줄링 한다.
    • topologyKey : affinity 를 만족하면 topologyKey 기준으로 같은 노드에 pod 를 실행하고 anitiAffinity를 만족하면 topologyKey 기준으로 다른 노드에 pod 를 실행한다.

taint, toleration

  • 테인트를 설정한 노드는 스케줄링 하지 않는다.
  • 테인트를 설정한 노드에 스케줄링 하려면 톨러레이션을 설정해야 한다.
  • kubectl taint nodes 노드명 key01=value01:NoSchedule (key=value:효과)
  • kubectl taint nodes 노드명 key01=value01:NoSchedule- (테인트 제거)
  • 톨러레이션
    spec:
      tolerations:
      - key: "key01"
        operator: "Equal"
        value: "value01"
        effect: "NoSchedule"
    • effect
      • NoSchedule : 톨러레이션 설정 없으면 스케줄링 안함.
      • PreferNoSchedule : 스케줄링 안하지만 자원 부족하면 할수도 있음
      • NoExecute : 스케줄링 안하며 기존 파드도 설정이 없는경우 종료시킴

cordon, drain

  • cordon
    • 지정한 노드에 추가로 파드를 스케줄링 하지 않는다.
    • kubectl cordon 노드명
      master01@master01-VirtualBox:~$ kubectl get nodes
      NAME                  STATUS     ROLES    AGE   VERSION
      master01-virtualbox   Ready      master   79d   v1.19.2
      worker01-virtualbox   Ready      <none>   79d   v1.19.2
      worker02-virtualbox   NotReady   <none>   79d   v1.19.2
      master01@master01-VirtualBox:~$ kubectl cordon worker01-virtualbox
      node/worker01-virtualbox cordoned
      master01@master01-VirtualBox:~$ kubectl get nodes
      NAME                  STATUS                     ROLES    AGE   VERSION
      master01-virtualbox   Ready                      master   79d   v1.19.2
      worker01-virtualbox   Ready,SchedulingDisabled   <none>   79d   v1.19.2
      worker02-virtualbox   NotReady                   <none>   79d   v1.19.2
      master01@master01-VirtualBox:~$ kubectl uncordon worker01-virtualbox
      node/worker01-virtualbox uncordoned
      master01@master01-VirtualBox:~$ kubectl get nodes
      NAME                  STATUS     ROLES    AGE   VERSION
      master01-virtualbox   Ready      master   79d   v1.19.2
      worker01-virtualbox   Ready      <none>   79d   v1.19.2
      worker02-virtualbox   NotReady   <none>   79d   v1.19.2
  • drain
    • 지정된 노드에 있는 파드를 다른 노드로 옮긴다.
    • 노드에 데몬셋이 존재할 경우 적용 불가능
    • 데몬셋 무시하고 적용할 경우 --ignore-daemonsets=true 옵션 추가
    • 컨트롤러를 이용하지 않은 파드들도 drain 불가능

출처 : 쿠버네티스 입문 - 90가지 예제로 배우는 컨테이너 관리자 자동화 표준 (동양북스)

728x90
반응형

+ Recent posts