Kubernetes Taint, Toleration

Hoju·2022년 8월 25일
0
post-custom-banner

https://velog.io/@pinion7/Kubernetes-Pod-배치전략-Taint와-Toleration에-대해-이해하고-실습해보기

간단히 설명하자면, Taint는 특정 노드에 Taint를 지정해서, Taint가 설정되어있는 노드에는 Pod가 scheduling 되지 않도록 구성하는 방안입니다. 즉, 임의의 Pod가 할당되지 않도록 구성이 가능하다는 것 입니다.
※ Cordon을 설정하면 자동으로 Taint가 추가됩니다.
그럼 Toleration은 무엇일까? 특정 Taint를 용인이라는 뜻으로 Pod에 설정합니다. 즉, 특정 Taint를 용인할 수 있는 Toleration 설정을 가진 Pod는 해당 Node에 할당이 가능합니다.

Node Taint는 기존 kubernetes에 Label 및 Annotation과 비슷하게 Key=Value 형식을 가지는데, 추가적으로 Effect라는 파라미터를 가질 수 있습니다.
Ex) Key=Value:Effect

그럼 Effect는 무엇일까요? 정답은 Taint가 노드에 설정될 때 어떤 효과를 부여할지 설정하는 부분!!

  • 3가지 종류
    • NoSchedule
      • Taint Node에 Pod의 스케줄링 금지
      • 기존 실행 중인 Pod는 그대로 두고, 앞으로 실행시킬 Pod에 대해서만 스케줄링을 제한합니다.
    • NoExecute
      • Taint Node에 Pod의 실행 금지
      • 앞으로 생성 될 pod에 대한 스케줄링을 제한하고, 기존에 해당 Node에 배치된 Pod를 모두 방출합니다
    • PreferNoSchedult
      • Taint Node에 Pod 스케줄링을 선호하지 않습니다.
      • Soft Rule이라 할 수 있습니다.
      • 기존 실행 중인 Pod는 허용하고, 앞으로 생성될 Pod도 스케줄링되는 것을 선호하진 않지만 해당 Node 밖에 스케줄링 될 곳이 없다면 허용해줍니다.

Taint 사용 방법

  • Taint 추가
kubectl taint node NodeName [key]=[value]:[effect]
  • Taint 제거
kubectl taint node NodeName [key]=[value]:[effect]-

Toleration 사용 방법

Toleration을 설정하여 스케줄링이 가능하도록 구성해보자!


Toleration 설정 방법

  • (1) 모든 종류의 Taint를 OK
tolerations:
- operator: Exists
  • (2) Key가 Role인 모든 Taint를 OK
tolerations:
- key: role
	operator: Exists
  • (3) Key가 Role이고 Effect가 NoExecute인 모든 Taint를 OK
tolerations:
- ket: role
	operator: Exists
	effect: NoExecute
  • (4) role=system:Noschedule Taint를 OK
tolerations:
- key: role
  operator: Equal
  value: system
  effect: NoSchedule

구성 해보자!

  • 먼저 Taint를 설정합니다.
kubectl taint nodes ip-10-0-0-55.ap-northeast-2.compute.internal --overwrite role=system:NoSchedule
kubectl describe node ip-10-0-0-55.ap-northeast-2.compute.internal | grep -i taint

  • 한번 Toleration을 적용 안시킨 상태로 한번 테스트를 진행해보겠습니다.
cat << EOF > default.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: normal
spec:
  replicas: 2
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      name: hello
      labels:
        app: hello
    spec:
      containers:
      - name: nginx
        image: nginxdemos/hello:plain-text
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
EOF
kubectl apply -f default.yml
  • 결과는 이제 Pod가 현재 적용한 Node가 아닌 다른 Node에서 한꺼번에 실행중인 것을 확인할 수 있다. 근데 이게 우연일까? 그래서 전 Pod 갯수늘 늘려서 한번 테스트를 진행해보기로 했습니다.
kubectl apply -f default.yml
kubectl get pods -o wide

  • Pod 갯수를 늘린 뒤 결과도 마찬가지로 한 Node에서만 Pod가 생성된 것을 확인할 수 있었습니다. 즉, Node에 Taint가 잘 적용 됐다는 의미입니다!!
sed -i 's/replicas: 2/replicas: 5/' deployment.yaml
kubectl apply -f deployment.yaml
kubectl get pods -o wide


  • 이제 한번 Toleration을 적용 시킨 상태로 한번 테스트를 진행해보겠습니다.
cat << EOF > toleration.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tolerated
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello
  template:
    metadata:
      name: hello
      labels:
        app: hello
    spec:
      containers:
      - name: nginx
        image: nginxdemos/hello:plain-text
        ports:
        - name: http
          containerPort: 80
          protocol: TCP
      tolerations: #이 부분에서 지정해줍니다.
      - key: role
        operator: Equal
        value: system
        effect: NoSchedule
EOF
  • 이제 Pod가 골고루 잘 배치되는 것을 볼 수 있습니다. 이유는? key가 role이고 value는 system, effect는 NoSchedule인 Node에 대해서, 이 yml이 생성할 Pod의 배치를 OK해주기 떄문입니다.
kubectl apply -f toleration.yml
kubectl get pods -o wide

profile
Devops가 되고 싶은 청소년
post-custom-banner

0개의 댓글