普通新调度避开已 cordon 节点,已有 Pod 继续运行。支持时 drain 使用受预算约束的驱逐,并等待终止。

Cordon 与 drain 协调节点维护

Cordon 改变调度资格,drain 协调驱逐并等待 Pod 终止。两条命令都不保证维护期间工作一定保留;应用关闭逻辑、替代容量、存储和中断预算共同决定结果。应把排空视为需要观察的状态,并记录明确例外,而不是从命令名称推导节点已经可以安全关机。 Cordon 是放置限制,不证明节点已清空。Drain 不是原子事务,也不证明写入或替代副本成功。本轮没有执行原文保留的诊断命令。 Cordon 改变未来放置 Cordon 设置节点的不可调度字段,已有 Pod 继续运行,普通的新调度会避开它。Drain 自己也会执行 cordon,因此单独先做一次可以留下观察窗口,但不是必需步骤。Uncordon 重新允许调度,不保证立即出现新副本,也不会修好不健康的 kubelet;恢复前仍应核对节点状态与应用准备情况。 这项调度限制存在例外。DaemonSet Pod 容忍不可调度条件,直接填写 nodeName 的 Pod 则绕过普通调度选择。具有相应容忍度的其他 Pod 也可能符合放置条件。因此,需要检查真实剩余负载,不能把 cordon 说成阻止所有 Pod 到来的防火墙,更不能只凭不可调度字段就判断节点已经清空。 ...

二月 3, 2028 · 1 分钟 · XB Field Notes
对于 storage=nvme 标签规则,必要亲和排除不匹配节点;偏好亲和为匹配节点加分,不匹配节点仍可能是候选。其他约束仍须通过。

节点亲和把工作负载放到合适的节点

节点亲和把工作负载的要求与节点标签匹配起来。它可以要求 NVMe 存储,也可以偏好较新的机型,但不会代替调度器的其他检查。即使没有亲和规则,调度器也会先按资源请求、污点、存储卷约束等条件筛选,再给可行节点评分,并非只比较此刻的空闲容量。 GPU 放置说明了这一区别:通过设备插件声明 GPU 扩展资源请求,才能把设备数量纳入资源适配;加速器标签可以进一步选择型号。标签本身不会分配 GPU,容忍污点也既不请求设备,又不要求一定进入专用池。必须分别表达资源需求、放置要求和允许进入哪些节点。 必要亲和按标签过滤。偏好亲和参与可行节点评分,两者单独都不保证成功放置。 按标签匹配节点 accelerator=nvidia-a100、storage=nvme 等标签描述的属性,需要节点供给流程建立并持续维护。替换节点不会自动继承旧节点的任意标签。应先确认新硬件确有这些属性,再附上旧标签;否则规则在形式上匹配,实际选到的机器却不适合业务。 把标签词表当作 API 管理。重命名一个键会影响所有引用它的清单,过时的值则可能错误描述硬件。校验配置时要对照预期节点清单,包括计划扩容但还未上线的容量。某个标签暂时不存在,可能是供给过程未完成或整个节点池暂时缺席,不一定只是拼写错误。不要让静态校验把这些不同原因混成同一个结论。 隔离还依赖标签完整性。Kubernetes 1.34 文档建议结合 Node authorizer、NodeRestriction 准入插件和受保护的 node-restriction.kubernetes.io/ 标签键。普通的节点自报合规标签并不是独立安全边界。需要明确谁能修改标签,以及谁能修改工作负载的放置要求;字符串匹配不能代替这些权限检查。 偏好还是强制 requiredDuringSchedulingIgnoredDuringExecution 排除不满足规则的节点;preferredDuringSchedulingIgnoredDuringExecution 为可行节点增加带权偏好,其他评分仍可能胜出。两种形式都不保证剩余容量、应用健康或故障韧性。必要条件可能让 Pod 保持 Pending;偏好允许落到不匹配的节点,但所有硬约束仍须通过。 ...

十二月 9, 2027 · 1 分钟 · XB Field Notes
对于未被容忍的污点,NoSchedule 阻止新的普通调度而保留已绑定 Pod;PreferNoSchedule 软性避让而保留已有 Pod;NoExecute 阻止新调度,还可能驱逐已绑定 Pod。

污点会排斥那些不打算容忍它的 Pod

污点排斥没有容忍对应效果的 Pod,容忍度只移除这项障碍,不会强制把负载送到专用硬件。专用节点设计通常还需要标签与必要的节点亲和,再分别检查容量和准入策略。不能把通行资格理解成目的地保证,也不能把容忍度当成工作负载的完整权限边界。 容忍度移除匹配污点这一项障碍。效果决定后果,放置与权限仍是其他机制。 给专用者的标记 NoSchedule 污点在未被容忍时,阻止普通的新调度,但不移动已有 Pod。这可以把 GPU 等专用节点留给特定负载。不能进一步概括为所有污点都不影响运行中程序:NoExecute 具有驱逐行为,PreferNoSchedule 则只是调度偏好。首先看清 effect,才能判断这次变更会影响新放置还是已有实例。 污点不是安全隔离。有权提交合适容忍度的主体可能获得池子资格,直接指定 nodeName 还会绕过普通调度检查。准入限制、授权和设备资源请求是另外的控制;一个 GPU 容忍度既没有请求 GPU,也不保证有空闲 GPU。审阅专用池时,需要同时核对谁能修改模板、谁能添加容忍度以及真正需要哪些硬件资源。 效果决定行为 NoSchedule 对未容忍的 Pod 构成硬性调度排除;PreferNoSchedule 提供软性避让偏好,单靠它不会让节点完全失去资格。NoExecute 还可能移除已经绑定、却没有匹配容忍度的 Pod。匹配 NoExecute 的容忍度可以带 tolerationSeconds,限定污点出现之后还能停留多久;不写时长与设置短时长具有不同后果。 ...

二月 25, 2027 · 2 分钟 · XB Field Notes