Windows 节点的资源管理

本页概述了 Linux 和 Windows 之间资源管理方式的差异。

在 Linux 节点上,cgroups 被用作资源控制的 Pod 边界。容器在该边界内创建,用于网络、进程和文件系统隔离。Linux cgroup API 可用于收集 CPU、I/O 和内存使用统计信息。

相反,Windows 为每个容器使用一个作业对象,并使用系统命名空间过滤器来包含容器中的所有进程,并提供与主机的逻辑隔离。(作业对象是一种 Windows 进程隔离机制,与 Kubernetes 中称为 Job 的内容不同)。

在没有命名空间过滤的情况下,无法运行 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,您可以使用 kubelet 标志 --kube-reserved 和/或 --system-reserved 保留内存和 CPU 资源(并且应该这样做)。在 Windows 上,这些值仅用于计算节点的可分配资源。

在 Windows 上,一个好的做法是至少预留 2GiB 的内存。

要确定要预留多少 CPU,请确定每个节点的最大 Pod 密度并监视在那里运行的系统服务的 CPU 使用率,然后选择一个满足您的工作负载需求的值。

上次修改时间:2022 年 6 月 6 日下午 2:04 PST:更新 Windows 简介和资源管理页面 (#34083) (eb88ef7c3e)