ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

集群节点维护

2026/8/4 6:15:30 拓冰建站 浏览量
集群节点维护

kubectl cordon - 标记节点不可调度

作用

  • 将节点标记为 Unschedulable,阻止新 Pod 调度到该节点。
  • 不影响已运行 Pod,仅阻止新调度请求节点中原有Pod不受影响,仍正常对外提供服务
  • 原理

  • 修改节点的 spec.unschedulable 字段为 true。
  • 调度器会忽略该节点(类似给节点添加了 NoSchedule 污点)。

使用场景

  • 计划维护节点(如升级内核、硬件更换)。
  • 隔离问题节点进行调试。

示例

kubectl cordon <node-name>    # 标记节点不可调度
kubectl uncordon <node-name>  # 恢复节点可调度状态

kubectl drain - 驱逐节点

作用

  • 标记节点不可调度(等同于 cordon)。
  • 驱逐节点上所有 Pod(根据配置决定是否驱逐 DaemonSet 的 Pod)

示例

kubectl drain node-name --ignore-daemonsets --delete-emptydir-data# --ignore-daemonsets       忽略 DaemonSet 管理的 Pod(通常必须启用)
# --delete-emptydir-data    删除 EmptyDir 卷数据
# --force                   强制驱逐无控制器管理的 Pod(如裸 Pod)

使用场景

  • 安全下线节点(如节点退役、长期维护)。
  • 确保 Pod 优雅终止并重新调度到其他节点。

kubectl delete - 移除节点

作用

  • kubectl delete node ,从 Kubernetes API 中删除该节点的对象

潜在风险

  • Pod 被强制终止,未优雅终止的 Pod 可能导致数据丢失(尤其是有状态服务)
  • 服务中断,被删除节点上的 Pod 可能无法及时在其他节点重建
  • 资源泄漏,节点实际仍在运行但脱离集群管理

移除节点的正确操作流程

步骤 1:先排空(drain)节点

kubectl drain <node-name> \--ignore-daemonsets \--delete-emptydir-data \--force# --ignore-daemonsets:忽略 DaemonSet 管理的 Pod
# --delete-emptydir-data:清理临时存储数据
# --force:强制删除无控制器的裸 Pod

步骤 2:标记不可调度

  • 在执行 drain 时,Kubernetes 会先自动对目标节点执行 cordon 操作,确保在排空 Pod 的过程中不会有新 Pod 被调度到该节点。这是kubectl drain 命令的一个隐含行为
kubectl cordon <node-name>  # drain 已包含此操作

步骤 3:删除节点对象

kubectl delete node <node-name>

步骤 4:实际下线节点

  • 关闭/销毁对应的物理机或虚拟机
  • 如果是云厂商托管的节点,使用对应的云命令(如 gcloud compute instances delete)