K8S中,kubectl cordon、uncordon、drain、taint的区别

一、核心功能与区别

命令 作用 对现有 Pod 的影响 调度状态变化 典型场景
kubectl cordon <节点名> 标记节点为不可调度SchedulingDisabled ❌ 不驱逐任何 Pod(包括 DaemonSet) ✅ 新 Pod 无法调度到该节点 节点转为 Ready,SchedulingDisabled 临时隔离节点(预检或短期维护)
kubectl uncordon <节点名> 恢复节点可调度状态 ❌ 不主动迁移或重建 Pod ✅ 允许新 Pod 调度到该节点 节点恢复为 Ready 节点维护完成后重新加入集群
kubectl drain <节点名> 驱逐节点所有非系统 Pod,并自动标记节点为不可调度 (隐含 cordon 操作) ✅ 驱逐所有非 DaemonSet Pod(由控制器在其他节点重建) ❌ 默认忽略 DaemonSet Pod(需 --ignore-daemonsets 绕过) 节点转为 SchedulingDisabled 节点维护(升级/重置)或永久下线
kubectl taint <节点名> 添加/删除污点以影响 Pod 调度 ❌ 不驱逐现有 Pod ✅ 新 Pod 需匹配容忍度才能调度到该节点 通过污点规则间接控制调度 实现节点亲和性/反亲和性策略

二、关键细节说明

  1. drain 的特殊参数
  • 需显式添加 --delete-emptydir-data 以清理使用 emptyDir 的 Pod 数据;
  • 强制操作时使用 --force(可能中断无控制器管理的 Pod),但需谨慎避免关键服务中断。
  1. drain 与 PDB 的关系

    驱逐过程受 PodDisruptionBudget(PDB)约束,若违反最小可用副本数则操作失败,确保服务高可用。

  2. cordon 与污点的关联

    执行 cordon 后节点自动添加污点:node.kubernetes.io/unschedulable:NoSchedule,禁止新 Pod 调度。

  3. taint 的调度控制

    污点是持续策略(如 NoSchedulePreferNoSchedule),需配合 Pod 的 tolerations 实现灵活调度。


三、操作流程建议

  1. 节点维护标准流程

    复制代码
    kubectl cordon <节点名>                       # 阻止新 Pod 调度到该节点
    kubectl drain  <节点名> --ignore-daemonsets   # 驱逐 Pod 并禁用调度
    ...                                           # 执行维护(如升级内核)
    kubectl uncordon <节点名>                     # 恢复节点可调度状态
  2. 临时隔离与恢复

    复制代码
    kubectl cordon <节点名>      # 快速隔离(不驱逐 Pod)
    kubectl uncordon <节点名>    # 直接恢复
  3. 污点策略配置示例

    复制代码
    kubectl taint nodes <节点名> key=value:NoSchedule   # 添加污点
    kubectl taint nodes <节点名> key=value:NoSchedule-  # 删除污点

四、总结对比

维度 cordon uncordon drain taint
核心目标 禁用新 Pod 调度 恢复新 Pod 调度 驱逐 Pod 并禁用调度 通过污点规则控制调度
驱逐行为 是(非 DaemonSet Pod)
自动化程度 手动隔离 手动恢复 自动驱逐 + 隐含隔离 需手动配置污点/容忍度
相关推荐
Kendra9191 天前
Kubernetes 常用命令
云原生·容器·kubernetes
Rabbit_QL1 天前
【网络设置】Docker 自定义网络深度解析:从踩坑到工程实践
网络·docker·容器
沫离痕1 天前
windows安装docker实例
windows·docker·容器
没有bug.的程序员1 天前
Service Mesh 与 Spring Cloud 共存方案:双体系治理、平滑迁移与风险控制实战指南
云原生·springcloud·流量治理·混合架构·servicemesh·微服务迁移·技术演进
一只鱼丸yo1 天前
从单体到微服务:一次真实迁移实战
微服务·云原生·架构
唯情于酒1 天前
Docker部署若依(前后端分离版)
vue.js·docker·容器
2501_939909051 天前
k8s基础与安装部署
云原生·容器·kubernetes
谷隐凡二1 天前
Kubernetes Route控制器简单介绍
java·容器·kubernetes
ysy16480672391 天前
Docker安装(Windows版)
windows·docker·容器
2501_940414081 天前
搞了一次平台工程,我把本地的 Docker Desktop 彻底卸了
运维·docker·容器