ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 taint, toleration
    Kubernetes 2018. 8. 8. 09:00
    반응형
    쿠버네티스 클러스터의 특정 노드에 taint를 지정할 수 있습니다. taint를 설정한 노드에는 포드들이 스케쥴링 되지 않습니다. taint가 걸린 노드에 포드들을 스케쥴링 하려면 toleration을 이용해서 지정해 주어야합니다. taint는 cordon이나 draint처럼 모든 포드가 스케쥴링 되지 않게 막는건 아니고, toleration을 이용한 특정 포드들만 실행하게 하고 다른 포드들은 들어오지 못하게 하는 역할을 합니다. 
    주로 노드를 지정된 역할만 하게할 때 사용합니다. DB용 포드를 띄워서 노드 전체의 CPU나 RAM자원을 독점해서 사용하게 할 수 있습니다. GPU가 있는 노드에는 다른 포드들은 실행되지 않고, 실제로 GPU를 사용하는 포드들만 실행시키도록 설정할 수도 있습니다. 
    taint는 키, 값, 효과의 3가지로 구성됩니다. 다음과 같은 형식입니다.
    kubectl taint nodes 노드 이름 키=값:효과

    실제로 노드에 taint를 걸어 보겠습니다.
    kubectl taint nodes docker-for-desktop key01=value01:NoSchedule

    kubectl describe로 노드에 taint가 설정되어 있는지 확인해 보겠습니다.
    $ kubectl describe nodes docker-for-desktop
    ……
    Taints:             key01=value01:NoSchedule
    …...

    taint가 제대로 설정되어 있는지 확인해 보기 위해서 포드를 하나 실행해 보겠습니다. 샘플 디플로이먼트를 실행한 다음에 포드 상태를 보면 Pending으로 실행되지 않는걸 확인할 수 있습니다. taint가 걸려 있기 때문입니다.

    deployment-sample.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kubernetes-simple-app
      labels:
        app: kubernetes-simple-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kubernetes-simple-app
      template:
        metadata:
          labels:
            app: kubernetes-simple-app
        spec:
          containers:
          - name: kubernetes-simple-app
            image: arisu1000/simple-container-app:latest
            ports:
            - containerPort: 8080

    $ kubectl apply -f deployment-sample.yaml
    deployment.apps "kubernetes-simple-app" created
    $ kubectl get pods
    NAME                                     READY     STATUS    RESTARTS   AGE
    kubernetes-simple-app-57585656fc-vbt8x   0/1       Pending   0          53s

    taint가 걸려 있는 노드에 포드를 실행시키려면 toleration을 걸어 줘야 한다고 했습니다. toleration 옵션을 줘서 포드를 실행해 보겠습니다. deployment-sample.yaml내용의 포드 sped부분에 다음처럼 toleration 관련 옵션을 추가해 줍니다. 키와 값에 앞서 taint에 설정했던 값인 key01과 value01을 넣었습니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kubernetes-simple-app
      labels:
        app: kubernetes-simple-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kubernetes-simple-app
      template:
        metadata:
          labels:
            app: kubernetes-simple-app
        spec:
          containers:
          - name: kubernetes-simple-app
            image: arisu1000/simple-container-app:latest
            ports:
            - containerPort: 8080
          tolerations:
          - key: "key01"
            operator: "Equal"
            value: "value01"
            effect: “NoSchedule"

    수정한 yaml파일을 다시 kubectl apply -f deployment-sample.yaml 명령어로 적용하면 새로운 포드가 스케쥴링되서 실행되고 기존에 Pending되어 있던 포드는 삭제되는걸 확인할 수 있습니다. 
    taint 삭제는 다음 명령을 이용해서 할 수 있습니다.
    kubectl taint nodes docker-for-desktop key01:NoSchedule-

    taint, toleration 옵션 상세
    taint에 사용하는 키는 첫문자는 영문이나 숫자로 시작해야 하고 영문, 숫자, 하이픈(-), 점(.), 언더스코어(_)등을 사용할 수 있고 253자까지 쓸 수 있습니다. 값은 키와 마찬가지로 첫문자는 영문이나 숫자로 시작해야 하고 영문, 숫자, 하이픈(-), 점(.), 언더스코어(_)등을 사용할 수 있고 63자까지 쓸 수 있습니다.
    설정 가능한 효과에는 NoSchedule, PreferNoSchedule, NoExecute 3가지 종류가 있습니다. 설정별 효과는 다음과 같습니다.
    • NoSchedule : toleration이 없으면 포드가 스케쥴 되서 실행되지 않습니다. 기존에 실행되던 포드에는 적용되지 않습니다.
    • PreferNoSchedule: toleration이 없으면 포드를 스케쥴링 하지 않으려고 하긴 하지만 필수는 아닙니다. 클러스터내의 자원이  부족하거나 하면 taint가 걸려 있는 노드에서 포드가 스케쥴링 될 수 있습니다. 
    • NoExecute : 새로운 포드도 toleration이 없으면 실행되지 않게 하고, 기존에 있던 포드역시 taint에 맞는 toleration설정이 없으면 종료시킵니다. 
    toleration에서 key, value, effect는 원하는 taint의 값을 지정해 주면 됩니다. operation에는 Equal과 Exists 2가지가 있습니다. Equal은 키, 값, 효과가 모두 같은지 확인을 합니다. Exists는 이와 좀 다릅니다. Exists는 값을 확인하지 않고 필요하지도 않습니다. 실제로도 operation에 Exists을 주고 value를 포함해서 적용하려고 하면 에러가 납니다. 또한 키, 효과 값을 주지 않고 Exists옵션만 줄수도 있는데 이러면 모든 키와 효과에 적용되서 어떤 taint가 걸려있던 상관없이 스케쥴링되서 포드가 실행됩니다. 
    tolerations:
    - operator: "Exists"
    마찬가지로 operator 옵션을 Exists로 주고 키만 명시할수도 있는데 이런 경우에는 효과는 무시하고 이 키를 가지는 모든 taint에 적용됩니다. 
    tolerations:
    - key: "key01"
      operator: "Exists"







    반응형

    댓글

Designed by Tistory.