关于k8s集群的污点和容忍,以及k8s集群的故障排查思路

 

 一 污点(Taint) 和 容忍(Tolerations)

(一)污点
在Kubernetes(K8s)中,污点(Taints)是一个重要的概念,用于实现Pod的调度控制。以下是关于污点的详细解释:

1.污点定义
污点是什么:污点是一种定义在节点上的键值型属性数据,用于让节点拒绝将Pod调度运行于其上,除非该Pod对象具有接纳节点污点的容忍度(Toleration)。

键值型数据:污点由三个部分组成:key、value和effect。其中key和value是污点的名称和值,而effect则定义了污点的效果。

2.污点效果
污点的效果(Effect)主要有三种类型:

NoSchedule:新的不能容忍此污点的Pod对象不会被调度至当前节点,但已在该节点上运行的Pod对象不受影响。

PreferNoSchedule:Kubernetes会尽量避免将新的不能容忍此污点的Pod对象调度至当前节点,但如果没有其他可用节点,仍然会调度。类似于节点亲和与pod亲和中的软策略

NoExecute:新的不能容忍此污点的Pod对象不会被调度至当前节点,而且已在该节点上运行但不再满足匹配规则的Pod对象将被驱逐。

1.1 污点(taint)

节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 Pod。
Taint 和 Toleration 相互配合,可以用来避免 Pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个 taint ,这表示对于那些不能容忍这些 taint 的 Pod,是不会被该节点接受的。如果将 toleration 应用于 Pod 上,则表示这些 Pod 可以(但不一定)被调度到具有匹配 taint 的节点上

使用 kubectl taint 命令可以给某个 Node 节点设置污点,Node 被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让 Node 拒绝 Pod 的调度执行,甚至将 Node 已经存在的 Pod 驱逐出去。

污点的组成格式下
key=value:effect

每个污点有一个 key 和 value 作为污点的标签,其中 value 可以为空,effect 描述污点的作用。

当前 taint effect 支持如下三个选项:

●NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
●PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
●NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
 

 master 就是因为有 NoSchedule 污点,k8s 才不会将 Pod 调度到 master 节点上

设置污点
kubectl taint node node01 key1=value1:NoSchedule

#节点说明中,查找 Taints 字段
kubectl describe node node-name  

#去除污点
kubectl taint node node01 key1:NoSchedule-

kubectl taint node node01 键名=键值:NoSchedule
//增加污点
 
kubectl taint node node01 键名=键值:NoSchedule-
kubectl taint node node01 键名-
//删除
 
kubectl describe nodes node01|grep -A5 -i taint
//查看

 

 举例说明:将node02节点设置为NoSchedule

 

验证污点的作用——NoExecute 

此时,给node02也设置为NoExecute 两个都是驱逐 

因此所有在node01上面的pod都被驱逐出来,并转移到node02上面,查看 Pod 状态,会发现 node01 上的 Pod 已经被全部驱逐(注:如果是 Deployment 或者 StatefulSet 资源类型,为了维持副本数量则会在别的 Node 上再创建新的 Pod)

 

 自主创建的pod会停止,一直处于pending的状态,因为node01 node02都被设置成了NoExecute,找不到适合的node,才会变成pending

验证污点的作用—NoSchedule  

原本在node1上面的pod不会被删除,新建的pod不会调度到node1节点上面

 随后,新建一个pod 观察一下,因为node01 有污点,不会将pod调度到node01上,因此pod01 在node02上

 

 

验证污点的作用——PreferNoSchedule 

分别给node01 node02 创建污点

 过滤一下node1  node02的taint污点

随后,创建一个新的pod

污点设置在node上面,容忍设置在pod节点上面

 

 二、容忍(pod可以适应node上面的污点)

设置了污点的 Node 将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍(Tolerations),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的 Node 上。,没有设置污点的node也是可以调度的。

2.容忍的组成

容忍通常包含以下几个部分:

键(Key):与污点的键相匹配。

值(Value):与污点的值相匹配。如果不指定值,Pod将容忍所有值的同名污点。

效应(Effect):与污点的效应相匹配。常见的效应包括NoSchedule、PreferNoSchedule和NoExecute。

容忍期限(TolerationSeconds)(仅对NoExecute效应有效):指定Pod在节点被赋予NoExecute污点后,能够继续在该节点上运行的时间(以秒为单位)。超过这个时间后,Pod将被驱逐。

操作符(Operator):用于指定容忍与污点的匹配方式。常见的操作符包括Equal和Exists。Equal要求键、值和效应都完全匹配,而Exists只要求键和效应匹配。

 随后,设置一个pod 跟node02这个节点做容忍

apiVersion: v1
kind: Pod
metadata:
  name: myapp01
  labels:
    app: myapp01
spec:
  containers:
  - name: with-node-affinity
    image: soscscs/myapp:v1
  tolerations:
  - key: "check"
    operator: "Equal"
    value: "no"
    effect: "NoExecute"
    tolerationSeconds: 15

 

 #其中的 key、vaule、effect 都要与 Node 上设置的 taint 保持一致
#operator 的值为 Exists 将会忽略 value 值,即存在即可
#tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Node 上继续保留运行的时间

 其它注意事项(equal表示精确匹配,exists表示模糊匹配)

(1)当不指定 key 值时,表示容忍所有的污点 key,就是指明只要key这个键相同即可,里面的值是什么都无所谓。
  tolerations:
  - operator: "Exists"

举例说明:


  随后,写一个yaml文件去创建pod


当超过40秒之后,就会被驱逐

2)作当不指定 effect 值时,表示容忍所有的污点用
  tolerations:
  - key: "key"
    operator: "Exists"

//其它注意事项
(1)当不指定 key 值时,表示容忍所有的污点 key
  tolerations:
  - operator: "Exists"
  
(2)当不指定 effect 值时,表示容忍所有的污点作用
  tolerations:
  - key: "key"
    operator: "Exists"
 
(3)有多个 Master 存在时,防止资源浪费,可以如下设置
kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
 
//如果某个 Node 更新升级系统组件,为了防止业务长时间中断,可以先在该 Node 设置 NoExecute 污点,把该 Node 上的 Pod 都驱逐出去
kubectl taint node node01 check=mycheck:NoExecute
 
//此时如果别的 Node 资源不够用,可临时给 Master 设置 PreferNoSchedule 污点,让 Pod 可在 Master 上临时创建
kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule
 
//待所有 Node 的更新操作都完成后,再去除污点
kubectl taint node node01 check=mycheck:NoExecute-

 (三)资源优化

1.多master使用

当有多个master存在时,可以将备用的master的污点状态设置为PreferNoSchedule,这样的话,会尽可能避免此节点,当其它节点不可调用(资源顶峰、节点故障、节点更新等)时,可以使用master进行临时调度,待资源恢复时,再将pod转移 

kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
2.Node更新

当某个node节点需要资源更新时,为防止业务长时间中断,可以依次升级node,首先将需要升级的node节点设置污点,将pod资源调度到其它node节点上(如master资源充足也可以临时调用),等到该节点升级完毕后,去除污点。依次类推,将所有节点更新升级 

kubectl taint node node-name key=value:NoExecute
#设置污点
-------------------------------------------------------------------------------
kubectl taint node node-name key:NoExecute-
#去除污点
3.维护操作

作用:阻止新的 Pods 被调度到该节点上。当一个节点被标记为 cordon 时,已经在该节点上运行的 Pods 不会被驱逐,但新的 Pods 不会被调度到这个节点。

使用场景:通常用于节点的维护或升级,确保在维护期间不会有新的工作负载被分配到该节点上。命令示例:kubectl cordon node01

首先,删除node1 node2上面的污点


                        设置的cordon维护策略,默认的污点为NoSchedule

验证一下:

创建两个pod

 

恢复调度

使用 kubectl uncordon node01 命令可以恢复节点的调度状态,允许新的 Pods 调度到该节点上。

 drain 

//kubectl drain 可以让 Node 节点开始释放所有 pod,并且不接收新的 pod 进程。drain 本意排水,意思是将出问题的 Node 下的 Pod 转移到其它 Node 下运行
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data --force
 
--ignore-daemonsets:无视 DaemonSet 管理下的 Pod。
--delete-emptydir-data:如果有 mount local volume 的 pod,会强制杀掉该 pod。
--force:强制释放不是控制器管理的 Pod。

注:执行 drain 命令,会自动做了两件事情:
(1)设定此 node 为不可调度状态(cordon)
(2)evict(驱逐)了 Pod 
 

简单来说

cordon的作用类似于NoSchedule

drain的作用类似于NoExecute

 四、Pod启动阶段 

第一步:controller manager管理的控制器创建pod副本

第二步:scheduler调度器根据调度算法选择最合适的node节点调度pod

第三步:kubelet拉取镜像

第四步:kubelet挂载存储卷

第五步:kubelet创建并运行容器

第六步:kubelet根据容器探针的探测结果设置Pod状态

 

五、关于pod的五种状态

Pending:Pod已经创建,但是Pod还处于包括未完成调度到node节点或者还处于在拉取镜像的过程中、存储卷挂载失败的情况
Running:Pod所有容器已被创建,且至少有一个容器正在运行
Succeeded:Pod所有容器都已经成功退出,且不再重启。(Completed)
Failed:Pod所有容器都已经退出,且至少有一个容器是异常退出的。(Error)
Unknown:master节点的controller manager无法获取到Pod的状态信息,通常是因为master节点的apiserver与Pod所在node节点的kubelet通信失联导致的(比如node节点宕机或kubelet进程故障)
总结:Pod遵循预定于的生命周期,起始于Pend阶段,如果至少有一个容器正常运行,则进Running阶段,之后取决于Pod是否有容器以失败状态退出而进入Succeeded或Failed阶段。

 六、k8s常见的排障手段

针对组件故障

kubectl get nodes                               查看node节点运行状态
kubectl describe nodes <node节点名称>           查看node节点的详细信息和资源描述
kubectl get cs                                  查看master组件的健康状态
kubectl cluster-info                            查看集群信息
 
journalctl -u -f kubelet                        跟踪查看kubelet进程日志

针对pod故障

kubectl get pods -o wide                          查看Pod的运行状态和就绪状态
kubectl describe <pods|其它资源类型> <资源名称>   查看资源的详细信息和事件描述,主要是针对处于Pending状态的故障
kubectl logs <Pod资源名称> -c <容器名称> -f -p    查看Pod容器的主进程日志,主要是针对进入Running状态后的故障,比如Failed异常问题
kubectl exec -it <Pod资源名称> -c <容器名称> sh|bash   进入Pod容器查看容器内部相关的状态信息,比如进程、端口、文件、流量等状态信息
kubectl debug -it <Pod资源名称> --image=<临时工具容器的镜像名> --target=<目标容器>    在Pod中创建临时工具容器进入目标容器进行调试,主要针对没有调试工具的容器使用
nsenter -n --target <容器ID>                   在Pod容器宿主机使用nsenter转换网络namespace,直接在宿主机进入目标容器的网络命名空间进行抓包等调试工作

针对网络故障

kubectl get svc                                查看service资源的clusterIP、port、nodePort等信息
kubectl describe svc <svc资源名称>             查看service资源的标签选择器、endpoints端点等信息
kubectl get pods --show-lables                 查看Pod的标签

故障排除思路

在k8s的操作中,由于组件较多,任何一步有错误,都可能导致整个k8s集群陷入不可以状态,下面我就结合工作中的一些操作做一总结

1.环境设置
防火墙策略、核心防护可能会导致节点之间无法通信

swap分区会导致kubelet无法启动,kubelet无法启动,意味着网络插件与kube-proxy容器无法启动

集群信息:使用kubectl get node查看集群信息,确保节点之间通信正常

2.pod事件处理
kubectl describe <资源类型> <资源名称>:查看资源详细信息

kubectl get events:指令查看所有事件信息,并使用grep过滤关键字 

kubectl exec –it pod_name bash :进入容器查看,只限于处于Running状态

kubectl logs pod_name:查看pod日志,在Failed状态下

journalctl -xefu kubelet:查看kubelet日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/655227.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

149.二叉树:二叉树的前序遍历(力扣)

代码解决 这段代码实现了二叉树的前序遍历&#xff0c;前序遍历的顺序是&#xff1a;访问根节点 -> 递归遍历左子树 -> 递归遍历右子树。以下是详细解释&#xff0c;包括各个部分的注释&#xff1a; // 二叉树节点的定义 struct TreeNode {int val; // 节…

OpenStack创建云主机——超级详细步骤

四、创建云主机 一台云主机成功创建或启动需要依赖OpenStack中的各种虚拟资源&#xff0c;如CPU、内存、硬盘等。如果需要云主机丽娜姐外部网络&#xff0c;还需要网络、路由器等资源。如果需要外部网络访问云主机&#xff0c;那么还需要配置浮动IP。因此&#xff0c;在创建云主…

企业融资新渠道:一文详解动产抵押

在当今瞬息万变的商业环境中&#xff0c;资金是企业发展的血液。面对融资难题&#xff0c;动产抵押作为一种灵活高效的融资方式&#xff0c;越来越受到企业的青睐。本文将为您全面解析动产抵押的概念、流程、优势及注意事项&#xff0c;助力您的企业解锁融资新途径。 什么是动…

怎么看外国的短视频:四川鑫悦里文化传媒有限公司

怎么看外国的短视频&#xff1a;跨文化视角下的观察与思考 随着全球化进程的加速和网络技术的飞速发展&#xff0c;外国短视频逐渐走进了我们的视野。这些来自不同文化背景、语言体系和审美观念的短视频作品&#xff0c;为我们打开了一扇了解世界的窗口。然而&#xff0c;如何…

【vue】封装的天气展示卡片,在线获取天气信息

源码 <template><div class"sen_weather_wrapper"><div class"sen_top_box"><div class"sen_left_box"><div class"sen_top"><div class"sen_city">山东</div><qctc-time cl…

民国漫画杂志《时代漫画》第30期.PDF

时代漫画30.PDF: https://url03.ctfile.com/f/1779803-1248635414-87c8c8?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(九)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 现在&#xff0c;我们…

Flink 通过 paimon 关联维表,内存降为原来的1/4

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

如何破解navicat16

先安装好没破解的navicat16 以管理员身份运行 ‘无限试用Navicat.bat’ 复制这个 点击属性 打开文件所属位置 把复制的文件粘贴进去 直接启动navicat16

常用批处理命令及批处理文件编写技巧

一常用批处理命令 1.查看命令用法&#xff1a;命令 /? //如&#xff1a;cd /? 2.切换盘符目录&#xff1a;cd /d D:\test 或直接输入 d: //进入上次d盘所在的目录 3.切换目录&#xff1a;cd test 4.清屏:cls 5.“arp -a” //它会列出当前设备缓存中的所有…

Golang项目代码组织架构实践

Golang在项目结构上没有强制性规范&#xff0c;虽然这给了开发者很大的自由度&#xff0c;但也需要自己沉淀一套可行的架构。本文介绍了一种项目布局&#xff0c;可以以此为参考设计适合自己的 Golang 项目组织模式。原文: Golang Project Layout Go 有很多强制的或是约定俗成的…

【Mac】Ulysses for Mac(优秀的markdown写作软件) v34.3中文版安装教程

软件介绍 哪款markdown写作软件最好用&#xff1f;小编推荐您使用尤利西斯&#xff1a;Ulysses mac版&#xff01;这是mac上一款优秀的markdown写作工具。Ulysses mac版具备全新的Soulmen写作坏境&#xff0c;采用了革命性的功能增强&#xff0c;结合了最好的部分最小标记&…

60. UE5 RPG 使用场景查询系统(EQS,Environment Query System)实现远程敌人寻找攻击位置

UE的Environment Query System&#xff08;EQS&#xff09;是环境查询系统&#xff0c;它是UE4和UE5中用于AI决策制定过程中的数据采集和处理的一个强大工具。EQS可以收集场景中相关的数据&#xff0c;利用生成器&#xff08;Generator&#xff09;针对用户的测试&#xff08;T…

mysql 按区间统计 3 分钟维度

根据 UNIX_TIMESTAMP 去掉分钟后的的位数 思路如下select UNIX_TIMESTAMP(now()) 当前时间 秒,now() 当前时间,FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP) / (3 * 60)) * (3 * 60)) 3分钟为分隔去掉多余位数当前时间 秒 当前时间 3分钟为分隔去掉多余…

【NumPy】全面解析NumPy的where函数:高效条件操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

哈希冲突的常见解决方法【附C++代码】

在C中&#xff0c;哈希表是一种常用的数据结构&#xff0c;用于实现快速的插入、删除和查找操作。 哈希表的核心在于哈希函数&#xff0c;它将输入的关键字转换为一个数组索引。然而&#xff0c;不同的关键字可能映射到相同的索引&#xff0c;这种情况称为哈希冲突。 有效地解…

k8s中的集群调度

文章目录 k8s中的集群调度Pod 创建流程 通过指定节点来创建pod所在的node节点通过标签来指定pod创建在哪个节点上pod 的亲和性Pod的亲和性和反亲和性亲和性&#xff08;Affinity&#xff09;反亲和性&#xff08;Anti-Affinity&#xff09; 污点与容忍污点&#xff08;Taint&am…

2024年,史上最强的数据库资料集合

&#x1f4a8;&#x1f3f9;&#x1f300; 2024年&#xff0c;史上最强的数据库资料集合 N种数据库的全方位整理&#xff1a; mysql&#xff0c;mariaDB&#xff0c;Percona Server&#xff0c;Redis&#xff0c;RocksDB&#xff0c;Cassandra&#xff0c;CouchDB&#xff0c…

【LeeCode算法】第67题:二进制求和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;将a和b两个字符串转换成十进制&#xff0c;然后将相加的结果转换回文本的二进制。 2. 代码&#xff1a; char* addBinary(char* a, char* b) {int a_len strlen(a);i…

保障餐饮场所安全:可燃气体报警器专业检测的必要性

在餐饮行业&#xff0c;火灾隐患一直是备受关注的问题。为了有效预防和及时发现可燃气体泄漏&#xff0c;可燃气体报警器的专业检测周期显得尤为重要。 今天&#xff0c;佰德和大家一起来深入了解一下可燃气体报警器的专业检测周期&#xff0c;若您对此有不同的观点或其他的问…