k8s的污点与容忍度

污点(Taint)针对节点来说,和节点亲和性正好相对,节点亲和性使Pod被吸引到一类特定的节点,而污点则使节点能够排斥一类特定的Pod。

容忍度(Toleration)应用于Pod上,它用来允许调度器调度带有对应污点的节点。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。

污点和容忍度(Toleration)相互配合,可以避免Pod被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的Pod, 是不会被该节点接受的。

bash 复制代码
设置污点命令格式:
kubectl taint node [node] key=value:[effect]

说明:
其中[effect] 可取值:[ NoSchedule | PreferNoSchedule | NoExecute ]:
NoSchedule :一定不能被调度,已经在运行中的Pod不受影响。
PreferNoSchedule:尽量不要调度,实在没有节点可调度再调度到此节点。
NoExecute:不仅不会调度,还会驱逐Node上已有的Pod。

清除污点命令格式:
kubectl taint node [node] key:[effect]-

示例:
kubectl taint node k8s-worker1  name=liing:NoSchedule
root@k8s-master:/home/vagrant# kubectl describe nodes k8s-worker1 |grep Taint -A 5
Taints:             name=liing:NoSchedule
Unschedulable:      false
Lease:
  HolderIdentity:  k8s-worker1
  AcquireTime:     <unset>
  RenewTime:       Thu, 12 Dec 2024 00:40:43 +0800

设置容忍度的几种规则:

bash 复制代码
1)完全匹配
tolerations:
- key: "taintKey"      #和污点的key名字保持一致
  operator: "Equal"    #匹配类型,Equal表示匹配污点的所有值
  value: "taintValue"  #和污点key的值保持一致
  effect: "NoSchedule" #污点类型
说明:
Pod 的 Toleration 声明中的key和effect需要与Taint的设置保持一致。
Operator如果设置为Equal,则key和value,要和Taint的设置保持一致。

2)不完全匹配
tolerations:
- key: "taintKey"      #和污点的key名字保持一致
  operator: "Exists"   #匹配类型,只要符合污点设置的key即可
  effect: "NoSchedule" #污点的类型
Operator如果设置为Exists,则不需要指定value,只看key名字

3)大范围匹配
tolerations:
- key: "taintKey"      #和污点的key名字保持一致
  operator: "Exists"   
说明:
如果不设置effect,则只需要看key名字即可,不管Taint里的effect设置为什么都会匹配到

4)匹配所有
tolerations:
- operator: "Exists"  
说明:
如果省略key和effect,则匹配所有Taint, 在k8s中的daemonsets资源默认情况下是容忍所有污点的。


驱逐延缓时间设置
tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
  tolerationSeconds: 3600

说明:
如果这个Pod 正在运行,那么Pod还将继续在节点上运行3600秒,然后被驱逐。 如果在此之前上述污点被删除了,则Pod不会被驱逐。

完整Pod YAML示例:

bash 复制代码
vi pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: ng
  labels:
    env: dev
spec:
  containers:
  - name: ng
    image: nginx:1.21.0
  tolerations:
  - key: name
    operator: Exists
    effect: NoSchedule
root@k8s-master:/home/vagrant# kubectl taint node k8s-worker2 disk=vmve:NoSchedule
node/k8s-worker2 tainted
root@k8s-master:/home/vagrant# kubectl taint node k8s-worker1 name=liing:NoSchedule
node/k8s-worker1 tainted
root@k8s-master:/home/vagrant# kubectl create -f pod.yaml 
pod/ng created
root@k8s-master:/home/vagrant# kubectl get -f pod.yaml -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
ng     1/1     Running   0          11s   172.16.194.66   k8s-worker1   <none>           <none>
相关推荐
张洛闻Eren8 分钟前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
忆~遂愿3 小时前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器
Thneonl4 小时前
你的 Pod 为什么 Pending:调度器两阶段
后端·kubernetes
不吃香菜kkk、4 小时前
CI/CD(GitOps)学习与部署手册
运维·云原生·容器·kubernetes·云计算·jenkins·argocd
ChaITSimpleLove4 小时前
云原生性能对决:JDK21虚拟线程+GraalVM vs .NET10/11 技术栈深度对比
微服务·云原生·serverless·graalvm native·native aot·runtime async·.net11/java21
九皇叔叔16 小时前
Kubernetes 资源管理方式详解:命令式与声明式管理
docker·容器·k8s
春天花会开13120 小时前
Supabase 自部署 Edge Functions 超时从 60s 延长到 360s 完整复盘
运维·云原生
程序猿小郑1 天前
Docker Compose 构建完整服务实战指南:从入门到最佳实践
docker·容器
ysu_03141 天前
【2026】K8s GPU调度空占怎么解?Kueue与Volcano Gang配置
云原生·kubernetes·gpu算力·volcano·ai基础设施·kueue·gang scheduling
哈__2 天前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes