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>
相关推荐
kfhj44 分钟前
RESTFul是什么
微服务·云原生
曼岛_4 小时前
开源 LLM 应用开发平台 Dify 全栈部署指南(Docker Compose 方案)
docker·容器·开源
树下一少年6 小时前
ansible+docker+docker-compose快速部署4节点高可用minio集群
docker·容器·ansible·docker-compose·minio集群
Connie14518 小时前
在 Kubernetes (k8s) 中,apiserver 的 IIP和 VIP的区别
云原生·容器·kubernetes
rocksun9 小时前
为何云原生基础设施对于GenAI而言不可或缺
人工智能·云原生
葟雪儿11 小时前
Docker常用命令
linux·服务器·spring cloud·docker·微服务·容器
AutoMQ12 小时前
吉利汽车采用 EMQX 与AutoMQ联合方案构建公私有云一体化的车联网核心架构
云原生·架构·云计算·汽车
爬台阶的蚂蚁13 小时前
搭建docker registry私服,并且支持https推送
docker·容器·https
小小她爹13 小时前
dify新版本1.1.3的一些问题
云原生·eureka
张家宝683713 小时前
Containerd学习
后端·容器