kubernetes 节点排水维护 cordon, drain, uncordon

news2024/10/5 13:22:07

1.这三个命令是正式release的1.2新加入的命令,三个命令一起介绍,是因为三个命令配合使用可以实现节点的维护。在1.2之前,因为没有相应的命令支持,如果要维护一个节点,只能stop该节点上的kubelet将该节点退出集群,是集群不在将新的pod调度到该节点上。如果该节点上本生就没有pod在运行,则不会对业务有任何影响。如果该节点上有pod正在运行,kubelet停止后,master会发现该节点不可达,而将该节点标记为notReady状态,不会将新的节点调度到该节点上。同时,会在其他节点上创建新的pod替换该节点上的pod。这种方式虽然能够保证集群的健壮性,但是任然有些暴力,如果业务只有一个副本,而且该副本正好运行在被维护节点上的话,可能仍然会造成业务的短暂中断。

1.2中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。

如下图所示是一个整个的节点维护的流程(为了方便demo增加了一些查看节点信息的操作):

1)首先查看当前集群所有节点状态,可以看到共两个节点都处于ready状态;

kubectl get nodes
在这里插入图片描述
查看当前tomcat两个副本运行在node1两个节点上;
kubectl get pod -o wide
在这里插入图片描述
2)使用cordon命令将node1标记为不可调度;
kubectl cordon node1-192.168.52.132
在这里插入图片描述
再使用kubectl get nodes查看节点状态,发现node1虽然还处于Ready状态,但是同时还被禁能了调度,这意味着新的pod将不会被调度到node1上。
再查看tomcat状态,没有任何变化,两个副本仍运行在node1上;
kubectl get pod -o wide
在这里插入图片描述
3)执行drain命令,将运行在node1上运行的pod平滑的赶到其他节点上;
kubectl drain node1-192.168.52.132
在这里插入图片描述
再查看tomcat的状态发现,node1上的副本已经被迁移到node2上;这时候就可以对node1进行一些节点维护的操作,如升级内核,升级Docker等;
kubectl get pod -o wide
在这里插入图片描述
4)节点维护完后,使用uncordon命令解锁node1,使其重新变得可调度;
kubectl uncordon node1-192.168.52.132
检查节点状态,发现node1重新变回Ready状态。
kubectl get nodes

若想去掉某个节点,可以直接 只有kubectl delete node ip 则就会直接把节点删除了。

若想把这个节点再从新加入,只需要重启节点的kubelet kube-proxy 就可以了

2.Node节点禁止调度(平滑维护)方式- cordon,drain,delete

cordon、drain和delete三个命令都会使node停止被调度,后期创建的pod不会继续被调度到该节点上,但操作的暴力程度却不一样。

一、cordon 停止调度(不可调度,临时从K8S集群隔离)

影响最小,只会将node标识为SchedulingDisabled不可调度状态。
之后K8S再创建的pod资源,不会被调度到该节点。
旧有的pod不会受到影响,仍正常对外提供服务。
禁止调度命令"kubectl cordon node_name"。
恢复调度命令"kubectl uncordon node_name"。(恢复到K8S集群中,变回可调度状态)
二、drain 驱逐节点(先不可调度,然后排干)

首先,驱逐Node上的pod资源到其他节点重新创建。
接着,将节点调为SchedulingDisabled不可调度状态。
禁止调度命令"kubectl drain node_name --force --ignore-daemonsets --delete-local-data"
恢复调度命令"kubectl uncordon node_name"。(恢复到K8S集群中,变回可调度状态)
drain方式是安全驱逐pod,会等到pod容器应用程序优雅停止后再删除该pod。
drain驱逐流程:先在Node节点删除pod,然后再在其他Node节点创建该pod。所以为了确保drain驱逐pod过程中不中断服务(即做到"无感知"地平滑驱逐),必须保证要驱逐的pod副本数大于1,并且采用了"反亲和策略"将这些pod调度到不同的Node节点上了!也就是说,在"多个pod副本+反亲和策略"的场景下,drain驱逐过程对容器服务是没有影响的。
需要注意:

对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod。
drain安全驱逐方式将会允许 pod 里面的容器遵循指定的 PodDisruptionBudgets 执行优雅中止。也就是说,drain安全驱逐可以做到:优雅地终止pod里的容器进程。
kubectl drain 返回成功表明所有的 pod (除了排除的那些)已经被安全驱逐(遵循期望优雅的中止期,并且没有违反任何应用程序级别的中断预算)。
然后,通过对物理机断电或者在云平台上删除节点所在的虚拟机,都能安全的将节点移除。
默认情况下,kubectl drain 会忽略那些不能杀死的系统类型的 pod。drain命令中需要添加三个参数:–force、–ignore-daemonsets、–delete-local-data

–force 当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候就需要用–force来强制执行 (例如:kube-proxy)
–ignore-daemonsets 无视DaemonSet管理下的Pod。即–ignore-daemonsets往往需要指定的,这是因为deamonset会忽略unschedulable标签(使用kubectl drain时会自动给节点打上不可调度标签),因此deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,这样就会成为死循环.因此这里忽略daemonset。
–delete-local-data 如果有mount local volumn的pod,会强制杀掉该pod。

drain禁止调度的操作步骤:

确定要排空的节点的名称

# kubectl get nodes

  

查看pod

# kubectl get po

命令node节点开始释放所有pod,并且不接收新的pod进程

# kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data

此时可以对该node节点进行平滑维护,后续需要恢复到k8s集群中:

# kubectl uncordon [node-name]

delete 删除节点

首先,驱逐Node节点上的pod资源到其他节点重新创建。
驱逐流程:先在Node节点删除pod,然后再在其他Node节点上创建这些pod。
node节点删除,master失去对其控制,该节点从k8s集群摘除。
delete是一种暴力删除node的方式。在驱逐pod时是强制干掉容器进程,做不到优雅终止Pod。相比较而言,显然drain更安全。

Node节点平滑维护

通常情况下,如果要对K8S集群中的一台Node节点进行平滑维护,如升级或调整配置。正确的操作:

cordon临时从K8S集群隔离出来,标识为SchedulingDisabled不可调度状态。
drain排干该节点上的pod资源到其他node节点上。
对该节点展开平滑维护操作,如升级或调整配置。
uncordon恢复,重新回到K8S集群,变回可调度状态。
同时注意:为了确保drain驱逐pod的时候,容器应用服务不中断,必须满足:

要驱逐的pod副本数量必须大于1
要配置"反亲和策略",确保被驱逐的pod被调度到不同的Node节点上
deployment采用滚动更新,设置maxUnavailable为0,maxSurge为1

kubectl cordon   node1 #设置不可调度
kubectl uncordon node1 #恢复可调度
kubectl drain node1 --force --ignore-daemonsets #设置不可调度

实际应用

kubectl get nodes
kubectl get pod -A -o wide | grep cn-shenzhen.10.0.14.48 | grep yxyw  
kubectl drain cn-shenzhen.10.0.14.48 --force --ignore-daemonsets --delete-local-data
kubectl uncordon cn-shenzhen.10.0.14.48

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

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

相关文章

Java-API简析_java.net.InetAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131590559 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

git因网络问题报错

Failed to connect to github.com port 443 after 21051 ms: Couldnt connect to server Recv failure: Connection was reset 你是否最近也有遇到这种情况呢? 公司项目目前保存在github上, 在 git pull 和 git push 的时候总是遇到以上情况 也是困扰了我不少…

ESP32-C2 固件烧录需满足的硬件环境整理

ESP32-C2 默认通过 UART0 (即 TXD(GPIO20)和 RXD(GPIO19))下载固件。 Windows 下可使用 Flash download tool 工具来下载编译后的 bin 文件; 运行 flash_download_tool.exe 的文件 选择开发…

2023 最新互联网大厂Java面经分享:25 分类、1000 道 Java 面试真题(50w 字解析)

作为 Java 程序员,选择学习什么样的技术?什么技术该不该学?去招聘网站上搜一搜、看看岗位要求就十分清楚了,自己具备的技术和能力,直接影响到你工作选择范围和能不能面试成功。 如果想进大厂,那就需要在 Ja…

数据库-分布式数据库历史变迁之旅

我们正式开始分布式数据库历史变迁之旅。 单机数据库的不可能三角 正如经济政策的不可能三角“不可能同时实现资本流动自由,货币政策的独立性和汇率的稳定”那样,单机数据库也有一个不可能三角,那就是:①持久化 ②事务隔离 ③高性…

17款奔驰S400加装原厂无钥匙进入系统,提升您的便利性

奔驰无钥匙进入功能,只要身上装着车钥匙进入车内,车辆就能感应到钥匙的存在,这时只需按下启动键就可启动车辆了 奔驰无钥匙进入功能主要有两大使用体验,首先就是要注意主驾驶位车门的有效检测距离不小于1.5m,其他门钥匙…

BOM/PCB/Gerber比对功能再升级,华秋DFM新版邀您体验!

在电子产品开发过程中,方案选型、原理图设计、BOM制作、PCB设计再到PCB、PCBA的生产都会经历多次版本迭代。在硬件开发过程中BOM文件的迭代、PCB设计的版本迭代是最为常见的,所以对应的版本管控至关重要,只有清晰地了解不同版本的差异&#x…

武汉理工大学第四届ACM校赛

武汉理工大学第四届ACM校赛传送门 A-ST和TS回文问题 这种题都是有一定简单的规律的 如果每个字符都相等的话,肯定存在 如果字符串T的长度是字符串S的整数倍的话,如果字符串S是回文串或者T的长度是S的长度的奇数倍的话,那么存在 否则不存在 就自己构造字符串来找规律&…

121.实战网页图片优化

如上图所示,这个图标的内部尺寸为14791459,但是我们实际呈现的渲染的效果为570562;所以我们可以调整一下图像的大小,缩小图片的文件大小; 我们可以修改他的尺寸,文件的大小就缩小了。但是在网页上显示一点区…

软件测试之单元测试详解

目录 前言: 1、什么是单元测试? 2、什么是好的单元测试? 3、怎么写单元测试? 4、玩转单元测试 前言: 单元测试是软件测试中的一种测试方法,用于验证代码中最小可测试单元的正确性。它主要关注对程序的…

云上百世慧|「慧」聚智能制造的全流程质量管控(我们在7月31日等你)

在制造业的迅猛发展中,「质量管控」一直是企业面临的重要挑战和痛点。如何对「原材料、组件、生产过程和最终产品」进行严格的监控和控制? 稳抓行业痛点,优化质量流程 质量管控,是确保产品符合标准的关键环节。通过严格的监控和控…

卸载mathtype导致的word问题 MathPage.wll not found

MathType 6.9简体中文版是一款功能很强大的数学公式编辑器,但是因为不明原因,有时会出现找不到MathType.dll或者MathPage.wll文件找不到的错误窗口提示,而导致软件无法正常使用,本文将教您解决MathPage.wll或MathType.dll文件找不到的问题。 错误提示&a…

5 给属性赋值的几种方式

首先创建两个类,Person和Dog。为了可以被扫描到,在前面加入Component注解。 Person类如下: package jiang.com.helloworld.pojo;import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.…

React 之 过渡动画

一、React的过渡动画 在开发中,我们想要给一个组件的显示和消失添加某种过渡动画,可以很好的增加用户体验 可以通过原生的CSS来实现这些过渡动画,但是React社区为我们提供了react-transition-group用来完成过渡动画 React曾为开发者提供过动画…

MySQL表/用户权限等基本操作

MySQL表操作练习题: 第一题: 具体要求如下所示: 1. 创建数据库Market: CREATE DATABASE Market;2. 创建customers表: 表结构如图所示: CREATE TABLE customers( c_num INT(11) PRIMARY KEY, c_name…

TiDB(8):技术内幕之计算

1 关系模型到 Key-Value 模型的映射 在这我们将关系模型简单理解为 Table 和 SQL 语句,那么问题变为如何在 KV 结构上保存 Table 以及如何在 KV 结构上运行 SQL 语句。 假设我们有这样一个表的定义: CREATE TABLE User {ID int,Name varchar(20),Role …

基于springboot+vue的文超市进销存管理系统(源代码+数据库+12000字论文)083

基于springbootvue的文超市进销存管理系统(源代码数据库12000字论文)083 一、系统介绍 (本项目有ssmvue版本) 本系统分为管理员、用户、员工三种角色 用户角色包含以下功能: 登录、注册、购物车、订单提交、商品评论、收藏、充值、收货地址管理、收藏管理、订单…

NXP-无感BLDC代码MCSPTE1AK116_BLDC_6Step代码详解

目录 开发平台 工程目录 Generated_Code Sources Config 电机的参数 BLDC参数 无感模式下的一些参数 Peripherals FTM/PDB/ADC配置参数 actuate_s32k meas_s32k motor_structure state_machine main main()主函数 PORT_IRQHandler() PDB0_IRQHandler() FTM1…

最大正方形 · Maximal Square

链接: 题解:九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 1.暴力的方法:遍历每一个(i,j)位置,如果当前点为1,则以当前节点为…

如何编写PlantUml文本绘图时序图

效果如图 代码示例 startumlparticipant "上游" as BEGIN participant "SFTP" as SFTP control "文件系统" as FILE participant "业务系统" as BUSactivate BEGIN BEGIN ->SFTP: 上传文件 activate SFTP autonumber 1.0 FILE -&g…