Linux 和 Windows 在资源管理方式上有很大的区别。在 Linux 节点上,cgroup 用作资源控制的 Pod 边界。在这个边界内创建容器以便于隔离网络、进程和文件系统。 cgroup API 可用于收集 CPU、I/O 和内存使用统计数据。
相比之下,在 Windows 中,每个容器对应一个作业对象,该作业对象与系统命名空间过滤器一起使用,将所有进程包含在一个容器中,提供与主机的逻辑隔离。作业对象是一种 Windows 进程隔离机制,用于将进程分组并提供隔离。如果没有命名空间过滤器,则无法运行 Windows 容器。
此外,Windows 容器也存在一些限制,例如容器不能使用来自主机的标识,因为安全帐户管理器(Security Account Manager,SAM)是独立的。容器也无法使用特权,因为在主机环境中无法让系统特权生效。
一、内存管理
与 Linux 不同,Windows 不提供类似杀手(killer)机制来终止内存不足的进程。在 Windows 中,所有用户态内存分配都被视为虚拟内存,并且强制使用页面文件(pagefile)。
Windows 节点不会允许进程过度使用内存。相反,当物理内存耗尽时,Windows 将进程的页面换出到磁盘上,而不会导致进程终止。这意味着 Windows 不太可能出现像 Linux 中的内存不足(OOM)的情况。然而,如果内存配置过多且所有物理内存都已用尽,那么换页(paging)的性能将会下降。
二、CPU管理
Windows 可以限制为不同进程分配的 CPU 时间长度,但无法保证最小的 CPU 时间长度。
在 Windows 上,kubelet 支持使用命令行标志来设置 kubelet 进程的调度优先级: –windows-priorityclass。 与 Windows 主机上运行的其他进程相比,此标志允许 kubelet 进程获取更多的 CPU 时间片。 为了确保运行的 Pod 不会耗尽 kubelet 的 CPU 时钟周期, 要将此标志设置为 ABOVE_NORMAL_PRIORITY_CLASS 或更高。
三、资源预留
为了满足操作系统、容器运行时和 kubelet 等 Kubernetes 主机进程使用的内存和 CPU,应该使用 –kube-reserved 和/或 –system-reserved kubelet 标志来预留内存和 CPU 资源。在 Windows 上,这些值仅用于计算节点的可分配资源。
注意:
- 在部署工作负载时,必须为容器设置内存和 CPU 资源限制。这样做也会从 NodeAllocatable 中减去,以帮助集群范围的调度器决定哪些 Pod 放到哪些节点上;
- 如果调度 Pod 时未设置资源限制,可能会导致 Windows 节点过度配置资源。在极端情况下,这会使节点不健康;
- 在 Windows 上,一种好的做法是至少预留2GiB的内存;
- 为了确定预留多少 CPU,需要明确每个节点的最大 Pod 密度,并监视正在运行的系统服务的 CPU 使用率,然后选择一个满足工作负载需求的值。