codecamp

Kubernetes Windows 节点的资源管理

Windows 节点的资源管理

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

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

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

如果没有适当的命名空间过滤,就无法运行 Windows 容器。这意味着无法在主机上下文中声明系统特权,因此特权容器在 Windows 上不可用。容器不能假设来自主机的身份,因为安全帐户管理器 (SAM) 是独立的

内存预留

Windows 没有 Linux 那样的内存不足进程杀手。Windows 始终将所有用户模式内存分配视为虚拟的,并且页面文件是强制性的。

Windows 节点不会为容器中运行的进程过度使用内存。最终结果是 Windows 不会像 Linux 那样达到内存不足的情况,并且将页面处理到磁盘而不是受到内存不足 (OOM) 终止的影响。如果内存过度配置并且所有物理内存都用尽了,那么分页会降低性能。

您可以使用 kubelet 参数​--kubelet-reserve​和​/​或​--system-reserve​;限制工作负载的内存使用。这些考虑了节点(容器外部)的内存使用情况,并减少 了 NodeAllocatable。在部署工作负载时,请设置容器的资源限制。​NodeAllocatable​一旦节点已满,这也会减少 并阻止调度程序添加更多 pod。

注意:当您为 Windows 容器设置内存资源限制时,您应该设置一个限制并且不指定内存请求,或者将请求设置为等于该限制。

在 Windows 上,避免过度配置的良好做法是为 kubelet 配置至少 2GiB 的系统保留内存,以解决 Windows、Kubernetes 和容器运行时开销。

CPU 预留

要考虑操作系统、容器运行时和 Kubernetes 主机进程(例如 kubelet)的 CPU 使用情况,您可以(并且应该)保留总 CPU 的百分比。您应该根据节点上可用的 CPU 内核数来确定此 CPU 预留。要确定要保留的 CPU 百分比,请确定每个节点的最大 pod 密度并监控在其中运行的系统服务的 CPU 使用率,然后选择一个满足您的工作负载需求的值。

您可以使用 kubelet 参数限制工作负载的 CPU 使用率​--kubelet-reserve​和​/​或​--system-reserve​考虑节点(容器外部)的 CPU 使用率。这减少了​NodeAllocatable​。然后,集群范围的调度程序在确定 pod 放置时会考虑此预留。

在 Windows 上,kubelet 支持命令行标志来设置 kubelet 进程的优先级:​--windows-priorityclass​. 与在 Windows 主机上运行的其他进程相比,此标志允许 kubelet 进程获得更多的 CPU 时间片。有关允许值及其含义的更多信息,请参阅 Windows 优先级。为确保正在运行的 Pod 不会饿死 kubelet 的 CPU 周期,请将此标志设置为​ABOVE_NORMAL_PRIORITY_CLASS​或更高。


Kubernetes 使用 kubeconfig 文件组织集群访问
Kubernetes 云原生安全概述
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Kubernetes 管理集群

Kubernetes Service

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }