【k8s】K8S中的cordon、uncordon和drain 冻结节点、驱离pod

Kubernetes(K8s)中使用Kubectl 命令行工具管理 Kubernetes 集群。 kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。 可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。本文主要介绍Kubernetes(K8s)中kubectl cordon, drain, uncordon 常用命令。

1、Kubectl语法

html 复制代码
kubectl cordon NODE
kubectl drain NODE
kubectl uncordon NODE

cordon, drain, uncordon:命令是正式release的1.2新加入的命令,三个命令需要配合使用可以实现节点的维护。

在1.2之前,由于没有相应的命令支持,如果要维护一个节点,只能stop该节点上的kubelet将该节点退出集群,是集群不在将新的pod调度到该节点上。如果该节点上本身就没有pod在运行,则不会对业务有任何影响。如果该节点上有pod正在运行,kubelet停止后,master会发现该节点不可达,而将该节点标记为notReady状态,不会将新的节点调度到该节点上。同时,会在其他节点上创建新的pod替换该节点上的pod。

如此虽能够保证集群的健壮性,但可能还有点问题,如果业务只有一个副本,而且该副本正好运行在被维护节点上的话,可能仍然会造成业务的短暂中断。

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

如下是整个的节点维护的流程:

1)首先查看当前集群所有节点状态,例如共有四个节点都处于ready状态;

2)查看当前nginx两个副本分别运行在d-node1和k-node2两个节点上;

3)使用cordon命令将d-node1标记为不可调度;

4)再使用kubectl get nodes查看节点状态,发现d-node1虽然还处于Ready状态,但是同时还能被禁调度,代表新的pod将不会被调度到d-node1上。

5)再查看nginx状态,没有任何变化,两个副本仍运行在d-node1和k-node2上;

6)执行drain命令,将运行在d-node1上运行的pod平滑的赶到其他节点上;

可以不用驱离,也可以使用delete po 让其重生至其他节点

7)再查看nginx的状态发现,d-node1上的副本已经被迁移到k-node1上;此时就可以对d-node1进行一些节点维护的操作,如升级内核,升级Docker等;

8)节点维护完后,使用uncordon命令解锁d-node1,使其重新变得可调度;

9)检查节点状态,发现d-node1重新变回Ready状态。

K8S中的cordon、uncordon和drain https://www.jianshu.com/p/752be98e9077

例子:

k8s集群节点只扩容CPU和内存,扩容后的配置为CPU=xxxC,MEM=xxxG

Deployment副本数缩容

html 复制代码
while read line;do kubectl scale -n live deploy $line --replicas=1;done < /root/xxx.txt

设置节点不可调度,逐台进行

html 复制代码
kubectl cordon xxx-node-01
kubectl cordon xxx-node-02
kubectl cordon xxx-node-03

驱逐节点上的pod,逐台进行

html 复制代码
kubectl drain xxx-node-01 --force --ignore-daemonsets
kubectl drain xxx-node-02 --force --ignore-daemonsets
kubectl drain xxx-node-03 --force --ignore-daemonsets

扩容完毕恢复节点可调度

html 复制代码
kubectl uncordon xxx-node-01
kubectl uncordon xxx-node-02
kubectl uncordon xxx-node-03

服务恢复双副本

html 复制代码
while read line;do kubectl scale -n live deploy $line --replicas=2;done < /root/xxx.txt

参考

K8S中的cordon、uncordon和drain

相关推荐
名字还没想好☜8 小时前
用 systemd 托管后台服务:Restart 策略、日志接管、资源限制与开机自启全踩一遍
运维·docker·kubernetes
动力 continue8 小时前
docker容器大舞台,创建镜像,构造类,基础速通
docker·容器
Akiyama_Mio-Kon9 小时前
2026 最新:Dify 本地 Docker 部署完整教程(Windows + Git Bash)
windows·git·docker
野熊佩骑12 小时前
Kubernetes实战系列文章(三) 之 K8S运维常用命令
linux·运维·docker·微服务·云原生·容器·kubernetes
一个向上的运维者15 小时前
Kubernetes 网络三部曲:CNI、kube-proxy 与 CoreDNS 是如何协作的?
网络·容器·kubernetes
DolitD15 小时前
实时云渲染多应用并发:CELL容器技术突破3D隔离瓶颈
云原生·容器·实时互动·图形渲染·数据可视化
鹤落晴春15 小时前
【K8s】Kustomize管理
云原生·容器·kubernetes
石小千16 小时前
Docker 笔记(九)--离线安装
docker·容器
dazhong201217 小时前
Docker 进阶篇(二) Docker Compose 部署 Nginx 实践
nginx·docker·容器
码--到成功18 小时前
Docker、Kubernetes安装系列 一
docker·容器·kubernetes