千家信息网

Kubernetes关于Affinity和nodeSelector以及Taints与容忍的理解

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,大多数情况下kubernetes的调度程序能将pod调度到集群中合适的节点上。但有些情况下用户需要对pod调度到那个节点上施加更多控制,比如将pod部署到拥有SSD存储节点、将同一个服务的多个后端部署
千家信息网最后更新 2026年11月02日Kubernetes关于Affinity和nodeSelector以及Taints与容忍的理解

大多数情况下kubernetes的调度程序能将pod调度到集群中合适的节点上。但有些情况下用户需要对pod调度到那个节点上施加更多控制,比如将pod部署到拥有SSD存储节点、将同一个服务的多个后端部署在不同的机架上提高安全性、将通信频繁的服务部署在同一个可用区域降低通信链路长度。用户对pod部署的节点施加控制都与"label selector"有关。

nodeSelector(节点选择器)

nodeSelector也是标签选择器,是最简单、最直接控制pod部署node的方法,在daemonset用nodeSelector过滤可部署节点,以下是其普通的应用示例。


步骤1:为节点添加标签

kubectl get nodes -o wide 获取所有node信息

1、kubectl label nodes daily-k8s-n01 node=node01 2、kubectl label nodes daily-k8s-n01 disktype=ssd

为节点添加node标签node01,或者是disk类型为ssd


nodeSelector只能基于节点标签控制pod部署node,并且选择器只支持"与"逻辑操作。亲和与反亲和特性目前处于测试阶段,相比于节点选择器,其更灵活,功能更强大,体现在以下三点:

1、不仅仅是"与",支持更多的逻辑表达式。

2、nodeSelector是硬性要求,亲和与反亲和支持软硬两种要求。

3、除了节点标签,亲和与反亲和支持根据节点上已经部署的pod进行节点选择,这一点很重要。比如不想将两种计算密集类型的pod部署在同一节点上,后部署pod可选择过滤。

细分成两种类型的选择器:"节点亲和"与"内部pod亲和、反亲和"。

节点亲和与nodeSelector相似,具备上述1、2两条优点。 内部pod亲和依赖的是节点上已有pod的标签而不是节点标签,兼俱上述三个优点。因为节点亲和能完成nodeSelector所工作并且具备额外的优点,因此nodeSelector虽然还能用,但已经不再维护,并且将来可能删除。

NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。

Taints(污点)是Node的一个属性,设置了Taints(污点)后,因为有了污点,所以Kubernetes是不会将Pod调度到这个Node上的, 于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。因此 Taints(污点)通常与Tolerations(容忍)配合使用。

设置污点:

kubectl taint node [node] key=value[effect]

其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]

NoSchedule :一定不能被调度。

PreferNoSchedule:尽量不要调度。

NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。

示例:kubectl taint node 10.10.0.111 node=111:NoSchedule


比如设置污点:

kubectl taint node 10.10.0.111 node=111:NoSchedule

kubectl taint node 10.10.0.111 node=111:NoExecute

去除指定key及其effect:

kubectl taint nodes node_name key:[effect]- #(这里的key不用指定value)

去除指定key所有的effect:

kubectl taint nodes node_name key-

示例:

kubectl taint node 10.10.0.111 node:NoSchedule-

kubectl taint node 10.10.0.111 node:NoExecute-

kubectl taint node 10.10.0.111 node-



对于 tolerations 属性的写法,其中的 key、value、effect 与 Node 的 Taint 设置需保持一致, 还有以下几点说明:

    1. 如果 operator 的值是 Exists,则 value 属性可省略

    2. 如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 equal(等于)

    3. 如果不指定 operator 属性,则默认值为 Equal

另外,还有两个特殊值:

    1. 空的 key 如果再配合 Exists 就能匹配所有的 key 与 value,也是是能容忍所有 node 的所有 Taints

    2. 空的 effect 匹配所有的 effect

          tolerations:            - key: "node-role.kubernetes.io/master"                  operator: "Exists"                  effect: "NoSchedule"                        或者:spec:  tolerations: #设置容忍性  - key: "test"    operator: "Equal"  #如果操作符为Exists,那么value属性可省略,如果不指定operator,则默认为Equal   value: "16"   effect: "NoSchedule"  #意思是这个Pod要容忍的有污点的Node的key是test Equal 16,效果是NoSchedule,  #tolerations属性下各值必须使用引号,容忍的值都是设置Node的taints时给的值。  containers:   - name: pod-tains   image: 10.3.1.15:5000/ubuntu:16.04


通过对Taints和Tolerations的了解,可以知道,通过它们可以让某些特定应用,独占一个Node:

给特定的Node设置一个Taint,只让某些特定的应用来容忍这些污点,容忍后就有可能会被调度到此特定Node,

但是也不一定会调度给此特定Node,设置容忍并不阻止调度器调度给其它Node,那么如何让特定应用的Node

只能被调度到此特定的Node呢,这就要结合NodeAffinity节点亲和性(也可以使用nodeSelector去给node达标签的方式),然后在Pod属性里

设置NodeAffinity到Node。如此就能达到要求了。


总结:让特定的服务跑到专属的node节点上,通过给node节点打上taints,确定不调度,然后给pod设置容忍,这样其他pod不会调度到此节点,在通过node

Selector或者NodeAffinity的方式让改pod指定调度到此节点即可


节点 调度 亲和 污点 属性 标签 选择 应用 控制 支持 优点 示例 类型 服务 亲和性 情况 方式 更多 用户 逻辑 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 山东特亿宝互联网科技有限公司 互联网科技活动banner 科技企业和互联网企业 互联网未来科技 紫鲸互联网科技 广州互联网络科技有限公司 汉立互联网科技有限公司联系电话 现代科技和互联网有关系吗 河南猎农互联网科技有限公司 荆州市昕露互联网络科技有限公司 东莞新华互联网科技学校 互联网行业科技股 中科明德北京互联网科技 山东子淼互联网科技有限公司 中国互联网有什么科技 互联网科技股为什么大涨 互联网科技手抄报图片 互联网对科技影响 黑龙江互联网科技公司 小牛互联网科技有限公司地址 互联网科技公司的优势 科技创新互联网企业 金融科技和互联网金融 互联网科技有哪些公司 佳云科技和互联网广告 互联网金融科技名词解释 城市宝互联网科技有限公司 东营紫格互联网科技 绵阳真晨互联网科技有限公司 武汉亿视互联网科技有限公司
0