【Kubernetes】云原生小技巧 16 之 kubectl taint 命令

23 阅读2分钟

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