kubenetes污点和容忍度
污点和容忍
污点可以算是一种人为干预调度pod的策略。
给node节点添加污点可以调整一些非必要的pod被调度到该node节点上,只有设置了能容忍该污点的pod才能被调度到该节点。
taint
现在taint主要有三种
NoSchedule:新的 Pod 不调度到该 Node 上,不影响正在运行的 Pod
PreferNoSchedule:soft 版的 NoSchedule,尽量不调度到该 Node 上
NoExecute:新的 Pod 不调度到该 Node 上,并且删除已在运行的不弄容忍该污点的Pod。Pod可以增加一个时间(tolerationSeconds)在该时间之后会被驱逐,如果污点在该时间内被取消则不会被驱逐。
新增taint
kubectl taint nodes node1 key1=value1:NoSchedule
在节点node1上留下污点。污点有键key1,值value1和污点效果NoSchedule。这表明除非有能够容忍该污点的pod,否则将不会有任何容器被调度到Node1上。
删除上述taint
kubectl taint nodes node1 key1:NoSchedule-
kubectl taint nodes node1 key1- #删除指定key所有的effect
tolerations
可以在PodSpace中配置toleration。让pod具有能够容忍taint的特性,使pod能够调度到被污染的node上。以下两种方法都可以匹配到被污染的node1上:
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule"
tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule"
使用示例:
apiVersion: v1 kind: Pod metadata: name: nginx labels: env: test spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule"
这里operator缺省值是Exists。
如果键和污点效果是和节点匹配的话pod是能够容忍node的污点调度到该node上的,并且在operator使用的是Exitsts情况下,vlaues可以不指定,但是operator使用Equal的情况下vlaues值要和node污点的values值相等。
注意:
kubectl taint nodes node1 key1=value1:NoSchedule kubectl taint nodes node1 key1=value1:NoExecute kubectl taint nodes node1 key2=value2:NoSchedule
pod上有两个toleration
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute"
在这种情况下,pod将无法调度到该节点上,因为没有容忍度与第三个污点相匹配。但是,如果添加了污点时它已经在节点上运行,它将能够继续运行,因为第三个污点是pod不允许的三个污点中的唯一一个。
通常,如果将一个有效果的污点NoExecute
添加到节点上,那么任何不能容忍该污点的pod都将被立即逐出,而会容忍该污点的pod不会被驱逐。但是,有效公差NoExecute
可以指定一个可选tolerationSeconds
字段,该字段指示添加污点后pod将绑定到节点的时间。例如,
tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoExecute" tolerationSeconds: 3600
意味着如果该Pod正在运行时向节点添加了匹配的污点,则该Pod将与该节点绑定3600秒,然后被逐出。如果在此之前移除了污点,则不会将pod逐出。