在 Kubernetes 集群中,每个节点都会有一些资源(CPU、内存、磁盘、网络等)可供使用。在实际应用中,我们可能会遇到资源使用不均匀的情况,比如有些节点的 CPU 负载很高,而有些节点则相对空闲,这时候我们就可以使用节点污点管理来避免资源的浪费。
在 Kubernetes 中,使用 Taint 和 Toleration 实现节点污点管理非常方便。Taint 是一种节点级别的属性,可以标记一个节点上的资源或属性,Toleration 则是 Pod 级别的属性,表示这个 Pod 能够“容忍”哪些污点。当有一个 Pod 希望运行在一个被污点标记的节点上时,必须在 Pod 中设置一个相应的 Toleration。
如何使用 Taint 和 Toleration?
在 Kubernetes 中,使用 Taint 和 Toleration 的方式如下:
- 创建一个被 Taint 标记的节点
kubectl taint nodes <node-name> <taint-key>=<taint-value>:<taint-effect>
其中 <node-name>
是节点名称,<taint-key>
是污点的名称,<taint-value>
是污点的值,<taint-effect>
是污点的作用。通常 <taint-effect>
可以是 NoSchedule
、PreferNoSchedule
、NoExecute
中的一种。
- 创建一个带有 Toleration 的 Pod
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----- ----- ----------- - ----- ----- ------ ----- ------ - -------------- -- ------------ - ---- ----------- --------- ----------------------- ------ ------------- ------- --------------
其中 <taint-key>
、<taint-value>
和 <taint-effect>
需要与之前创建 Taint 标记节点时设置的相对应。
Taint 和 Toleration 的作用
当一个节点被标记了 Taint 后,其他没有设置对应 Toleration 的 Pod 无法调度到这个节点上,除非使用 --toleration
参数强制调度。
Taint 和 Toleration 的作用主要分为三种:
NoSchedule:标记这个节点后,没有设置对应 Toleration 的 Pod 将不会被调度到该节点上。
PreferNoSchedule:标记这个节点后,稍微会优先调度非 Taint 节点,但不会完全排除这个节点。
NoExecute:标记这个节点后,如果一个 Pod 在该节点上运行时间超过了 Toleration 中设置的阈值,该 Pod 将被驱逐出该节点。
示例代码
以下是一个 Taint 和 Toleration 的示例代码:
- 创建一个被 Taint 标记的节点:
$ kubectl taint nodes node-1 app=backend:NoSchedule
- 查看节点状态:
$ kubectl describe node node-1 ... Taints: app=backend:NoSchedule
- 创建 Pod,带有 Toleration 标记:
-- -------------------- ---- ------- ----------- -- ----- --- --------- ----- ----------- ----- ----------- - ----- ------- ------ ----- ------------ - ---- ----- --------- ------- ------ --------- ------- ------------
- 查看 Pod 状态:
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES backend-pod 1/1 Running 0 21m 10.244.2.5 node-2 <none> <none>
可以看到,这个 Pod 被调度到了 node-2 节点上。因为 node-1 节点上有一个 Taint 标记,而该 Pod 的 Toleration 标记刚好匹配了这个 Taint。
总结
使用 Taint 和 Toleration 可以帮助我们在 Kubernetes 中更好地管理节点资源,实现优化资源使用的目的。当我们需要进行节点污点管理时,只需要使用上述步骤,即可轻松实现。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64771c56968c7c53b03acaa7