kubernetes 节点维护 cordon, drain, uncordon

news2024/9/21 10:53:47

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/714380.html

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

相关文章

“物联网IOT”技术在智能化数据中心低压配电系统中的运用

物联网、区块链、云计算、人工智能等新技术的发展让人们能够用新的方式更方便地获取和管理信息,已成为数字化转型的主要推动力。所谓物联网(The Internet of Things,简称IOT),是互联网基础上的延伸和扩展的网络&#x…

python接口自动化(十二)--https请求(SSL)(详解)

简介 本来最新的requests库V2.13.0是支持https请求的,但是一般写脚本时候,我们会用抓包工具fiddler,这时候会 报:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 小编…

Nginx(7)Nginx实现服务器端集群搭建

Nginx集群搭建 Nginx与Tomcat部署Nginx实现动静分离Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedKeepalived配置文件keepalived之vrrp_script Nginx制作下载站点Nginx的用户认证模块 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解,我们…

css3 弹性布局flex

文章目录 flex弹性盒子flex-direction 决定主轴的方向flex-wrap 换行flex-flow flex-direction和flex-wrap的简写属性justify-content 定义了弹性子元素在主轴上的对齐方式align-items 定义弹性子元素在交叉轴上如何对齐align-content 定义了多根轴线的对齐方式order 定义弹性子…

网络安全合规-数据安全治理的重要性

数据安全治理能力评估框架将数据安全治理分为三大层次,即数据安全战略、数据全生命周期安全和基础安全[3]。数据安全战略指组织的数据安全顶层规划,起到为数据安全治理“搭框架”“配人手”的作用;数据全生命周期安全指组织在数据全生命周期的…

PDF转换成CAD怎么转换?分享几种快速转换方法

CAD 文件通常具有比 PDF 文件更高的精度。这是因为 CAD 文件是为设计和制造目的而创建的,而 PDF 文件则是为共享和打印目的而创建的。因此,将 PDF 转换成 CAD 可以提高设计的精度和准确性。CAD 文件可以通过精确的尺寸、角度、线型和曲线来描述物体。这使…

c++崩溃调试总结

个人博客地址: https://cxx001.gitee.io windows上程序崩溃调试 场景1 调用第三方dll崩溃 调试需求 需要第三方提供对应的pdb和源码。 调试步骤 把dll 、pdb和exe程序放同级目录。在调用dll崩溃的地方打上断点,F5运行,第一次调试需要选择dll对应源码…

javaweb知识初汇总

前言: 本文主要介绍了JavaWeb前端开发的以下几个方面: 1. HTML/CSS:使用HTML和CSS进行页面结构和样式的设计与布局。 2. JavaScript:使用JavaScript进行页面的交互和动态效果的实现。 3. 前端框架:使用前端框架如V…

CSV文件简单介绍(逗号分隔值Comma-Separated Values)

文章目录 CSV文件CSV文件优点 CSV对比Excel xlsx文件CSV文件应用场景CSV文件使用示例用Python生成CSV文件将Excel文件导出为CSV文件 CSV文件 CSV是逗号分隔值(Comma-Separated Values)的缩写,是一种常见的电子表格文件格式。CSV文件以纯文本…

【图像处理】去雾源码收集(halcon、python、C#、VB、matlab)

【图像处理】去雾代码收集(附halcon、python、C#、VB、matlab源码) 一、halcon算法1.1 halcon算法源码1.2 halcon算法效果图![在这里插入图片描述](https://img-blog.csdnimg.cn/8ad5217a59be4de29b5a7b6eee997b85.png#pic_center) 二、opencv算法2.1 py…

对弈人工智能!myCobot 280开源六轴机械臂Connect 4 四子棋对弈

Connect 4 myCobot280 Introduction Hi,guys.今天我们来介绍一下人工智能下棋,我们将用机械臂来作为对手跟你进行下棋。 人工智能下棋的研究可以追溯到20世纪50年代。当时,计算机科学家开始探索如何编写程序,使计算机能够下象棋。其中最著…

【React组件通讯的三种方式】

React组件通讯的三种方式 父组件传递数据给子组件子组件传递数据给父组件 React组件之间的通讯分为三种: 父组件 →子组件子组件 →父组件兄弟组件 父组件传递数据给子组件 步骤: 父组件提供要传递的state数据给子组件标签添加属性,值为st…

Spring Boot 中的分布式配置中心:什么是它,原理及如何使用

Spring Boot 中的分布式配置中心:什么是它,原理及如何使用 在分布式应用程序中,配置管理是一项重要的任务。通常情况下,配置信息被硬编码在应用程序中,这样一来,当应用程序需要相应的配置信息时&#xff0…

$.ajax 怎么进行 json请求

$.ajax请求默认是form表单的格式,这次给到的接口需要的是json的格式,一开始只是将dataType调整为application/json; charsetutf-8,在f12看到的确实是将请求方式改变了,但是参数格式不对劲,应该是个json对象才对 通过查…

PyTorch示例——ResNet34模型和Fruits图像数据

PyTorch示例——ResNet34模型和Fruits图像数据 前言导包数据探索查看数据集构建构建模型 ResNet34模型训练绘制训练曲线 前言 ResNet34模型,做图像分类数据使用水果图片数据集,下载见Kaggle Fruits Dataset (Images)Kaggle的Notebook示例见 PyTorch——…

android_mars老师_蓝牙学习1

实现功能: 查看本机是否有蓝牙功能、扫瞄周边蓝牙获取其地址。 效果展示: 具体流程: AndroidManifest.xml配置蓝牙权限activity_main.xml绘制页面_按钮MainActivity实现:点击事件监听按钮------>创建一个bluetoothAdapter对…

Check Point R81.20 Gaia - 下一代防火墙 (NGFW)

Check Point R81.20 Gaia - 下一代防火墙 (NGFW) Quantum Security Gateway 请访问原文链接:https://sysin.org/blog/check-point-r81/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org Quantum Security Gateway a…

执行shell脚本时,提示:第xxx行:[: xxxxxxxxxxxxxxxxxxxxxxxxxxxx:需要一元表达式

定位到 283行看看情况。。。 # ... 此处省略诸多脚本命令isContinue1for item_id in "${ENABLE_BURNER_ARRAY[]}"doif [ $item_id $idd_serial ];then isContinue0continuefidoneif [ $isContinue -eq 0 ];thencontinuefi# ... 此处省略诸多脚本命令# 该行即为 283行…

入侵排查与响应-window和linux版

目录 (一)关于这方面的一些简单了解 1、我们的电脑为什么会被黑客入侵 2、黑客攻击的方式 (二)window入侵排查 1、查看异常特征 2、系统账户安全 3、检测异常端口、进程 4、查看启动项、计划任务、服务 5、检查系统相关信…

三、eureka-server端和客户端配置文件讲解

常用配置文件设置 通过这张图理解为什么要进行文件配置 server 中常用的配置 server:port: 8761spring:application:name: eureka-servereureka:client:service-url: #eureka 服务端和客户端的交互地址,集群用,隔开defaultZone: http://localhost:8761/eureka #自己注册自…