이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

28. Kubernetes Scheduler (Taint & Toleration)

이쿠우우 2020. 10. 11. 10:17
반응형

 

 

 

 

 

 

Kubernetes Taint & Toleration

 

 


[Kubernetes Scheduler 관련 글 목록]

Kubernetes Scheduler (Pod를 원하는 Worker Node에 배포하기)

Kubernetes Scheduler (nodeSelector)

Kubernetes Scheduler (Taint & Toleration)

Kubernetes Scheduler (Affinity)


 

Kube-Scheduler의 다양한 기능을 사용해서 관리자가 직접

특정 Worker Node에 Pod 가 생성되도록 설정할 수 도 있음

대표적으로

nodeSelector

Taint & Toleration

Affinity

3가지 방법이 있는데 

 

이 글에서는Taint & Toleration에 대해서 알아보겠음.

 

 

 


 

 

 

[환경]

 

Master Node server

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Worker Node server 1

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

Worker Node server 2

 OS = CentOS 7

 리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

 docker version : 1.13.1

 api verison : 1.26

 

 

Kubernetes version

 1.18

 

 

 


 

 

 

Taint & Toleration이란?

 

특정 Worker Node에 Pod가 배치되지 않기를 원하면 Taint를 적용하고

Taint가 적용된 Worker Node에 Pod를 배치하기를 원한다면 Pod에 Taint에 맞는 Toleration을 적용해야함.

 

Taint

Node에 정의.

특정 Worker Node에 Pod를 배치하지 않기를 원한다면 Taint를 적용.

즉 Taint가 설정되어있는 Worker Node에는 Pod가 배포되지 않음.

 

 

Toleration

Pod에 정의.

Taint 처리가 되어 있는 Worker Node에는 

Taint에 맞는 Toleration을 가지고 있는 Pod만 배포될 수 있음.

일종의 티켓 같은 개념.

( 참고 )

“배포된다"가 아니라, “배포될 수 있다" 라는 의미. 

그 Node가 아니라 다른 조건에 맞는 Node가 있다면, 배포될 수 있음.

예로 들자면 Taint 설정이 되어있는 Worker Node One 이 있고

Taint 설정이 안되어있는 Worker Node Two 가 있으면

Toleration 설정이 된 Pod 는 Worker Node One, Two 모두에 랜덤으로 생성될 수 있고,

Toleration 설정이 안된 Pod 는 Worker Node Two에만 생성이 가능함.

 

해당 기능을 잘 활용하면 GPU와 같은 특수 하드웨어를 가진 노드를 별도로 관리할 수 있다.

 

 

Taint Effect

 

NoSchedule

Taint 설정 중 Effect 로 NoSchedule이 설정된 Worker Node에는

Pod가 배포되지 못하고 Toleration이 일치할 경우에만 배포.

기존에 실행되고 있었던 Pod에는 적용되지 않고,

새롭게 배포되는 Pod에만 적용됨.

하지만 Pod가 Update되서 재생성된다면 NoSchedule이 적용되서 

새로운 Pod 배포되지 않음.

 

 

NoExecute

기존에 실행되고있던 Pod에도 영향을 주는 설정.

Taint 설정 중 Effect 로 NoExcute이 설정된 Worker Node에

Taint에 맞는 Toleration을 가지고 있는 Pod가 동작하고 있었다면

그대로 동작하게 해주지만

만약 Taint에 맞지 않는 Toleration을 가지고 있는 Pod 이거나

Toleration을 가지고 있지 않는 Pod라면 

Worker Node에서 삭제됨.

만약 삭제된 Pod 가 Deployment나 Replicaset 설정이 되어있는 Pod라면

다른 배포가능한 Worker Node에 다시 배포됨.

 

새로 배포되는 Pod도 Toleration이 일치할 경우에만 배포되고

일치하지 않는다면 배포되지 못함.

 

NoExecute Effect가 적용되어 특정 Pod가 다른 Worker Node 로 옮겨야할 경우 

tolerationSeconds파라미터가 선언되어 있다면 

선언된 파라미터의 시간만큼 남아 있다가 다른 Worker Node 로 이동함.

 

 

PreferNoSchedule

Taint 설정 중 Effect 로 PreferNoSchedule이 설정된 Worker Node에는

NoSchedule Effect와 동일하게

Pod가 배포되지 못하고 Toleration이 일치할 경우에만 배포하지만.

Prefer라는 뜻의 단어가 붙은 그대로 

NoSchedule 보다는 자비로운 설정임.

 

모든 Worker Node가 리소스가 부족해서 어떠한 Worker Node에서도

Pod가 배포될 수 없는 상황이라면 

우선순위를 낮추어서 Toleration이 없는 Pod라도 배포가 되도록 함.

 

 

 

 

 


 

 

 

Taint & Toleration 실습

 

 

1. 특정 Worker Node에 Taint 설정

 

[ 명령어 ]

kubectl taint nodes [Worker Node Name] [Key]=[ Value ]:[ Taint Effect ]

예) kubectl taint nodes kube.workerone.node testkey=iksoonvalue:NoSchedule

참고)  아래와 같이 한번에 다수의 Taint를 설정할 수도 있음

kubectl taint nodes [Worker Node Name] [Key]=[ Value ]:[ Taint Effect ] [Key]=[ Value ]:[ Taint Effect ]

 

이제 kube.workerone.node 에는

testkey=iksoonvalue:NoSchedule 로 Toleration 설정이 적용된 Pod만 배치가 됨.

 

 

2. Worker Node Taint 적용 확인

[ 명령어 ]

kubectl get nodes [Worker Node Name] -o yaml

예) kubectl get nodes  kube.workerone.node -o yaml

 

 

 

3. Toleration 적용이 안된 Pod 배포 확인

 

[예제 no_Toleration_deployment.yaml ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment-test

  labels:

    app: iksoon-test

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.6

        ports:

        - containerPort: 8080

 

 

[ 결과 ]

Pod가 Taint 설정된 worker node one에는 생성이 안되고

무조건 worker node two에만 생성이 됨

 

 

강제로 nodeSelector 설정으로 Taint 설정이 된 kube.workerone.node 로 지정했을 경우.

[예제 no_Toleration_deployment.yaml ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment-test

  labels:

    app: iksoon-test

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.6

        ports:

        - containerPort: 8080

      nodeSelector:  # Worker Node One에 강제로 배치되도록 nodeSelector를 사용

        kubernetes.io/hostname: kube.workerone.node

 

 

[ 결과 ]

Pending 상태로 Pod가 생성되지 않음.

describe 로 확인 시 

Node One 에는 

Taint {testkey: iksoonvalue} 설정이 되어있는데

배치 될려고 하는 Pod는 Toleration이 없어서 배치가 안된다고 하고

Node Two 에는

nodeSelector가 매치가 안되서 생성이 안됨.

 

 

 

4. Toleration 적용이 된 Pod 배포 확인

 

[예제 toleration_deployment.yaml ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment-test

  labels:

    app: iksoon-test

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.6

        ports:

        - containerPort: 8080

     tolerations:

      - key: testkey

        value: iksoonvalue

        effect: NoSchedule

        operator: Equal

 

 

[ 결과 ]

Pod가 Taint 설정된 worker node one에는 생성이 됨

worker node two에도 생성이 가능해서 Worker Node one, two 중 랜덤으로 생성이 됨

 

 

다양한 Toleration 설정 방법

 

key, value, effect 3개가 모두 일치하는 

Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.

     tolerations:
      - key: testkey
        value: iksoonvalue
        effect: NoSchedule
        operator: Equal

 

 

key, effect가 일치하는 

Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.

value 값은 일치되지 않더라도 배포될 수 있음

   tolerations:
      - key: testkey
        effect: NoSchedule
        operator: Exists

 

 

 

key가 일치하는 

Taint 설정된 Worker Node 에 배포될 수 있는 toleration 설정.

value, effect 값은 일치되지 않더라도 배포될 수 있음

   tolerations:
      - key: testkey
        operator: Exists

 

 

 

 

5. Taint 제거.

 

특정 Worker Node에 Taint 제거.

[ 명령어 ]

kubectl taint nodes [Worker Node Name] [Key]:[ Taint Effect ]-

예) kubectl taint nodes kube.workerone.node testkey:NoSchedule-

 

 

 

 

 

 

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

 

참고

 

[Taint, Toleration]

https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/

https://bcho.tistory.com/1344?category=731548

https://skasha.tistory.com/92

 

 

반응형