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 使用情況,然後選擇一個滿足您工作負載需求的值。