文章历史示例:节点报告可分配 10 个 CPU。请求 10m、限制 11 CPU 的 Pod 已放置;请求 11 CPU、限制相同的 Pod 保持 Pending。其他放置条件仍适用。

调度器计算资源请求,而不是瞬时使用率

Kubernetes 调度判断的是 Pod 在资源请求和其他放置约束下是否适合某个节点,不是简单查看当前 CPU 曲线,然后把任务塞进看起来最空闲的位置。请求为未来需求提供记账输入,实际使用率则是另一种观测。决定一个表面空闲的集群是否有能力容纳特定 Pod 之前,需要同时理解两者,不能让其中一个指标替代全部容量判断。 读取准入后的请求。API 拒绝、已创建但 Pending,以及成功放置,属于不同阶段。 以准入后的真实配置为依据 对于普通应用容器,调度器在判断节点是否容纳 Pod 时,会计算它们的请求。初始化需求、Pod 额外开销以及受支持的 Pod 级资源配置,也可能影响有效请求。最终经过准入的 Pod 才是实际输入,包括默认值和修改结果,而不只是操作者记得提交的源文件。排查时应读取保存下来的对象,确认控制面实际看到什么。 Node allocatable 也不同于硬件总容量,它表示按照节点配置可以提供给 Pod 的资源量。其他工作负载即使暂时空闲,其资源请求仍然占用调度记账中的空间。不过,请求并不表示应用已经实际分配了同样多的物理内存,也不表示独占相应数量的 CPU 核心。放置记账、实时消耗和独占策略属于不同机制,不能混用“预留”一词解释。 ...

四月 2, 2028 · 3 分钟 · XB Field Notes
CronJob 默认最多保留三个成功 Job 和一个失败 Job;Job TTL 独立控制年龄。任一机制都可能删除已结束 Job。

Kubernetes CronJob 需要历史清理策略

CronJob 按计划创建 Job,再由 Job 管理真正执行工作的 Pod。完成后的对象可以保留有用状态,但保留量受到多种独立机制影响。尤其要注意,CronJob 本来就有默认历史上限;省略显式历史字段,并不意味着普通已完成运行会无限堆积。分析清理问题时,先分清对象类型与状态,再判断是哪项机制没有覆盖。 当另一机制允许更早删除时,数量与 TTL 都不保证最低保留时长。清理是异步的,活动任务限制也不证明业务可安全重试。本轮未重跑保留诊断。 历史记录不等于日志归档 CronJob 默认最多保留三个成功 Job 和一个失败 Job,控制器分别协调两类记录。某类上限设为零,表示不保留该类历史,但清理是异步过程,不是任务结束那个瞬间必然消失。仍在运行的 Job 不属于完成历史,需要单独观察,不能期待这两个数量上限替它们设置运行期限。 三十天每小时一次意味着七百二十个计划机会,不一定保留七百二十个 Job,更不一定恰好产生相同数量的 Pod。错过调度、并发策略、重试与并行度都会改变关系,一个 Job 也可能拥有多个 Pod。用运行次数估算存储或控制面容量之前,应把这些假设说清楚,不能把理想时间表直接当成当前对象数量。 Pod 对象仍在,也不保证容器日志仍然可读。节点故障、日志轮转、容器清理和驱逐都会影响访问。真正需要按时长保留的证据,应交付到合适的日志系统。Kubernetes 对象便于调查状态,但不能替代归档保证;只延长 Job 历史,不会自动解决节点日志的生命周期问题。 ...

二月 25, 2028 · 1 分钟 · XB Field Notes
祖先约束分支连接两个独立容器控制组,各自有上限。兄弟组闲置额度不会自动转让。

cgroup 在层级中执行容器资源预算

Kubernetes 资源字段只有经过节点执行栈落实,才成为实际约束。在 Linux 上,kubelet 与容器运行时通过 cgroup 组织进程并配置资源控制器。最终形成的是一个层级,而不是简单贴在 Pod 上的单个数字。判断进程真正可以消耗多少资源之前,需要检查对应容器控制组及继承的约束,避免把清单意图直接等同于有效运行预算。 有效预算沿 cgroup 层级生效。本地上限、相对 CPU 权重和内存记账是不同控制;图中数值来自保留的历史原文,不是新实验。 读取实际执行资源约束的控制器 在 cgroup v2 中,cpu.max 用配额与周期表示 CPU 带宽,单位是微秒。10000 100000 表示该组每个周期可使用相当于十分之一个 CPU 的时间。它不会把进程固定在一个核心上,也不会降低处理器时钟频率。组内如果存在多个可运行线程,就可能在同一周期中更快消耗完共同额度,然后等待下一段可用预算。 ...

二月 11, 2028 · 3 分钟 · XB Field Notes
普通新调度避开已 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
原文算术模型中,两条指标建议汇合后取较大值:CPU 建议七个副本,平均队列积压建议十二个。

Horizontal Pod Autoscaler 依赖明确的指标语义

HorizontalPodAutoscaler 把配置的指标转换为副本建议,因此选择指标与聚合口径本身就是应用设计的一部分。增加副本应该能够降低所测压力,或提升真正有用的吞吐量,否则控制器可能只增加费用,却无法缓解瓶颈。应设置明确的最小与最大副本数,但成本上限不等于性能保障,更不代表到达上限之后仍能处理任何规模的请求。 展示原文算术模型,不是实时观测。历史 Python 模型通过范围不变。模型未包含真实控制器的容差、就绪、稳定窗口与速率策略;不证明集群行为或服务可用。 区分测量与控制 HPA 通常周期性协调,控制器默认同步间隔为十五秒。对于按 Pod 平均的目标,基本计算是当前副本数乘以当前指标与目标指标的比值,再向上取整。CPU 利用率相对于资源 requests 计算,不是相对于 limits,也不是整台节点的总容量。把分母理解错,会让看起来合理的百分比对应完全不同的扩容时机。 跨 Pod 求平均,与对时间序列做移动平均是两回事。Metrics Server 的 CPU 用量来自一个测量窗口,自定义适配器则有自己的查询与取样语义。HPA 并不会统一替每种输入做一个可配置时间窗口的平滑。容差、就绪处理、稳定窗口与速率策略属于控制层,是围绕指标建议的不同机制,不能全部称作“先平滑再决策”。 先确定单位,再讨论目标数字。按 Pod 的自定义指标使用 AverageValue;对象和外部指标可使用 Value 或 AverageValue,扩缩意义不同。整个队列的总积压与每副本平均积压不是可以随意互换的输入。资源利用率还要求提供相应资源请求。即使接口返回正常数字,如果它衡量的不是实际瓶颈,控制器依旧可能做出没有业务价值的动作。 ...

十二月 22, 2027 · 2 分钟 · XB Field Notes
时间表时钟产生多次 Job;对象创建与业务结果验证是不同环节。

CronJob 把时间表变成 Job

CronJob 把一份 Job 模板与循环时间表组合起来。CronJob 控制器负责创建 Job,再由 Job 管理执行工作的 Pod。一次运行可以包含重试、替换 Pod,或按照 Job 配置启动多个并行工作者,不应把它简化为每次只启动一个短命容器。两次运行之间不需要专门的应用进程等候触发,但已经完成的 Job 和 Pod 可能继续保留,供排查与审计使用。 时间表只是近似兑现。某个时刻可能生成重复 Job,也可能完全漏掉,因此不能无条件承诺每个计划时刻都至少执行一次。应用既要能安全重复执行,也要记录哪些业务周期真正完成。幂等性解决重复效果,独立的完整性检查解决根本没有运行的工作,这两个问题不能互相替代。 时间表是近似调度,不是持久队列,也不保证每个时刻的工作都完成。startingDeadlineSeconds 限制启动迟到,不限制运行时长。原文命令未重跑;执行状态仍为受阻。 时间表产生的是 Job 五个字段依次表示分、时、日、月与星期,支持区间、步长和 @daily 等宏。*/10 * * * * 表示每十分钟的计划时刻,并不保证 Pod 恰好在那个瞬间开始执行。即使 Job 已经建立,节点资源不足、镜像拉取或调度过程仍可能让实际工作晚于计划。 ...

十二月 17, 2027 · 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
RollingUpdate 的新旧版本生命线有重叠。Recreate 在 Deployment 升级期间,旧版结束到新版启动之间留出无服务副本的空档。

Kubernetes 滚动更新逐步替换 Pod

先选择发布的形状,再调整速度。新旧版本能否同时处理请求?能否安全共享存储和任务所有权?如果新版本起不来,如何恢复?这些问题决定 Deployment 应该用 RollingUpdate 重叠运行,还是用 Recreate 先停旧版、再起新版。姊妹篇讨论滚动的节奏和现场观察;本篇讨论兼容性、停机与恢复边界。 先检查兼容性与所有权,再选择版本重叠。Recreate 只改变升级顺序;回滚仍需经过演练的镜像、配置与数据恢复方案。 逐步替换,还是先停后起 RollingUpdate 是 Deployment 的默认策略。surge 和 unavailable 两个预算控制替换过程,允许新旧 ReplicaSet 同时存在。就绪状态参与可用副本的计算,但不代表业务逻辑正确,更不代表每个请求都成功。不能因为看到 Ready,就推断订单、支付或后台任务已经通过发布验收。 ...

十一月 27, 2027 · 2 分钟 · XB Field Notes