Skip to main content

특정 노드에만 배포할 수 있는 taint 설정하기

k8s를 사용하다보면 특정 서버또는 특정환경에 매칭되는 pod만 배포할 경우가 필요합니다.

예를들면.... 디스크 타입이 ssd 장착된 노드와 hdd가 장착된 노드로 분리되어 있는 경우 disk io의 성능을 끌어올리려면 hdd보다는 ssd가 낫겠죠. 

그렇게 특정 노드에 속성을 걸고 pod에 배포하기 위해서는 taint  + Tolerations 이라는 기능을 사용하면 됩니다.

taint는 노드의 속성값으로 추가하는 것이고, toleration은 적용된 taint에 어떻게 반영할것인지를 정의하는 겁니다.

taint = node2의 type은 ssd이야

toleration = type 이 ssd로 정의된 노드에 배포해줘.

  1. 스케쥴 정보
    스케쥴 정보 용 도 

    NoSchedule

    앞으로 배포될 리소스에 대해서 적용 (현재 배포된 POD는 현상유지)
    PreferNoSchedule 앞으로 배포될 리소스에 대해서 적용하지만 어쩔수 없을때는 무시하고 배포
    (현재 배포된 POD는 현상유지)
    NoExecute 현재 배포된 리소스와 앞으로 배포될 리소스 모두 정책에 맞지 않으면 모두 제거

  2. 노드에 taint 적용하기
    • taint 정보 확인
      $> kubectl get nodes -o custom-columns=node:.metadata.name,taint:.spec.taints
      node           taint
      controlplane   [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]]
      node01         <none>

      taint 설정 없는거 확인하였쥬?

    • taint 설정해봅시다.
      $> kubectl taint node node01 disk=ssd:NoSchedule
      node/node01 tainted

    • 이제  taint 설정 한거 확인해봅시다.
      $> kubectl get nodes -o custom-columns=node:.metadata.name,taint:.spec.taints
      node           taint
      controlplane   [map[effect:NoSchedule key:node-role.kubernetes.io/control-plane]]
      node01         [map[effect:NoSchedule key:disk value:ssd]]

       

  3. deployment에 toleration 정의하기
    1. deployment에 toleration 정의하기
      $> vi deploy.yaml 
      ...
      spec:
        containers:
        - image: nginx
        ...
        tolerations:
        - key: "disk"
          operator: "Equal"
          value: "ssd"
          effect: "NoSchedule"
      ...

    2. 배포하기
      $> kubectl apply -f deploy.yaml

  4. 노드에 적용했던 taint 정보 삭제 (적용했던 정책에서 -를 추가하면 삭제된다)
    $> kubectl taint node node01 disk=ssd:NoSchedule-
    node/node01 untainted

  5. 지연된 pod 제거 방법
    1. toleration에서 tolerationSeconds 값(초기준)을 추가하면 정의된 초 이후로 pod가 제거된다.
      $> vi deploy.yaml 
      ...
        tolerations:
        - key: "disk"
          operator: "Equal"
          value: "ssd"
          effect: "NoExecute"
          tolerationSeconds: 3600
      ...