Windows 節點的資源管理
本頁概述 Linux 和 Windows 之間資源管理方式的差異。
在 Linux 節點上,cgroup 用作 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
。與在 Windows 主機上執行的其他程序相比,此旗標允許 kubelet 程序獲得更多的 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 使用率,然後選擇滿足您的工作負載需求的值。