KubernetesのTaintsとTolerationsの汚点と容認
4822 ワード
NodeAffinityノードの親和性は、Podで定義された属性であり、Podが私たちの要求通りにノードにスケジューリングできるようにしますが、Taintsは正反対で、ノードがPodの実行を拒否したり、Podを駆逐したりすることができます.
Taints(汚点)はノードの1つの属性で、Taints(汚点)を設定した後、汚点があったのでKubernetesはPodをこのノードにスケジューリングしないので、
そこでKubernetesはPodに属性Tolerations(許容)を設定し,PodがNode上の汚点を許容できる限り,KubernetesはNode上の汚点を無視し,Podをスケジューリングすることができる.
従ってTaints(汚点)は通常Tolerations(許容)と併用される.
1、汚点の設定:
2、汚れを取り除く:
3、Pod許容汚点例:
まずnodeに汚点を設定してスケジューリング効果を観察します.
podが許容値を設定していない場合は10.3.1.17にスケジュールされます.
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つだけだった.
このような結果、このPodはkeyがtestであるnode(10.3.1.16)にスケジューリングできない.このNodeには2つの汚点が設けられているため、
このPodは1つの汚点にしかマッチしていません.つまり、1つの汚点だけを許容しているので、もう1つの許容を加えることができます.
ノードの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が許容されるまで実行されません.
TaintsとTolerationsを理解することで、特定のアプリケーションにノードを独占させることができることがわかります.
特定のノードにポイントを設定し、特定のアプリケーションだけでこれらの汚点を許容し、許容後にこの特定のノードにスケジューリングされる可能性があります.
しかし、必ずしもこの特定のノードにスケジューリングされるとは限らない.スケジューラが他のノードにスケジューリングされるのを阻止しないことを許容するように設定すると、特定のアプリケーションのノードをどのようにスケジューリングするか
ノードの親和性と結びつけてノードにラベルを付け、Podプロパティに
NodeAffinityをNodeに設定します.これで要求に達することができます.
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に設定します.これで要求に達することができます.