kubernetes Taint 、Toleration
定义
- Affinity 节点亲和性,是 pod 的一种属性(偏好或硬件要求),它使 pod 被吸引到一类特定的节点。
Taint 污点 则相反,它使节点能够排斥一类特定的 Pod。 - Taint 和 Toleration 相互配合,可以用来避免 Pod 被分配到不合适的节点上。
- 每个节点上都可以应用一个或者多个 Taint,表示对于那些不能容忍这些 Taint 的 Pod,不会被接受的。
- 如果将 Toleration 应用于 Pod 上,这表示这些 Pod 可以被调度到具有匹配 Taint 的节点上
污点 (Taint)
当我们的 Pod 需要热更新,进行维护,但不终止服务的时候可以为节点打一个污点,
这样保证当前节点无 Pod 运行,但该节点的 Pod 会在其他节点运行。
Ⅰ、污点 (Taint) 的组成
使用 kubectl taint 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去
每个污点的组成如下:
key=value:effect
每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。
当前 taint effect 支持如下三个选项:
NoSchedule
:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上PreferNoSchedule
:表示 K8S 将尽量避免将 Pod 调度到具有该污点的 Node 上NoExecute
:表示K8S 不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去。
Ⅱ、污点的设置,查看,删除
1.设置污点
格式:kubectl taint nodes node1 key=value:Noschedule
举例:kubectl taint nodes k8s-node1 check=shm:NoExecute
2.查看污点 Taints 字段
格式:kubectl describe pod pod-name
举例:kubectl describe nodes k8s-master | grep Taints
kubectl describe nodes k8s-node1 | grep Taints
3.删除污点
格式:kubectl taint nodes node1 key:NoSchedule-
举例:kubectl taint nodes k8s-node1 check=shm:NoExecute-
容忍 (Tolerations)
设置了污点的 Node 将根据 Taint 的 effect: NoSchedul、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。
但我们可以在 Pod 上设置容忍 (Toleration),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上。
Tolerations 案例:
kubectl taint nodes k8s-node2 check=shm:NoExecute
kubectl taint nodes k8s-node1 check=shm:NoExecute
tolerations:
- key: "key1"
operator: "Equal" #运算算法
value: "value1"
effect: "NoSchedule" #污点策略
tolerationSeconds: 3600 #容忍期限,时间
- 其中 key、value、effect 要与 Node 上设置的 taint 保持一致
- operator 的值为 Exists 将会忽略 value 的值
- tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Pod 上继续保留运行的时间,驱离前保留时间
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: nginx
image: nginx:1.9.1
tolerations:
- key: "check"
operator: "Equal" #运算算法
value: "shm"
effect: "NoExecute" #污点策略
tolerationSeconds: 3600 #容忍期限,时间
设置了容忍的 Pod 将可以容忍污点的存在,依旧可以执行到达 Running 状态
多个 Master 存在时,防止资源浪费,可以如下设置
当 Node 节点不够用时可以在 Master 节点上运行 Pod
kubectl taint nodes Node-Name node-role.kubernetes.io/master=:PreferNoSchedule