在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护、升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能。
1. 命令说明
- cordon : 停止调度【不可调度,临时从K8S集群隔离】
该命令会将node标记为SchedulingDisabled不可调度状态,影响最小,之后K8S再创建的pod资源,不会被调度到该节点。原有的 pod 不受影响,仍正常对外提供服务。
- drain :驱逐节点【设置不可调度,然后排干节点pod】
该命令操作,会先驱逐Node上的pod资源到其他节点重新创建,将节点调为SchedulingDisabled不可调度状态。
- uncordon : 取消不可调度状态
该命令可以取消节点的不可调度状态,允许新的pod再次被调度到该节点。
2. 使用场景
- 节点维护
在进行节点维护时,需要将节点暂时移除,确保Pod能够在其他节点上继续运行。有一点要注意,在节点驱逐前,要保持集群中服务多副本,否则驱逐过程中可能会导致业务不可用。
- 节点升级
当需要对节点进行Kubernetes版本升级或者操作系统升级时,可以使用节点驱逐来确保服务的可用性。
- 硬件故障或维修
当节点发生硬件故障或需要维修时,可以通过节点驱逐操作将节点下的Pod迁移到其他健康的节点上。
3. 操作步骤
K8S集群,其中一个node节点发生故障,状态为notready。
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.100.3 Ready master, node 2d v1.20.6
192.168.100.4 Ready master, node 2d v1.20.6
192.168.100.5 NotReady node 2d v1.20.6
故障节点标记为不可调度。
[root@k8s ~]# kubectl cordon 192.168.100.5
再查看节点状态,看到故障节点状态已经为SchedulingDisabled,新的pod将不会调度到此节点。
[root@k8s ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.100.3 Ready master, node 2d v1.20.6
192.168.100.4 Ready master, node 2d v1.20.6
192.168.100.5 NotReady,SchedulingDisabled node 2d v1.20.6
驱逐故障节点已经运行的业务容器。
[root@k8s ~]# kubectl drain 192.168.100.5
当处理完节点问题,重新恢复为ready状态后,需要将节点恢复可调度状态,取消节点驱逐。
[root@k8s ~]# kubectl uncordon 192.168.100.5