【kubernetes系列】Kubernetes之Taints和tolerations
概述
节点亲和性是pod的一种属性(优先选择或硬性要求),它使 pod 被优先分配到一类特定的节点上。而Taint则相反,它使节点能够排斥一类特定的 pod。
Taints(污点)与tolerations(容忍度)一起工作确保Pod不会被调度到不合适的节点上。Taints是node的属性,单个节点可以添加多个taint(污点),node不接受无法容忍taint(污点)的pod的调度。Toleration(容忍度)是pod的属性,允许(非强制)pod调度到taints(污点)相匹配的node上去。(注意taints是node的属性,tolerations是pod的属性。)
操作
添加
#通过kubectl taint为node添加taint,如:
kubectl taint nodes k8s-node1 key=value:NoSchedule
为node节点 k8s-node1增加一条taint(污点)。Taint(污点)的关键字为key,值为value,taint(污点)影响NoSchedule。意味着如果pod没有设置容忍该污点,pod将不会被调度到k8s-node1上,除非Pod它有设置匹配的toleration(容忍度)。
删除
#为k8s-node1删除刚才添加的taints,如下:
kubectl taint nodes k8s-node1 key:NoSchedule-
可以为pod指定toleration(容忍度)。以下的两种toleration(容忍度)都与上文中创建的taint(污点)匹配,因此这个pod有可能被调试到k8s-node1上。
tolerations:
- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"
tolerations:
- key: "key"operator: "Exists"effect: "NoSchedule"
Toleration(容忍度)与taint(污点)匹配的条件是key相同、effect相同,并且:
- operator的值是Exists(无需指定values的值)
- operator的值是Equal,并且values的值相等
而如果不指定,operator默认是Equal。
注意:两种特殊情况。
- 如果一个 toleration 的 key 为空且 operator 为 Exists ,表示这个 toleration 与任意的 key 、 value 和 effect 都匹配,即这个 toleration 能容忍任意 taint。
tolerations:
- operator: "Exists"
- 空effect表示匹配所有effect,如:
tolerations:
- key: "key"operator: "Exists"
即空则匹配所有
上例中用到了NoSchedule的effect。另外,可以使用PreferNoSchedule的effect,这是NoSchedule的“偏好”或者“软“版本。系统尽量避免非tolerate的pod调度到taint node上,但非强制要求。effect 的值还可以设置为 NoExecute。
其中 [effect] 可取值:[ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule: 一定不能被调度
PreferNoSchedule: 尽量不要调度,实在没有地方调度的情况下,才考虑可以调度过来
NoExecute: 不仅不会调度, 还会立即驱逐Node上已有的Pod
添加多个tainit(污点)
可以为单个node指定多条taint(污点),也可以为单个pod指定多条toleration(容忍度)。系统采用过滤的方式处理这种情况:首先从node的所有taint(污点)开始,然后将与pod中的toleration(容忍度)相匹配的taint(污点)删除,余下的taint(污点)对部署进来的pod产生影响。特别地:
- 如果余下的taint(污点)中至少有一条的effect是NoSchedule,kubernetes将不会高度这个pod到的node上。
- 如果余下的taint(污点)中没有effect为NoSchedule的taint(污点),但至少有一条effect为PreferNoSchedule,则系统尝试着不将pod部署在node上(也就是有可能还是会部署到这个node上)。
- 如果余下的taint(污点)中至少有一条的effect是NoExecute,那么不旦新的pod不会被调度到这个node上,而且已经运行在这个node上的pod还会被驱逐出去。
例如,假如像这样taint一个node:
kubectl taint nodes k8s-node1 key1=value1:NoSchedule
kubectl taint nodes k8s-node1 key1=value1:NoExecute
kubectl taint nodes k8s-node1 key2=value2:NoSchedule
pod有两个toleration:
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"
- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"
这种情况下,pod不能调度到该node上。因为pod没有toleration(容忍度)与node的第三条taint(污点)匹配。但是如果在给节点添加 上述 taint 之前,该 pod 已经在上述节点运行,那么它还可以继续运行在该节点上,因为第三个 taint 是三个 taint 中唯一不能被这个 pod 容忍的。
一般情况下,如果一个effect为NoExecute的taint(污点)应用于node,运行在node上的所有不能容忍这条taint(污点)的pod都会被排挤出node,能容忍这种taint(污点)的pod则不会被排挤。然而,如果effect为NoExecute的toleration(容忍度)指定给pod,同时添加可选的tolerationSeconds字段,则表示pod被排挤出node之前,以taint(污点)的添加时间为起点,允许此pod在此node上的生存时间。
#例如:
tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"tolerationSeconds: 3600
#表示可以多存活3600秒。
默认情况下,kubernetes会自动添加一些基础的容忍度。如下是kubernetes1.19.16版本添加的,不同版本可能有所区别,请自行查看。
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
使用案例:
Taints与tolerations可以灵活的控制pod远离node,或者将不应该运行的pod从node上排挤出去。以下是几个使用案例:
- 专用node:如果打算指定特定node集合供特定用户专用,那么可以给这些node添加一条taint(kubectl taint nodes nodename dedicated=groupName:NoSchedule),然后在相应的pod上添加匹配的toleration(容忍度)。拥有toleration的pod被允许像使用集群中的其它node一样使用拥有taint的node。如果打算让pod只使用taint性质的node,并且只能使用taint的node的话,可以对这些taint的node再额外增加标签(例如:dedicated=groupName),然后再通过入口控制器为这些pod额外再增加亲和性要求它们只能部署到拥有dedicated=groupName的node上。总结就是通过标签的亲和性控制pod部署到特定的node上,通过为node增加taint并且为pod增加toleration抵制其它pod部署到这些node上,从而实现node专用。
- 拥有特殊硬件的node:在集群中,有少数node拥有特殊的硬件配置(例如 GPUs),希望那些不使用特殊的硬件的pod尽量不要部署到这些拥有特殊硬件的node上,为后续到达的需要使用特殊硬件的pod预留出空间。通过如下方法达到这个目的。首先为node添加taint,taint表示node拥有特殊硬件(例如: kubectl taint nodes nodename special=true:NoSchedule 或者 kubectl taint nodes nodename special=true:PreferNoSchedule),然后为需要使用特殊硬件的pod添加相应的toleration。像专用node的例子一样,通过入口控制器很容易为pod添加对应的toleration。例如:推荐使用“扩展资源”代表特殊硬件,使用“扩展资源”的名称为拥有特殊硬件的node添加taint,当提交的pod被配置为需要使用特殊硬件时,扩展资源入口控制器自动为其加上正确的toleration。
- 基于taint的驱逐(测试特性):一种当node出现问题时per-pod-configurable的驱逐行为,下节介绍。
基于taint的驱逐:
先前提到的effect为NoExecute的taint,它对已经运行在node上的pod的影响如下:
如果pod没有toleration这个taint的话,pod立即被驱逐。
如果toleration了这个taint,并且没有指定tolerationSeconds的值,则一直不会驱逐
如果toleration了这个taint,但是指定tolerationSeconds限定了容忍的时间,则到期后驱逐
此外,Kubernetes用taint代表node出了问题(1.13beta版)。换句话说,当Node某些条件为True时,节点控制器自动为Node节点添加污点,而在状态为Ready的Node上,之前设置过的普通的驱逐逻辑将会被禁用。内置以下污点:
node.kubernetes.io/not-ready:节点尚未就绪。这对应于NodeCondition Ready为“ False”。
node.kubernetes.io/unreachable:Node controlloer无法访问节点。这对应于NodeCondition Ready为“ Unknown”。
node.kubernetes.io/out-of-disk:节点变得磁盘不足。
node.kubernetes.io/memory-pressure:节点有内存压力。
node.kubernetes.io/disk-pressure:节点有磁盘压力。
node.kubernetes.io/network-unavailable:节点的网络不可用。
node.kubernetes.io/unschedulable:节点是不可调度的。
node.cloudprovider.kubernetes.io/uninitialized:当使用“外部”云提供程序启动kubelet时,会在节点上设置此污点以将其标记为不可用。在cloud-controller-manager的控制器初始化此节点后,kubelet将删除此污点。
注意:在节点故障的情况下,为了保持现存的Pod驱逐的限速设置,系统将会以限速的模式逐步给Node设置Taint,这就能避免在一些特定情况下(比如Master暂时失联)大量的Pod被驱逐。这一功能兼容于tolerationSeconds允许Pod定义节点故障时持续多久才被逐出。
例如:一个包含很多本地状态的应用可能需要在网络发生故障时,还能持续在节点上运行,期望网络能够快速恢复,从而避免被从这个节点上驱逐。Pod的toleration可以这样定义:
tolerations:
- key: "node.kubernetes.io/unreachable"operator: "Exists"effect: "NoExecute"tolerationSeconds: 6000
对于Node未就绪状态,可以把Key设置为node.kubernetes.io/not-ready如果没有为Pod指定node.kubernetes.io/not-ready 的Tolerations,那么Kubernetes会自动为Pod加入tolerationSeconds= 300的node.kubernetes.io/not-ready 类型的Tolerations
同样如果Pod没有定义node.kubernetes.io/unreachable的Tolerations那么系统会自动为其加入tolerationSeconds=300的node.kubernetes.io/unreachable类型的Tolerations
这些系统自动设置的Tolerations在Node发现问题时,能够为Pod确保驱逐前再运行5min。这两个默认 toleration 是由 DefaultTolerationSeconds admission controller添加的。
DaemonSet 中的 pod 被创建时,针对以下 taint 自动添加的 NoExecute 的 toleration 将不会指定 tolerationSeconds:
- node.alpha.kubernetes.io/unreachable
- node.kubernetes.io/not-ready
这保证了出现上述问题时 DaemonSet 中的 pod 永远不会被驱逐,这和 TaintBasedEvictions 这个特性被禁用后的行为是一样的。
驱逐阈值设定
其阈值由kubelet如下参数控制:
–eviction-hard:驱逐阈值(例如memory.available<1Gi),如果满足这些阈值,就会触发pod驱逐。(默认imagefs.available < 15%, memory.available < 100 mi, nodefs.available < 10%, nodefs.inodesFree < 5%)
–eviction-soft:驱逐阈值(例如memory.available<1.5Gi),如果在相应的宽限期内达到该阈值,就会触发pod驱逐。
–eviction-minimum-reclaim:最小回收(例如imagef .available=2Gi),描述kubelet在执行pod回收(如果该资源处于压力之下)时回收的最小资源量。
–eviction-pressure-transition-period:kubelet必须等待一段时间才能从驱逐压力状态过渡出来。(默认5m0)
优化方案:
- 二进制部署方式:
编辑kubelet-conf.yml文件修改默认阈值来调整驱逐条件:
- pods
eventBurst: 10
eventRecordQPS: 5
evictionHard:imagefs.available: 15%memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5%
evictionPressureTransitionPeriod: 5m0s
- kubeadm部署方式:
mkdir -p /sys/fs/cgroup/cpu,cpuacct/kubelet.slice
mkdir -p /sys/fs/cgroup/memory/kubelet.slice
mkdir -p /sys/fs/cgroup/systemd/kubelet.slice
mkdir -p /sys/fs/cgroup/pids/kubelet.slice
mkdir -p /sys/fs/cgroup/cpu,cpuacct/kubelet.slice
mkdir -p /sys/fs/cgroup/cpuset/kubelet.slice
mkdir -p /sys/fs/cgroup/hugetlb/kubelet.slicecat >>/var/lib/kubelet/config.yaml<<EOF
enforce-node-allocatable: 'pods,kube-reserved,system-reserved'
kube-reserved-cgroup: '/system.slice/kubelet.service'
system-reserved-cgroup: '/system.slice'
kube-reserved: 'cpu=1,memory=1500Mi'
system-reserved=cpu: '500m,memory=1Gi'
eviction-hard: 'memory.available<5%,nodefs.available<10%,imagefs.available<10%'
eviction-soft: 'memory.available<10%,nodefs.available<15%,imagefs.available<15%'
eviction-soft-grace-period: 'memory.available=2m,nodefs.available=2m,imagefs.available=2m'
eviction-max-pod-grace-period: '30'
eviction-minimum-reclaim: 'memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi'
EOF
然后重启kubelet服务
更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出
相关文章:
【kubernetes系列】Kubernetes之Taints和tolerations
概述 节点亲和性是pod的一种属性(优先选择或硬性要求),它使 pod 被优先分配到一类特定的节点上。而Taint则相反,它使节点能够排斥一类特定的 pod。 Taints(污点)与tolerations(容忍度…...
宝剑锋从磨砺出 梅花香自苦寒来(高考志愿篇)
各省高考成绩已出,又到一年高考季。张雪峰提到:“普通家庭不要光谈理想,也要谈落地。”志愿怎样填报、选专业还是选学校、什么专业好就业、高考志愿主要看什么?针对这些疑问,你对正在选志愿的毕业生们有什么建议吗&…...
Jtti:怎样进行sql server2000 日志传送
在 SQL Server 2000 中,日志传送是指将事务日志从一个主服务器传送到一个或多个备份服务器的过程。这个过程确保备份服务器上的数据库保持与主服务器上的数据库同步。 要进行 SQL Server 2000 的日志传送,需要进行以下步骤: 配置主服务器&…...

MyBatis-Plus:条件构造器Wrapper
目录 1.Wrapper概述 1.1.Wrapper的继承关系 1.2.Wapper介绍 1.3.各个构造器使用区别 1.4.构造器常用方法 2.Wrapper常用构造器介绍 2.1.QueryWrapper 2.2.UpdateWrapper 2.3.LambdaQueryWrapper 2.4.AbstractWrapper 3. Lambda条件构造器 3.1.示例 4.鸣谢 MyBati…...

SNMP 计算机网络管理 实验1(二) 练习与使用Wireshark抓取SNMP数据包抓包之 任务三分析并验证TCP三次握手建立连接时三次握手工作过程
⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…...

【UE5 Cesium】03-Cesium for Unreal 添加本地数据集
上一篇:【UE5 Cesium】02-Cesium for Unreal 添加在线数据集 步骤 1. 在官网(Adding Datasets – Cesium)上下载一个示例 下载的是一个名为“Tileset.zip”的压缩文件 解压后文件内容如下 2. 打开虚幻编辑器,点击“Blank 3D Tiles…...

数通王国历险记之地址分析协议(ARP)
系列文章目录 数通王国历险记(4) 目录 前言 一,什么是地址解析协议(ARP) 二,封装和解封装 三,为什么需要地址解析协议(ARP) 四,ARP的验证实验 4.1&#x…...

Mac端显示服务器上show的内容
Mac端显示服务器上show的内容 1. 需求描述 在Mac端(终端和PyCharm中)编写代码,在服务器端运行程序。需要在Mac端显示服务器端运行的内容,比如,运行的视频等。 2. 常见报错 SSH 运行命令时报错示例。 (cv) czjing…...
【SQL】每类视频近一个月的转发量/率
【问题】 统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。 【数据】 用户-视频互动表 tb_user_video…...
chatgpt读论文
在当今的数字化时代,人工智能(AI)正在颠覆我们的生活方式。 OpenAI的GPT系列模型——尤其是最新一代的GPT-4和它的聊天机器人版本ChatGPT——是最近AI进步的显著代表。通过深度学习和海量数据训练,这些模型已经可以生成出色的人类般的文本。它们可以被用…...

关于visual studio 2010 及以上版本 引入boost库的最新解决方法
之前没有怎么用到boost库,出来实习需要去编译一些代码,需要引入boost第三方库,在这过程中,一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误, 但是也确实是跟其他教程学过…...

SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务
1.简介 “ 本文主要介绍SpringBoot2.1.5 Dubbo 2.7.3 Mybatis 3.4.2 Nacos 1.1.3 Seata 0.8.0整合来实现Dubbo分布式事务管理,使用Nacos 作为 Dubbo和Seata的注册中心和配置中心,使用 MySQL 数据库和 MyBatis来操作数据。 ” 如果你还对SpringBoot、Dubbo、Nacos…...
MongoDB使用
文档连接: link 创建表 不需要创建表的语句,当插入表的第一条语句时,会隐式的创建表。 增 插入一条 db.people.insertOne({ user_id: "bcd001", age: 45, status: "A" } )插入多条 db.collection.insertMany([ <document 1&g…...
C#文件安全管理解析
在实际的项目开发中,我们经常需要使用到文件的I/O操作,主要包含对文件的增改删查等操作,这些基本的操作我们都是很熟悉,但是较少的人去考虑文件的安全和操作的管理等方面,例如文件的访问权限管理,文件数据的…...

基于Dubbo分布式学校信息管理系统设计与实现
一、引言 1.1 课题背景 随着时代的发展与进步,计算机网络也随之日益完善,渐渐覆盖了我们生活的各个方面。在信息化和数字化的时代背景下,使用计算机管理学校信息来提升教育工作的质量和效率,是大势所趋,所以近年来,随着网络技术的不断发展,使用信息管理系统的学校越来…...
oracle面试问题和笔记整理
oracle面试笔记 ORACLE 面试问题-技术篇(2) 如何判断数据库的时区? 解答:SELECT DBTIMEZONE FROM DUAL; 解释GLOBAL_NAMES设为TRUE的用途 解答:GLOBAL_NAMES指明联接数据库的方式。如果这个参数设置为TRUE, 在建立数据库链接时就必须用相同的名字连结远程数据库 23。如何…...

Hadoop_Yarn实践 (三) => (Yarn的基础架构、原理、容量/公平调度器、Tool接口、Yarn常用命令、核心参数)
目录 Hadoop_HDFS、Hadoop_MapReduce、Hadoop_Yarn 实践 (三)一、Hadoop_HDFS二、Hadoop_MapReduce三、Hadoop_Yarn1、Yarn资源调度1.1、基础架构1.2、Yarn的工作调度机制(Job提交过程)1.3、Yarn 调度器和调度算法1.3.1、先进先出调度器(FIFO…...

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密
专栏内容:postgresql内核源码分析 个人主页:我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 快照使用 快照是事务中使用,配合事务的隔离级别,体现出不同的可见性。…...
mysql(mariadb)读写分离部署
目录 一、原理 二、准备环境 三、部署mysql主从复制 1.五台服务器下载mariadb 2.修改master配置文件,重启数据库 3.登录mysql创建replication 4.从服务器登录验证 5.获得master服务器 DB的相关信息 6.备份master原有数据 7.修改slave1、slave2配置 8. 进入…...

ES-工作原理
前言 搜索引擎是对数据的检索,而数据总体分为两种:结构化数据和非结构化数据。而对于结构化数据,因为他们具有特定的结构,所以一般都是可以通过关系型数据库MySQL/oracle的二维表的方式存储和搜索,也可以建立索引。…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释
以Module Federation 插件详为例,Webpack.config.js它可能的配置和含义如下: 前言 Module Federation 的Webpack.config.js核心配置包括: name filename(定义应用标识) remotes(引用远程模块࿰…...

前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...

Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...