kubectl taint 命令对节点进行标记,以控制 Pods 的调度行为,通过在节点上施加 “污点”(taints),可以阻止 Pods 调度到那些节点,除非这些 Pods 具有相应的 “容忍”(tolerations),一起来看看如何使用吧!
1、kubectl taint 命令使用场景
- 节点特性:如果某些节点有特定的硬件或软件特性(如 GPU 节点),可设置污点来限制只有具备对应容忍的 Pods 才能被调度到这些节点
- 维护:在进行节点维护时,可暂时添加污点以防 Pods 被调度到该节点
- 资源隔离:利用污点和容忍策略,可以在同一集群中为不同类型的工作负载创建隔离
2、kubectl taint 命令的基本用法
# <nodename>:目标节点的名称
# key=value:污点的键值对
# NoSchedule:污点的效果
kubectl taint nodes <nodename> key=value:NoSchedule
- Key:污点的键,用于标识污点
- Value:污点的值,与键一起使用,进一步描述污点(可选)
- Effect:污点的效果,定义 Pod 被排斥时的行为
-
- NoSchedule:Pod 不会被调度到该节点上(除非 Pod 有对应的容忍度)
-
- PreferNoSchedule:K8s 尽量避免将 Pod 调度到该节点上,非强制性
-
- NoExecute:若节点上已有运行的 Pod,且没有对应的容忍度,则会被驱逐
3、使用 kubectl taint 命令
# 查看帮助命令
kubectl taint --help
# 为 node1 添加污点 name=node1:NoSchedule
kubectl taint nodes node1 name=node1:NoSchedule
# 为所有带有标签 myLabel=X 的 node 添加污点
kubectl taint node -l myLabel=X isready=not:NoSchedule
# 为 node1 去除污点 name
kubectl taint nodes node name-
4、举例使用 kubectl taint 命令
# 为 node1 添加污点 name=node1:NoSchedule
kubectl taint nodes node1 name=node1:NoSchedule
# 验证 node1 上含有污点 name=node1:NoSchedule
kubectl describe node node1 | grep Taints
# 配置 pod -> mypod 容忍污点 name=node1:NoSchedule
vi mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
tolerations:
- key: "name"
operator: "Equal"
value: "node1"
effect: "NoSchedule"
containers:
- name: mycontainer
image: myimage
# 应用 mypod.yaml,验证 mypod 能被调度到 node1 上
kubectl apply -f mypod.yaml