关于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: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: soscscs/myapp:v1tolerations:- 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 值时,表示容忍所有的污点 keytolerations:- 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日志

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

【算法】位运算算法——判断字符是否唯一

题解&#xff1a;判断字符是否唯一(位运算算法) 目录 1.题目2.题解3.位图参考代码4.细节5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 题解有两种方法&#xff0c; 一是做一个哈希数组&#xff0c;去查重&#xff1b; 二是直接用一个变量每一位来对应表示是否有这个字母…

Android - failed to set system property

记录一次疏忽&#xff0c;起因是我需要在自定义的 receiver 中保存 property 方便&#xff0c;方便在三方 app 中使用&#xff0c;结果直接崩溃了&#xff0c;虽然结果保存成功了&#xff0c;但是这种情况也是无法接收的&#xff0c;错误日志如下&#xff1a; M006082 05-25 1…

场景题11111

关单操作&#xff1f; 优先考虑定时任务、Redissonredis、RocketMQ延迟消息实现&#xff08;订单量特别大的时候&#xff0c;不建议使用MQ&#xff09; 每个订单都有一个消息会增加资源消耗可靠性问题&#xff08;丢失&#xff09;大量的无效消息不是所有消息队列都支持一般通…

PID控制中的积分到底是什么,为什么它可以将矩形线转换为曲线?simulink搭建PID控制,积分模块1/s

PID控制中的积分到底是什么&#xff0c;为什么它可以将矩形线转换为曲线&#xff0c; 这个问题呢其实道理很简单&#xff0c;用到的是初中的知识 我们做几个测试案例 如下面matlab搭建了积分1/s 那显示如下&#xff08;红色曲线相当于加速度、蓝色曲线相当于速度&#xff09;&a…

5.28_Java语法_运算符,接收键盘数据

1、运算符 具体应用同我C语言操作符详解博客相同,另有补充会直接写 1.1、基本的算术运算符、符号做连接符 CSDN 具体应用同我C语言操作符详解博客相同 符号做连接符&#xff1a; ""符号与字符串运算连用的时候是用作连接符的&#xff0c;其结果依然是一个字符串…

前端响应式期末作品

网页设计成品_前端响应式 主题&#xff1a;租房网站&#xff0c;共6个html页面&#xff0c;包含首页&#xff0c;登录注册&#xff0c;租房新闻&#xff0c;租房精选&#xff0c;租房详情&#xff0c;数据可视化页面&#xff08;可以修改内容&#xff09; 采用技术&#xff1a;…

启动ChatGPT 的快捷键,探索全新 ChatGPT MacOS 应用程序!

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

深度解析Java 11核心新特性

码到三十五 &#xff1a; 个人主页 < 免责声明 > 避免对文章进行过度解读&#xff0c;因为每个人的知识结构和认知背景都不同&#xff0c;没有一种通用的解决方案。对于文章观点&#xff0c;不必急于评判。融入其中&#xff0c;审视自我&#xff0c;尝试从旁观者角度认清…

软考结束。有什么要说的

1. 竟然是机试&#xff0c;出乎我意料。是 考试机构觉得笔试成本高了么。这次的考试是机试&#xff0c;相比以往有所不一样。感言是不是以后都会在固定地点考试也说不准。 2. 遇到年轻人。 这次旁边的一个女同学第一次参加&#xff0c;还像我询问了一些关于软考的事。我是有…

关于学习Go语言的并发编程

开始之前&#xff0c;介绍一下​最近很火的开源技术&#xff0c;低代码。 作为一种软件开发技术逐渐进入了人们的视角里&#xff0c;它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式&#xff0c;以更少的编码&#xff0c;更快速地构建和交付应用软件&#…

【数据结构】直接选择排序详解!

文章目录 1.直接选择排序 1.直接选择排序 &#x1f427; begin 有可能就是 maxi &#xff0c;所以交换的时候&#xff0c;要及时更新 maxi &#x1f34e; 直接选择排序是不稳定的&#xff0c;例如&#xff1a; 9 [9] 5 [5]&#xff0c;排序后&#xff0c;因为直接选择排序是会…

Debug-012-el-popover 使用 doClose() 关闭窗口不生效的处理方案

前言&#xff1a; 今天上午碰见一个非常奇怪的情况&#xff1a;一样的方法实现的功能&#xff0c;效果却不一样。 两个页面都是使用的doClose()去关闭的el-popover&#xff0c;其中有一个就是不生效&#xff0c;找不同找了半天&#xff0c;始终不得其解。请看效果吧&#xff1…

Day 5:2785. 将字符串中的元音字母排序

Leetcode 2785. 将字符串中的元音字母排序 给你一个下标从 0 开始的字符串 s &#xff0c;将 s 中的元素重新 排列 得到新的字符串 t &#xff0c;它满足&#xff1a; 所有辅音字母都在原来的位置上。更正式的&#xff0c;如果满足 0 < i < s.length 的下标 i 处的 s[i] …

【第5章】SpringBoot整合Druid

文章目录 前言一、启动器二、配置1.JDBC 配置2.连接池配置3. 监控配置 三、配置多数据源1. 添加配置2. 创建数据源 四、配置 Filter1. 配置Filter2. 可配置的Filter 五、获取 Druid 的监控数据六、案例1. 问题2. 引入库3. 配置4. 配置类5. 测试类6. 测试结果 七、案例 ( 推荐 )…

移动端开发 笔记01

目录 01 移动端的概述 02 移动端的视口标签 03 开发中的二倍图 04 流式布局 05 弹性盒子布局 01 移动端的概述 移动端包括:手机 平板 便携式设备 目前主流的移动端开发: 安卓设备 IOS设备 只要移动端支持浏览器 那么就可以使用浏览器开发移动端项目 开发移动端 使用…

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

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

golang中的md5、sha256数据加密文件md5/sha256值计算步骤和运行内存图解

在go语言中对数据计算一个md5&#xff0c;或sha256和其他语言 如java, php中的使用方式稍有不同&#xff0c; 那就是要加密的数据必须通过流的形式写入到你创建的Hash对象中。 Hash数据加密步骤 1. 先使用对应的加密算法包中的New函数创建一个Hash对象&#xff0c;(这个也就是…

leetCode. 85. 最大矩形

leetCode. 85. 最大矩形 部分参考上一题链接 leetCode.84. 柱状图中最大的矩形 此题思路 代码 class Solution { public:int largestRectangleArea( vector<int>& h ) {int n h.size();vector<int> left( n ), right( n );stack<int> st;// 求每个矩形…

vue/uniapp 企业微信H5使用JS-SDK

企业微信H5需要我们使用一些SDK方法如获取外部联系人userid 获取当前外部联系人userid 使用SDK前提是如何通过config接口注入权限验证配置 使用说明 - 接口文档 - 企业微信开发者中心 当前项目是vue项目&#xff0c;不好直接使用 引入JS文件&#xff0c;但我们可以安装依赖…