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)
自动化程度 手动隔离 手动恢复 自动驱逐 + 隐含隔离 需手动配置污点/容忍度
相关推荐
lcx_defender37 分钟前
【Docker】Docker部署运行nacos
运维·docker·容器
啦啦啦小石头1 小时前
docker添加用户权限不使用sudo
运维·docker·容器
天才奇男子2 小时前
《深度解析HAProxy七层代理:原理、配置与最佳实践》
linux·运维·微服务·云原生
春日见2 小时前
Autoware使用教程
大数据·人工智能·深度学习·elasticsearch·搜索引擎·docker·容器
Dontla3 小时前
Kubernetes流量管理双雄:Ingress与Gateway API解析(Nginx与Ingress与Gateway API的关系)
nginx·kubernetes·gateway
lcx_defender3 小时前
【Docker】Docker部署运行Kibana
运维·docker·容器
七夜zippoe3 小时前
Kubernetes与Python微服务编排实战:从基础部署到自动扩缩容
python·微服务·kubernetes·service·hpa
ℳ₯㎕ddzོꦿ࿐3 小时前
实战:构建基于 Docker-Compose 的HLS (m3u8) 实时转 FLV,基于 ZLMediaKit 的低延迟方案
运维·docker·容器
EasyNVR4 小时前
EasyNVR使用Docker部署升级的技术分享
docker·容器
江畔何人初4 小时前
k8s中namespace与容器cgroup区别
linux·运维·云原生