【Kubernetes】Pod学习(九)Pod调度:Taints和Tolerations

此文为学习《Kubernetes权威指南》的相关笔记

学习笔记:

不论是nodeSelector调度方案还是亲和性调度方案,都是为Pod在创建时提供了选择Node的主动性,但是在很多场景中,Node同样需要具备选择自身可部署Pod属性的主动性,Taints和Tolerations(污点和容忍)机制使Node能够主动选择(设置Taints)具备某种属性(带有Tolerations)的Pod,也具备拒绝和驱逐Pod的主动性。

Node在设置Taints后,只有明确声明了Tolerations去容忍这些污点的Pod才有资格被调度在该Node上运行(NoSchedule效果),于此同时,Node可以设置效果是NoExecue的Taints污点,直接驱逐该Node上不具备对应Tolerations的Pod。

K8s调度器处理多个Taint和Toleration的逻辑顺序为,列出节点所有Taint,忽略Pod的Toleration能够匹配的部分,剩下的没有忽略的Taint就是对Pod的效果,几种特殊情况如下:

  • 剩余效果中存在effet=NoSchedule:Pod一定不会被调度到该Node(硬限制)
  • 剩余效果中不存在NoSchedule,但有PreferNoSchedule效果:尽量不把Pod调度到该Node(软限制)
  • 剩余效果存在effect=NoExecute:未调度Pod一定不会调度(硬限制)+已调度Pod停止运行(驱逐)
  • Pod中定义了对于NoExecute效果的容忍,同时包含了tolerationSeconds的值:Pod运行到时间才被驱逐

这种机制的引入使K8s进一步提升了调度上的灵活性

在实例之前,尝试查看当前节点是否包含Taints:

使用kebectl describe node <node-name> 查看节点信息

# kubectl describe node miwifi-r4cm-srv
......
Taints:             node-role.kubernetes.io/master:NoSchedule

......

 可以看到,K8s集群的Master节点上原生地带有一个Taint,这个污点标志了这个节点是Master节点,污点效果是NoSchedule:不调度,所有不包含对应容忍项的Pod在创建后都不会被调度到这个节点上,K8s正是通过这种方式让Master节点默认不作为工作节点承担工作任务。

删除节点Taints的方式与删除Labels的方式相似:

# kubectl taint nodes <node-name> <taint-key>-

删除Master节点的这个污点之后,Master节点同样可以作为工作节点加入调度器的考虑范围

1、给Node添加Taints信息

命令格式: # kubectl taint nodes <

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 集群中,可以通过使用 nodeSelector 或者 taints 和 tolerations 的方式来指定 Pod 调度到指定的节点上。 使用 nodeSelector 可以在 Pod 定义文件的 spec.nodeSelector 字段中指定一个或多个标签,然后在节点上设置对应的标签,这样 Pod 就会被调度到具有对应标签的节点上。 使用 taints 和 tolerations 可以在节点上设置 taints,表示这个节点不希望调度 Pod,然后在 Pod 定义文件的 spec.tolerations 字段中指定对应的 toleration,这样 Pod 就可以被调度到具有对应 toleration 的节点上。 举个例子,如果你想要将一个 Pod 调度到某个节点上,可以在节点上设置一个标签,比如 app=backend,然后在 Pod 定义文件中的 spec.nodeSelector 字段中指定这个标签,如下所示: ``` apiVersion: v1 kind: Pod metadata: name: example spec: containers: - name: nginx image: nginx nodeSelector: app: backend ``` 这样,当有节点上设置了 app=backend 的标签时,这个 Pod 就会被调度到该节点上。 如果你想要将一个 Pod 调度到一个带有 taint 的节点上,可以在节点上设置一个 taint,比如 node-role=master:NoSchedule,表示该节点不希望调度 Pod,然后在 Pod 定义文件中的 spec.tolerations 字段中指定对应的 toleration,如下所示: ``` apiVersion: v1 kind: Pod metadata: name: example spec: containers: - name: nginx image: nginx tolerations: - key: "node-role" operator: "Equal" value: "master" effect: "NoSchedule" ``` 这样,当有一个带有 node-role=master:NoSchedule 的节点时,这个 Pod 就可以被调度到该节点上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值