ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • taint와 toleration을 활용한 scheduling
    k8s 2020. 7. 6. 00:01

    # taint와 toleration

    그림1

    현재 위 그림처럼 쿠버네티스 클러스터를 환경 별로 나눠서 사용 중입니다. 구체적으로는 네임스페이스도 사용하고, 하나의 노드에 여러 개의 파드를 운영 중이지만 클러스터 구성 시 파드 스케줄링을 어떻게 할지 많이 고민했고, NodeSelector와 taint + toleration을 활용하여서 이 문제를 해결했습니다.

    그래서 이번 글에서는 taint와 toleration의 간단한 사용 예을 적어보려고 합니다.

    k8s 문서에 보면 "taint와 toleration은 함께 작동하여 파드가 부적잘한 노드에 스케줄 되지 않게 한다."라고 나와 있습니다. 아래에서 설명하겠지만 taint는 노드에 적용되는 설정이고, toleration은 파드에 적용되는 설정입니다.

    그림1과 같이 worker-node1, 2에 각각 nginx, redis 파드가 스케줄 되게끔 설정하려면 먼저 노드에 taint를 지정한 후, 파드 배포를 위한 yaml 파일에 toleration 설정을 추가하여 배포하면 됩니다.

    # 노드에 taint 추가
    $ kubectl taint nodes worker-node1 app=nginx:NoSchedule
    $ kubectl taint nodes worker-node2 app=redis:NoSchedule

    # worker-node1에 nginx 배포를 위한 toleration 설정 추가
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: production
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "app"
        operator: "Equal"
        value: "nginx"
        effect: "NoExecute"

    # worker-node2에 redis 배포를 위한 toleration 설정 추가
    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
      labels:
        env: production
    spec:
      containers:
      - name: redis
        image: redis
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "app"
        operator: "Equal"
        value: "redis"
        effect: "NoExecute"

     

    만일 toleration 설정이 생략된 상태로 배포된다면 파드의 STATUS가 Pending 상태를 유지할 것이고, 파드를 describe를 해보면 아래와 같은 이벤트 메시지를 볼 수 있을 겁니다.

    Events:
      Type     Reason            Age                From               Message
      ----     ------            ----               ----               -------
      Warning  FailedScheduling  16s (x2 over 16s)  default-scheduler  0/1 nodes are available: 1 node(s) had taint {key: value}, that the pod didn't tolerate.

     

    toleration 추가할 때 고려해야 할 설정 값이 operator, effect인데 operator는 스케쥴링을 위한 key, value를 비교하는 설정이고, effect는 어떤 식으로 스케쥴링이 동작할지를 정의하는 설정입니다. 더 구체적으로는 아래와 같습니다.


    operator

    - Equal : key, value가 일치하는 경우에만 파드 스케쥴링 진행

    - Exist : value가 필요없고, key만 일치할 경우 파드 스케쥴링 진행

    - Exists 사용 예

      tolerations:
      - key: "app"
        operator: "Exists"
        effect: "NoExecute"

    실제 환경에서는 모든 노드에 동일한 key 값으로 taint가 걸려 있으므로, Exists 보다는 value까지 확인할 수 있는 Equal을 사용 중입니다.


    effect

    - NoSchedule: taint key, value가 tolerations 항목에 정의되어 있을 경우 실행 
                            노드에 taint가 걸리기 이전 파드는 그대로 유지됨

    - NoExecute: taint key, value가 tolerations 항목에 정의되어 있을 경우 실행 
                           노드에 taint가 걸리기 이전 파드를 다른 노드로 다시 스케쥴링

    - PreferNoSchedule: 되도록이면 스케쥴링 하지 않지만, 클러스터 리소스가 부족할 경우 스케쥴링을 허용

     

    결론은 노드에 key, value 형태로 taint를 걸고, 파드에는 toleration 설정에 동일한 key, value를 정의해서 사용하고 위에선 생략되어있지만 nodeSelector설정을 하여 특정 노드에 특정 파드를 스케쥴링하는 게 가능해집니다.

    댓글

Designed by Tistory.