KubernetesのTaintsとTolerationsの汚点と容認


NodeAffinityノードの親和性は、Podで定義された属性であり、Podが私たちの要求通りにノードにスケジューリングできるようにしますが、Taintsは正反対で、ノードがPodの実行を拒否したり、Podを駆逐したりすることができます.
Taints(汚点)はノードの1つの属性で、Taints(汚点)を設定した後、汚点があったのでKubernetesはPodをこのノードにスケジューリングしないので、
そこでKubernetesはPodに属性Tolerations(許容)を設定し,PodがNode上の汚点を許容できる限り,KubernetesはNode上の汚点を無視し,Podをスケジューリングすることができる.
従ってTaints(汚点)は通常Tolerations(許容)と併用される.
1、汚点の設定:
 kubectl taint node [node] key=value[effect]   
        [effect]    : [ NoSchedule | PreferNoSchedule | NoExecute ]
       NoSchedule :       。
       PreferNoSchedule:      。
       NoExecute:      ,    Node    Pod。
    :kubectl taint node 10.3.1.16 test=16:NoSchedule

2、汚れを取り除く:
       :
     kubectl taint node 10.3.1.16 test=16:NoSchedule
     kubectl taint node 10.3.1.16 test=16:NoExecute
     key  effect:
     kubectl taint nodes node_name key:[effect]-    #(   key    value)
                
     key   effect: 
     kubectl taint nodes node_name key-
 
   :
     kubectl taint node 10.3.1.16 test:NoSchedule-
     kubectl taint node 10.3.1.16 test:NoExecute-
     kubectl taint node 10.3.1.16 test-

3、Pod許容汚点例:
まずnodeに汚点を設定してスケジューリング効果を観察します.
 kubectl taint node 10.3.1.16 test=16:NoSchedule

podが許容値を設定していない場合は10.3.1.17にスケジュールされます.
apiVersion: v1
kind: Pod
metadata:
  name: pod-taints
  labels:
    os: ubuntu
spec:
  containers:
  - name: pod-tains
    image: 10.3.1.15:5000/ubuntu:16.04
root@ubuntu:#kubectl create -f pod-taints.yaml
pod "pod-taints" created
###
root@ubuntu# kubectl get pod -o wide
NAME       READY    STATUS  RESTARTS  AGE   IP        NODE
pod-taints    1/1     Running   0     7s 192.168.77.216 10.3.1.17

Podに許容値を設定する:
apiVersion: v1
kind: Pod
metadata:
  name: pod-taints
  labels:
    os: ubuntu
spec:
  tolerations: #     
  - key: "test" 
   operator: "Equal"  #      Exists,  value     ,     operator,    Equal
   value: "16"
   effect: "NoSchedule"
  #     Pod        Node key test Equal 16,   NoSchedule,
  #tolerations           ,        Node taints    。
 containers:
   - name: pod-tains
   image: 10.3.1.15:5000/ubuntu:16.04
root@ubuntu15:/data/yaml# kubectl get pod -o wide
NAME              READY     STATUS    RESTARTS   AGE       IP              NODE
pod-taints        1/1       Running      0       3m    192.168.150.216   10.3.1.16

#             Node  。     Node Pod            。

tolerationsプロパティの書き方:
キー、value、effectはノードのPoint設定と一致する必要があります.また、以下の説明があります.
1、operatorの値がExistsの場合、value属性は省略できます.
2、operatorの値がEqualの場合、そのkeyとvalueの関係がequal(等しい)であることを示す.
3、operator属性を指定しない場合、デフォルト値はEqualです.
さらに、2つの特殊な値があります.
1、空のキーはExistsに合わせるとすべてのキーとvalueにマッチし、すべてのnodeを許容できるすべてのTaintsでもある.
2、空のeffectはすべてのeffectに一致します.
 
1つのnodeに複数の汚れがあります.
例えばtest=16:NoScheduler test 2=16:NoSchedule
Podが許容したのはそのうちの1つだけだった.
tolerations:
  - key: "test"
    operator: "Equal" 
    value: "16"
    effect: "NoSchedule"

このような結果、このPodはkeyがtestであるnode(10.3.1.16)にスケジューリングできない.このNodeには2つの汚点が設けられているため、
このPodは1つの汚点にしかマッチしていません.つまり、1つの汚点だけを許容しているので、もう1つの許容を加えることができます.
 tolerations:
  - key: "test"
    operator: "Exists" 
    effect: "NoSchedule"
  - key: "test2"
    operator: "Equal"
    value: "16"
    effect: "NoSchedule"

ノードのTaints(汚点)を設定する前に、いくつかのPodが実行されていた場合、これらのPodはこのノードで実行されますか?これは、Taintsの汚点を設定したときのeffect(効果)によるものです.
effectの値がNoScheduleまたはPreferNoScheduleの場合、実行されているPodはまだ実行できますが、新しいPod(許容されていない場合)はスケジューリングされません.
effectの値がNoExecuteの場合、このノード上で実行中のPodは、許容されない限り、すぐに追放されます.
すぐに駆逐されるが、K 8 Sは人間性を示すためにNoExecute効果のある汚点を与え、許容属性に選択肢がある
tolerationSecondsフィールドは、これらのPodがこのノードの上でどのくらい実行できるかを設定し、時間になってから駆逐するまで猶予時間を与えるために使用されます.
Podで起動した場合、Podが駆逐された後、実行されなくなり、削除されたことになります.
deployment/rcの場合、削除したpodは他のノードで実行されます.
DaemonSetがこのノードで起動したPodであれば、Node上のNoExecute汚れが除去されたり、Podが許容されるまで実行されません.
#  Pod     
spec:
  tolerations: #     
  - key: "test"
    operator: "Equal" #      Exists,  value     
    value: "16"
    effect: "NoExecute"
    tolerationSeconds: 180 
    #     Pod Node,      NoExecute   Taint(  ),  Pod    180s     。
    #      tolerationSeconds  ,     。

TaintsとTolerationsを理解することで、特定のアプリケーションにノードを独占させることができることがわかります.
特定のノードにポイントを設定し、特定のアプリケーションだけでこれらの汚点を許容し、許容後にこの特定のノードにスケジューリングされる可能性があります.
しかし、必ずしもこの特定のノードにスケジューリングされるとは限らない.スケジューラが他のノードにスケジューリングされるのを阻止しないことを許容するように設定すると、特定のアプリケーションのノードをどのようにスケジューリングするか
ノードの親和性と結びつけてノードにラベルを付け、Podプロパティに
NodeAffinityをNodeに設定します.これで要求に達することができます.