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

这篇具有很好参考价值的文章主要介绍了kubernetes 节点排水维护 cordon, drain, uncordon。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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
kubectl uncordon,kubernetes,容器,云原生
查看当前tomcat两个副本运行在node1两个节点上;
kubectl get pod -o wide
kubectl uncordon,kubernetes,容器,云原生
2)使用cordon命令将node1标记为不可调度;
kubectl cordon node1-192.168.52.132
kubectl uncordon,kubernetes,容器,云原生
再使用kubectl get nodes查看节点状态,发现node1虽然还处于Ready状态,但是同时还被禁能了调度,这意味着新的pod将不会被调度到node1上。
再查看tomcat状态,没有任何变化,两个副本仍运行在node1上;
kubectl get pod -o wide
kubectl uncordon,kubernetes,容器,云原生
3)执行drain命令,将运行在node1上运行的pod平滑的赶到其他节点上;
kubectl drain node1-192.168.52.132
kubectl uncordon,kubernetes,容器,云原生
再查看tomcat的状态发现,node1上的副本已经被迁移到node2上;这时候就可以对node1进行一些节点维护的操作,如升级内核,升级Docker等;
kubectl get pod -o wide
kubectl uncordon,kubernetes,容器,云原生
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 #设置不可调度

实际应用文章来源地址https://www.toymoban.com/news/detail-760106.html

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

到了这里,关于kubernetes 节点排水维护 cordon, drain, uncordon的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • kubernetes集群划分节点

    Kubernetes(K8s)是一个用于管理容器化应用程序的开源平台,可以帮助开发人员更轻松地部署、管理和扩展应用程序。在Kubernetes中,集群划分是一种重要的概念,可以帮助我们更好地组织和管理集群中的节点和资源。 本文将介绍如何使用Kubernetes对集群进行划分,并提供详细的

    2024年02月05日
    浏览(73)
  • Kubernetes集群添加新集群节点

    参考文档https://gitee.com/open-hand/kubeadm-ha/blob/release-1.21/docs/02/%E6%B7%BB%E5%8A%A0%20worker%20%E8%8A%82%E7%82%B9.md 添加工作节点与集群安装时初始化工作节点一样,可以在主节点上执行,也可以在要加入的节点执行,只要执行主机安装ansible,并且可以访问主节点及要加入的新节点即可 待加入

    2024年02月09日
    浏览(35)
  • Kubernetes高可用集群二进制部署(六)Kubernetes集群节点添加

    Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署(一)主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署(二)ETCD集群部署 Kubernetes高可用集群二进制部署(三)部署api-server Kubernetes高可用集群二进制部署(四)部署kubectl和kube-controller-man

    2024年02月14日
    浏览(38)
  • Kubernetes系列-如何在k8s集群中发现节点是主节点还是工作节点

    在K8s集群中,每个集群都有一组节点,其中一些是master节点,另一些是工作节点,那么如何区别哪些是master节点,哪些是工作节点?有三种判断方式: 1 进程方式 根据系统进程确认,运行 api-server 、 kube-controller-management 和 kube-scheduler 的 node 是 master 节点。运行kubelet和kube-p

    2024年02月13日
    浏览(33)
  • 云原生 黑马Kubernetes教程(K8S教程)笔记——第一章 kubernetes介绍——Master集群控制节点、Node工作负载节点、Pod控制单元

    参考文章:kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为

    2024年02月04日
    浏览(40)
  • 【二】kubernetes master单节点拓展为集群

    #服务器 #部署 #云原生 #k8s 栏目全部章节 一、ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3 二、kubernetes master单节点拓展为集群 三、kubernetes kuboard部署分布式系统 接上文中,我们已经部署好了单节点master的k8s集群,在生产环境中,单节点的master肯定是不行的,那么我们

    2024年02月10日
    浏览(48)
  • 利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

    作者:Rick Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上。 熟悉 Jenkins 的用户,都知道 Jenkins 支持多种类型的构建节点,例如:固定配置、动态配置。而节点与控制器连接的方式, 又包括:JNLP、SSH

    2024年02月04日
    浏览(21)
  • 当节点内存管理遇上 Kubernetes:自动调度与控制

    在现代的容器化环境中,节点资源的管理是一个重要的任务。特别是对于内存资源的管理,它直接影响着容器应用的性能和可用性。在 Kubernetes 中,我们可以利用自动调度和控制的机制来实现对节点内存的有效管理。本文将介绍一种基于 Bash 脚本的节点内存管理方案,并探讨

    2024年02月07日
    浏览(27)
  • Kubernetes实战(十六)-k8s节点打标签

    pod可以根据调度策略让pod调度到想要的节点上运行,或者不在某节点运行。 3.1.1 生成deployment文件 3.1.2 执行生成pod  3.1.3 查看结果  迁移过程相当于删除当前节点pod,再在新node上生成pod,生产环境操作时需要谨慎。 3.2.1 调整pod运行标签 3.2.2 查看结果   pod已经切换至ops-wor

    2024年01月16日
    浏览(38)
  • 【云原生】Kubernetes二进制--多节点Master集群高可用

    作用 :实现高可用 apiserver 对外安全通信端口 6443 ,对内端口 8080 1、实现高可用方法 etcd:etcd群集至少是3副本,奇数台,通过raft算法,保证数据的一致性 node节点:承载业务,跟Master进行对接 master节点:高可用使用keepalived+LB方案,keepalived能够提供VIP和主备,LB实现负载均衡

    2024年02月04日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包