Windows 节点的资源管理
本页面概述了 Linux 和 Windows 之间资源管理方式的差异。
在 Linux 节点上,cgroups 用作资源控制的 Pod 边界。容器在该边界内创建,以实现网络、进程和文件系统隔离。Linux cgroup API 可用于收集 CPU、I/O 和内存使用统计信息。
相比之下,Windows 为每个容器使用一个**作业对象**,并带有一个系统命名空间过滤器,以包含容器中的所有进程,并提供与主机的逻辑隔离。(作业对象是 Windows 进程隔离机制,与 Kubernetes 所指的作业不同)。
在没有命名空间过滤器的情况下,无法运行 Windows 容器。这意味着无法在主机上下文中声明系统特权,因此 Windows 上不提供特权容器。容器无法假定主机的身份,因为安全帐户管理器 (SAM) 是独立的。
内存管理
Windows 没有像 Linux 那样的内存不足进程终止器。Windows 始终将所有用户模式内存分配视为虚拟分配,并且页面文件是强制性的。
Windows 节点不会对进程进行内存超量分配。最终效果是,Windows 不会像 Linux 那样达到内存不足条件,进程会分页到磁盘而不是被内存不足 (OOM) 终止。如果内存过度配置并且所有物理内存都已耗尽,那么分页可能会降低性能。
CPU 管理
Windows 可以限制分配给不同进程的 CPU 时间量,但不能保证最小的 CPU 时间量。
在 Windows 上,kubelet 支持一个命令行标志来设置 kubelet 进程的调度优先级:--windows-priorityclass
。此标志允许 kubelet 进程在与其他在 Windows 主机上运行的进程相比时获得更多的 CPU 时间片。有关允许值及其含义的更多信息,请参阅Windows 优先级类。为了确保运行中的 Pod 不会占用 kubelet 的 CPU 周期,请将此标志设置为 ABOVE_NORMAL_PRIORITY_CLASS
或更高。
资源预留
为了计算操作系统、容器运行时和 Kubernetes 主机进程(如 kubelet)使用的内存和 CPU,可以(并且应该)使用 --kube-reserved
和/或 --system-reserved
kubelet 标志来预留内存和 CPU 资源。在 Windows 上,这些值仅用于计算节点的可分配资源。
注意
部署工作负载时,请为容器设置资源内存和 CPU 限制。这也会从 NodeAllocatable
中减去,并帮助集群范围的调度器确定将哪些 Pod 放置在哪些节点上。
不设置限制地调度 Pod 可能会导致 Windows 节点过度配置,在极端情况下可能导致节点不健康。
在 Windows 上,一个好的做法是至少预留 2GiB 内存。
要确定要预留多少 CPU,请确定每个节点的最大 Pod 密度并监控在那里运行的系统服务的 CPU 使用情况,然后选择一个满足您工作负载需求的值。