【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

相关推荐
探索云原生2 小时前
Kubernetes 官方出品:一个 Controller 搞定 Job 排队和资源配额
ai·云原生·kubernetes·scheduler
BullSmall4 小时前
Sonarqube9.9 docker 镜像启动后 conf 下的配置文件没有了
docker·容器·eureka
ruofu334 小时前
wsl端是py312,但是项目是py311, 如何下载py311的依赖包(wheels)
python·docker
spider_xcxc5 小时前
Docker 实战:容器化多服务应用,Dockerfile 与 Compose 配置全解析
docker·云原生·eureka·虚拟化·容器化
hay_lee6 小时前
Kubernetes StatefulSet:OrderedReady 极简指南
云原生·容器·kubernetes
晚风吹长发6 小时前
Docker使用——Docker容器及相关命令
linux·运维·服务器·docker·容器·架构
ShiXZ2136 小时前
Docker Compose 安装与配置指南
运维·docker·容器
BullSmall7 小时前
Anolis OS 8.10 Docker 部署 SonarQube 9.9 完整教程
运维·docker·容器
成为你的宁宁8 小时前
【K8s HPA 水平扩缩容】
kubernetes·hpa
开发者联盟league8 小时前
vscode 进入docker容器
vscode·docker