在Kubernetes中,节点驱逐是一种管理和维护集群的重要操作,允许节点在维护、升级或者发生故障时从集群中移除,等到节点修复后,再重新承担pod调度功能。
1.K8s节点驱逐
节点驱逐是指将节点上运行的Pod迁移到其他可用节点上,并暂时从集群中移除目标节点。这个操作通常在节点维护、系统升级、硬件故障或者其他需要暂时离线节点的场景下使用。
2.使用场景
节点维护
在进行节点维护时,需要将节点暂时移除,确保Pod能够在其他节点上继续运行。有一点要注意,在节点驱逐前,要保持集群中服务多副本,否则驱逐过程中可能会导致业务不可用
节点升级
当需要对节点进行Kubernetes版本升级或者操作系统升级时,可以使用节点驱逐来确保服务的可用性。
硬件故障或维修
当节点发生硬件故障或需要维修时,可以通过节点驱逐操作将节点下的Pod迁移到其他健康的节点上。
3.命令说明
- cordon : 停止调度【不可调度,临时从K8S集群隔离】
该命令会将node标记为SchedulingDisabled不可调度状态,影响最小,之后K8S再创建的pod资源,不会被调度到该节点。原有的 pod 不受影响,仍正常对外提供服务。
- drain :驱逐节点【设置不可调度,然后排干节点pod】
该命令操作,会先驱逐Node上的pod资源到其他节点重新创建,将节点调为SchedulingDisabled不可调度状态
总结:两个命令的区别在于,cordon命令执行后,新的pod创建不会调度过来,老的pod不受影响,drain执行会额外清除节点上的pod
4.操作步骤
K8S集群,其中一个node节点发生故障,状态为notready
故障节点标记为不可调度
drain <node-name> --ignore-daemonsets
kubectl drain 命令会触发节点驱逐操作,将节点上的Pod迁移到其他节点上。
参数说明:
--delete-emptydir-data:强制驱逐节点上绑定了本地存储的Pod,例如coredns。
--ignore-daemonsets:忽略节点上的守护进程集Pod,通常为DaemonSet类型的Pod,例如flannel
查看节点驱逐状态
5.解除驱逐
当处理完节点问题,重新恢复为ready状态后,需要将节点恢复可调度状态
取消节点驱逐
6. 注意事项
- DaemonSet
在进行节点驱逐时,需要注意DaemonSet中的Pod,确保它们不会被驱逐,以维持集群的关键服务。
确保Pod能够重新调度
在节点驱逐前,确保集群中有足够的可用资源,以便Pod能够顺利地重新调度到其他节点上。
确认服务的高可用性
在进行节点驱逐时,要确保相关服务具备高可用性,以防止驱逐操作引起的业务中断,所有服务的多副本还是很有必要的。
通过良好的节点管理和调度策略,Kubernetes能够有效地应对节点维护、升级和故障情况。节点驱逐操作是集群维护的重要组成部分,合理使用并遵循最佳实践,能够确保业务的连续性和可靠性。