1、Affity亲和性在k8s中亲和性有两种节点亲和性node affinity和Pod亲和性pod affinity。1.1. 节点亲和性Node Affinity定义节点亲和性用于指定Pod与节点之间的关系使Pod倾向于在具有特定标签或节点特征的节点上运行。适用场景资源需求当某个Pod对计算资源如CPU、内存或其他特定硬件资源如GPU有特定需求时可以使用节点亲和性将它调度到具有相应资源的节点上。这有助于优化资源利用和性能。逻辑分组当需要将相关的Pod分组部署到特定节点上时可以使用节点亲和性。例如在分布式系统中某个节点需要承担特定的角色或任务可以使用节点亲和性将相关的Pod调度到该节点上以便实现逻辑上的分组和管理。特定硬件或软件要求当某个Pod需要依赖特定的硬件设备或软件环境时可以使用节点亲和性将它调度到具备所需条件的节点上。例如某个Pod需要与具有特定硬件加速器的节点进行通信可以使用节点亲和性将它调度到具备所需硬件的节点上。1.1.1 requiredDuringSchedulingIgnoredDuringExecution硬亲和性新创建一个pod-aff.yaml配置然后填入以下内容apiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: demo-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox-tomcat # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 nodeAffinity: # 节点亲和性 requiredDuringSchedulingIgnoredDuringExecution: # 硬亲和性调度时必须满足运行时忽略变化 nodeSelectorTerms: # 节点选择器条件列表多个 term 之间是 OR 关系 - matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - key: a # 节点标签的键名 operator: In # 操作符In 表示标签值必须在给定的列表中 values: # 标签值列表 - b # 允许的标签值即节点必须包含标签 ab containers: # 容器列表定义 Pod 中运行的容器 - name: tomcat # 第一个容器名称 ports: # 容器端口配置 - containerPort: 8080 # 容器内部监听的端口号 image: tomcat:8.5.34-jre8-alpine # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 - name: busybox # 第二个容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略同前 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行启动这个podkubectl apply -f pod-aff.yaml当前节点中有任意一个节点拥有ab标签就可以把pod调度到有ab这个标签的节点很显然我们的k8s集群中没有这样的一个标签这次调度将会被pending。执行查看pod详细信息命令可以看到没有匹配到亲和节点所以被挂起了kubectl describe pod demo-pod现在给k8s-node-1创建这个标签就可以将这个pod给调度起来kubectl label nodes k8s-node-1 ab1.1.2 preferredDuringSchedulingIgnoredDuringExecution软亲和性顾名思义软亲和性如果没有满足条件不会挂起而是直接运行这个pod。如果满足条件则按照条件指定的节点调度podapiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: demo-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox-tomcat # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 nodeAffinity: # 节点亲和性 preferredDuringSchedulingIgnoredDuringExecution: # 软亲和性调度时尽量满足但不强制 - preference: # 偏好设置 matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - key: a1 # 节点标签的键名 operator: In # 操作符In 表示标签值必须在给定的列表中 values: # 标签值列表 - b1 # 偏好的标签值节点包含标签 a1b1 会被优先调度 weight: 80 # 权重值范围 1-100数值越高优先级越高 containers: # 容器列表定义 Pod 中运行的容器 - name: tomcat # 第一个容器名称 ports: # 容器端口配置 - containerPort: 8080 # 容器内部监听的端口号 image: tomcat:8.5.34-jre8-alpine # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 - name: busybox # 第二个容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略同前 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行可以看到我的集群中没有a1b1的标签但是k8s还是将pod调度到k8s-node-1节点不会将这个pod挂起。1.1.3 硬亲和性 vs 软亲和性对比特性硬亲和性required软亲和性preferred调度行为必须满足条件否则 Pod 无法调度尽量满足条件不满足也能调度关键字requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution权重支持不支持支持1-100用于优先级排序适用场景强制约束如合规性、硬件要求性能优化如就近部署、资源偏好1.2. Pod亲和性Pod Affinity定义Pod亲和性用于指定Pod之间的关系使它们倾向于在同一节点或具有相似特征的节点上运行。适用场景数据本地性当两个或多个Pod需要访问相同的本地数据时可以使用Pod亲和性将它们调度到同一节点上。例如在分布式数据库中多个数据库实例需要访问相同的数据卷或存储可以通过Pod亲和性将它们调度到同一节点上减少网络传输延迟。互为依赖当两个或多个Pod之间存在依赖关系需要相互通信或协同工作时可以使用Pod亲和性将它们调度到同一节点上。例如在微服务架构中某个服务需要与特定的缓存服务进行交互可以使用Pod亲和性将它们调度到同一节点上提高性能和减少网络开销。服务发现和负载均衡在需要实现服务发现和负载均衡的场景中可以使用Pod亲和性将属于同一服务的多个实例调度到同一节点或相近的节点上。这样可以提高服务的可用性、降低延迟并简化负载均衡配置。1.2.1 requiredDuringSchedulingIgnoredDuringExecution硬亲和性pod硬亲和性可以将两个pod同时调度到同一个节点即tomcat-pod被调度到哪个节点则busy-box也会被调度到同一个节点我下面的例子中tomcat-pod被调度到node2节点然后busy-box根据pod亲和性也会被调度到node2节点。创建tomcat-pod.yamlapiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: tomcat-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: first # 应用标签busybox 将通过此标签找到 tomcat Pod env: pro # 环境标签生产环境 spec: # Pod 规格定义 containers: # 容器列表定义 Pod 中运行的容器 - name: tomcat # 容器名称 ports: # 容器端口配置 - containerPort: 8080 # 容器内部监听的端口号 image: tomcat:8.5.34-jre8-alpine # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取创建busybox-pod.yaml拓扑域键名hostname 表示节点级别即要求调度到同一节点topologyKey: kubernetes.io/hostnameapiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: busybox-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 podAffinity: # Pod 亲和性与 Pod 的调度位置偏好相关 requiredDuringSchedulingIgnoredDuringExecution: # 硬亲和性调度时必须满足运行时忽略变化 - labelSelector: # 标签选择器用于选择目标 Pod matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - {key: app, operator: In, values: [first]} # 数组形式选择标签 appfirst 的 Pod 作为亲和目标 topologyKey: kubernetes.io/hostname # 拓扑域键名hostname 表示节点级别即要求调度到同一节点 containers: # 容器列表定义 Pod 中运行的容器 - name: busybox # 容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行部署与验证命令# 1. 给k8s-node-1和k8s-node-2加上标签 kubectl label nodes k8s-node-1 k8s-node-2 appfirst envpro # 2. 先启动 tomcat Pod作为亲和性目标 kubectl apply -f tomcat-pod.yaml # 3. 等待 tomcat Pod 处于 Running 状态 kubectl get pod tomcat-pod -w # 4. 再启动 busybox Pod会自动调度到 tomcat 所在节点 kubectl apply -f busybox-pod.yaml # 5. 验证两个 Pod 是否在同一节点查看 NODE 列是否相同 kubectl get pods -o wide # 6. 查看 Pod 调度事件确认亲和性生效 kubectl describe pod busybox-pod | grep -A 5 Events1.2.2 preferredDuringSchedulingIgnoredDuringExecution软亲和性tomcat-pod.yaml配置apiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: tomcat-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: first # 应用标签busybox 将通过此标签找到 tomcat Pod env: pro # 环境标签生产环境 spec: # Pod 规格定义 containers: # 容器列表定义 Pod 中运行的容器 - name: tomcat # 容器名称 ports: # 容器端口配置 - containerPort: 8080 # 容器内部监听的端口号 image: tomcat:8.5.34-jre8-alpine # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取busybox-pod.yaml配置apiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: busybox-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 podAffinity: # Pod 亲和性与 Pod 的调度位置偏好相关 preferredDuringSchedulingIgnoredDuringExecution: # 软亲和性调度时尽量满足但不强制 - weight: 80 # 权重值范围 1-100数值越高优先级越高调度器会优先考虑此偏好 podAffinityTerm: # Pod 亲和性条件项 labelSelector: # 标签选择器用于选择目标 Pod matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - {key: app, operator: In, values: [first]} # 数组形式选择标签 appfirst 的 Pod 作为亲和目标 topologyKey: kubernetes.io/hostname # 拓扑域键名hostname 表示节点级别即尽量调度到同一节点 containers: # 容器列表定义 Pod 中运行的容器 - name: busybox # 容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行1.2.3 硬亲和性 vs 软亲和性对比对比维度硬亲和性Required软亲和性Preferred关键字requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution调度行为必须满足条件否则 Pod 无法调度尽量满足条件不满足也能调度调度结果找不到符合条件的节点 → Pod 保持 Pending找不到符合条件的节点 → Pod 正常调度到其他节点权重支持❌ 不支持✅ 支持1-100适用场景强制约束合规性、硬件要求、数据本地性性能优化就近部署、资源偏好、减少延迟1.2.4 亲和性选择建议场景推荐类型原因合规性要求如数据本地性硬亲和性必须满足否则业务无法运行高性能计算GPU 节点硬亲和性必须调度到有 GPU 的节点微服务就近部署减少延迟软亲和性优先同节点但非强制缓存与业务同节点软亲和性提升性能但降级可用多可用区容灾反亲和性硬/软分散部署提高可用性1.2.5反亲和性硬亲和性之前我们创建了tomcat-pod和busybox-pod通过pod的亲和性将这两个pod调度到了同一个节点现在我们可以使用pod的反亲和性将这两个pod调度到不同的节点。亲和性调度到同一个节点的好处就是如果这两个服务有依赖关系且互相调用对延迟敏感就可以使用pod的亲和性调度到同一个节点避免跨节点访问反亲和性调度到不同的节点使用场景就是两个服务没有太多的关联关系且其中一个服务比较消耗资源必须要分开部署或者具有其它必须分开的场景。在这个例子中tomcat-pod.yaml配置保持不变新增一个busybox-pod-ant.yaml即可。apiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: busybox-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 podAntiAffinity: # Pod 反亲和性与 Pod 的调度位置分散相关 requiredDuringSchedulingIgnoredDuringExecution: # 硬反亲和性调度时必须满足运行时忽略变化 - labelSelector: # 标签选择器用于选择目标 Pod matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - {key: app, operator: In, values: [first]} # 数组形式避免与标签 appfirst 的 Pod 调度到同一节点 topologyKey: kubernetes.io/hostname # 拓扑域键名hostname 表示节点级别即要求分散到不同节点 containers: # 容器列表定义 Pod 中运行的容器 - name: busybox # 容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行# 1. 删除 tomcat-pod、busybox-pod kubectl delete pod tomcat-pod busybox-pod --force --grace-period0 # 2. 先启动 tomcat Pod作为反亲和性目标 kubectl apply -f tomcat-pod.yaml # 3. 等待 tomcat Pod 处于 Running 状态 kubectl get pod tomcat-pod -w # 4. 再启动 busybox Pod会自动调度到 tomcat 不同的节点 kubectl apply -f busybox-pod-ant.yaml # 5. 验证两个 Pod 是否在不同节点查看 NODE 列是否不同 kubectl get pods -o wide # 6. 查看 Pod 调度事件确认反亲和性生效 kubectl describe pod busybox-pod | grep -A 5 Events我这里tomcat-pod调度到node2busybox-pod调度到node1但是busybox-pod一直处于创建容器状态并没有真的启动这时候执行命令查看busybox-pod详细信息kubectl describe pod busybox-pod | grep -A 5 Events这是 Calico 网络插件出现了认证问题导致 Pod 无法正常创建网络沙箱。这与 Pod 的亲和性配置无关而是集群网络组件的问题。根本原因Calico 的 Kubernetes API 认证失败通常是因为Calico 的 ServiceAccount 权限不足Calico 配置的 kubeconfig 证书失效或过期Calico 的 etcd 或 Kubernetes API 连接配置错误需要重启Calico pod# 删除 Calico Pod它们会自动重建 kubectl delete pods -n kube-system -l k8s-appcalico-node kubectl delete pods -n kube-system -l k8s-appcalico-kube-controllers # 等待 Pod 重新启动 kubectl get pods -n kube-system -w | grep calico然后再查看pod状态就OK了kubectl get pods -o widebusybox-pod正常启动且被调度到node1节点1.2.6反亲和性软亲和性如果您需要软反亲和性尽量分散但不强制可以使用以下配置busybox-pod-ant.yaml 配置如下:apiVersion: v1 # Kubernetes API 版本 v1 kind: Pod # 资源类型为 Pod metadata: # 元数据部分 name: busybox-pod # Pod 名称 namespace: default # 所属命名空间默认 labels: # 标签集合用于筛选和分组 app: busybox # 应用标签 env: pro # 环境标签生产环境 spec: # Pod 规格定义 affinity: # 亲和性配置 podAntiAffinity: # Pod 反亲和性与 Pod 的调度位置分散相关 preferredDuringSchedulingIgnoredDuringExecution: # 软反亲和性调度时尽量满足但不强制 - weight: 80 # 权重值范围 1-100数值越高优先级越高 podAffinityTerm: # Pod 亲和性条件项 labelSelector: # 标签选择器用于选择目标 Pod matchExpressions: # 匹配表达式列表多个表达式之间是 AND 关系 - {key: app, operator: In, values: [first]} # 数组形式尽量不与标签 appfirst 的 Pod 调度到同一节点 topologyKey: kubernetes.io/hostname # 拓扑域键名hostname 表示节点级别即尽量分散到不同节点 containers: # 容器列表定义 Pod 中运行的容器 - name: busybox # 容器名称 image: busybox:latest # 使用的镜像及标签 imagePullPolicy: IfNotPresent # 镜像拉取策略仅当本地不存在时才拉取 command: # 容器启动命令覆盖镜像默认的 CMD - /bin/sh # 调用 sh 解释器 - -c # 执行后续字符串中的命令 - sleep 36000 # 休眠 36000 秒即 10 小时保持容器运行1.2.3 反亲和性硬性vs 反亲和性软性对比对比维度硬反亲和性Required软反亲和性Preferred关键字requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution调度行为必须分散否则 Pod 无法调度尽量分散无法分散也能调度调度结果找不到其他节点 → Pod 保持 Pending找不到其他节点 → Pod 正常调度到同一节点权重支持❌ 不支持✅ 支持1-100适用场景高可用强制要求、容灾合规性能优化、资源均衡、尽力而为的分散1.2.4 使用场景对比场景推荐类型原因示例金融/医疗系统硬反亲和性合规要求必须跨节点/可用区部署银行核心系统、医疗病历系统关键业务高可用硬反亲和性避免单点故障保证业务连续性数据库、消息队列、注册中心微服务多副本软反亲和性优先分散但资源不足时可以容忍Web 应用、API 网关资源均衡软反亲和性尽量分散负载但不强制批处理任务、CI/CD 构建跨可用区容灾硬反亲和性必须分散到不同可用区异地多活、灾备系统开发测试环境软反亲和性资源有限时优先保证 Pod 运行测试环境、临时任务StatefulSet 部署硬反亲和性每个副本必须在不同节点Kafka、Elasticsearch 集群1.2.5 亲和性 vs 反亲和性对比对比维度Pod 亲和性AffinityPod 反亲和性Anti-Affinity关键字podAffinitypodAntiAffinity调度行为吸引尽量/必须与目标 Pod 在同一节点排斥尽量/必须不与目标 Pod 在同一节点适用场景就近部署、减少延迟、缓存与业务同节点高可用、容灾、避免单点故障配置语法与反亲和性对称与亲和性对称1.2.6 常用拓扑域类型topologyKey说明分散粒度kubernetes.io/hostname按节点分散最细粒度节点级别topology.kubernetes.io/zone按可用区分散中等粒度机房级别topology.kubernetes.io/region按地域分散最大粒度地域级别1.2.7 选择决策树是否需要保证 Pod 必须分散在不同节点│├── 是合规/高可用要求│ └── 使用硬反亲和性requiredDuringSchedulingIgnoredDuringExecution│ ├── 节点数足够 → 正常调度成功分散│ └── 节点数不足 → Pod Pending无法调度│└── 否性能优化/资源均衡└── 使用软反亲和性preferredDuringSchedulingIgnoredDuringExecution├── 节点数足够 → 优先分散效果好└── 节点数不足 → 退而求其次允许同节点1.2.8 最佳实践环境推荐配置理由生产环境关键应用硬反亲和性 多副本保证高可用避免单点故障生产环境非关键应用软反亲和性提升可用性但不过度消耗资源开发测试环境软反亲和性或不用资源有限保证 Pod 能运行StatefulSet 有状态应用硬反亲和性每个副本独立节点保证稳定性Deployment 无状态应用软反亲和性均衡分布提高资源利用率2、污点和容忍度污点是节点上定义的键值属性用于拒绝 Pod 调度容忍度是 Pod 上定义的键值属性用于声明能容忍哪些污点。只有 Pod 的容忍度匹配节点的污点时Pod 才能被调度到该节点。概念定义位置作用关系污点Taints节点Node标记节点拒绝不匹配的 Pod 调度节点主动排斥 Pod容忍度TolerationsPod声明 Pod 能够容忍哪些污点Pod 主动申请豁免节点打污点Taint → 拒绝不容忍的 Pod↓Pod 设置容忍度Toleration→ 匹配污点 → 允许调度↓不容忍的 Pod → 被拒绝调度Pending2.1 污点与亲和性的区别污点是节点挑 Pod亲和性是 Pod挑节点两者配合使用可实现精细的调度控制。对比维度污点Taints节点亲和性NodeAffinity定义位置节点Pod作用节点拒绝Pod排斥Pod选择节点吸引方向节点 → Pod反向选择Pod → 节点正向选择主要用途隔离节点、专用节点按标签选择节点2.2污点完整字段结构kubectl taint nodes 节点名称 键值:污点效果污点由三个字段组成字段说明是否必填示例键Key污点的标识符✅ 必填node-type,disk,gpu值Value污点的具体值✅ 必填配合键使用production,ssd,nvidia污点效果Effect定义 Pod 不匹配时的行为✅ 必填NoSchedule,PreferNoSchedule,NoExecute2.3 污点效果Effect详解Effect说明对已运行 Pod 的影响对未调度 Pod 的影响NoSchedule硬性排斥不影响已运行的 Pod不容忍则无法调度PreferNoSchedule软性排斥不影响已运行的 Pod不容忍则尽量不调度NoExecute驱逐型排斥驱逐已运行且不容忍的 Pod不容忍则无法调度2.4 示例演示2.4.1 NoSchedule硬性排斥# 给节点打污点不容忍则无法调度 kubectl taint nodes k8s-node-1 node-typeproduction:NoSchedule # 查看节点污点 kubectl describe node k8s-node-1 | grep Taints # 输出Taints: node-typeproduction:NoSchedule2.4.2 PreferNoSchedule软性排斥# 给节点打污点尽量不调度但资源不足时允许 kubectl taint nodes k8s-node-2 diskssd:PreferNoSchedule2.4.3 NoExecute驱逐型排斥# 给节点打污点不容忍的 Pod 会被驱逐 kubectl taint nodes k8s-node-3 maintenancetrue:NoExecute # 查看效果已运行的 Pod 会被驱逐 kubectl get pods -o wide # 不容忍该污点的 Pod 状态变为 Pending 或重新调度到其他节点2.4.4 污点完整操作命令# 1. 添加污点 kubectl taint nodes k8s-node-1 gpunvidia:NoSchedule # 2. 查看节点所有污点 kubectl describe node k8s-node-1 | grep Taints # 或 kubectl get nodes k8s-node-1 -o json | jq .spec.taints # 3. 查看所有节点的污点 kubectl get nodes -o json | jq .items[].spec.taints # 4. 删除污点在键后面加 - kubectl taint nodes k8s-node-1 gpu:NoSchedule- # 5. 删除指定值的污点 kubectl taint nodes k8s-node-1 gpunvidia:NoSchedule- # 6. 更新污点覆盖 kubectl taint nodes k8s-node-1 gpuamd:NoSchedule --overwrite2.4.5 污点对应的 Pod 容忍度Tolerationstolerations: - key: gpu # 匹配污点的键 operator: Equal # 匹配操作符Equal 或 Exists value: nvidia # 匹配污点的值operatorEqual 时必填 effect: NoSchedule # 匹配污点的效果 tolerationSeconds: 3600 # 可选驱逐前的容忍时间仅 NoExecute 有效匹配规则操作符规则示例Equal键、值、效果必须完全匹配污点gpunvidia:NoSchedule→ 容忍key: gpu, value: nvidia, effect: NoScheduleExists只要键和效果匹配即可忽略值污点gpunvidia:NoSchedule→ 容忍key: gpu, effect: NoSchedule2.4.6 特殊容忍度容忍所有污点系统级别的pod基本上都是容忍所有污点tolerations: - operator: Exists # 匹配所有污点忽略键、值、效果2.4.7 生产环境典型使用场景场景污点配置说明GPU 专用节点kubectl taint nodes gpu-node gpunvidia:NoSchedule只允许需要 GPU 的 Pod 调度维护节点kubectl taint nodes node-01 maintenancetrue:NoExecute驱逐所有非维护 Pod生产环境隔离kubectl taint nodes prod-node envproduction:NoSchedule只允许生产 Pod 调度SSD 优选节点kubectl taint nodes ssd-node diskssd:PreferNoSchedule优先调度非必须2.4.8 查看污点对应 Pod 是否容忍# 1. 查看节点污点 kubectl describe node k8s-node-1 | grep Taints # 2. 查看 Pod 容忍度 kubectl describe pod my-pod | grep -A 5 Tolerations # 3. 查看 Pod 调度结果 kubectl get pods -o wide # 4. 查看调度失败原因 kubectl describe pod my-pod | grep -A 5 Events污点核心字段Key Value Effect三者组合决定节点的排斥策略和 Pod 的容忍能力。