kubelet 預留system kube資源

2022-09-11 02:30:17 字數 4565 閱讀 5725

kubernetes 的節點可以按照 capacity 排程。預設情況下 pod 能夠使用節點全部可用容量。這是個問題,因為節點自己通常執行了不少驅動 os 和 kubernetes 的系統守護程序(system daemons)。除非為這些系統守護程序留出資源,否則它們將與 pod 爭奪資源並導致節點資源短缺問題。

kubelet 公開了乙個名為 node allocatable 的特性,有助於為系統守護程序預留計算資源。kubernetes 推薦集群管理員按照每個節點上的工作負載密度配置 node allocatable。

node capacity

---------------------------

| kube-reserved |

|-------------------------|

| system-reserved |

|-------------------------|

| eviction-threshold |

|-------------------------|

| |

| allocatable |

| (**ailable for pods) |

| |

| |

---------------------------

kubernetes 節點上的 allocatable 被定義為 pod 可用計算資源量。排程器不會超額申請 allocatable。目前支援 cpu, memory 和 storage 這幾個引數。

node allocatable 暴露為 api 中 v1.node 物件的一部分,也是 cli 中 kubectl describe node 的一部分。

在 kubelet 中,可以為兩類系統守護程序預留資源。

為了恰當的在節點範圍實施 node allocatable,您必須通過 --cgroups-per-qos 標誌啟用新的 cgroup 層次結構。這個標誌是預設啟用的。啟用後,kubelet 將在其管理的 cgroup 層次結構中建立所有終端使用者的 pod。

kubelet 支援在主機上使用 cgroup 驅動操作 cgroup 層次結構。驅動通過 --cgroup-driver 標誌配置。

支援的引數值如下:

取決於相關容器執行時(container runtime)的配置,操作員可能需要選擇乙個特定的 cgroup 驅動來保證系統正常執行。例如如果操作員使用 docker 執行時提供的 cgroup 驅動時,必須配置 kubelet 使用 systemd cgroup 驅動。

kube-reserved 是為了給諸如 kubelet、container runtime、node problem detector 等 kubernetes 系統守護程序爭取資源預留。這並不代表要給以 pod 形式執行的系統守護程序保留資源。kube-reserved 通常是節點上的乙個 pod 密度(pod density) 功能。 這個效能儀錶盤 從 pod 密度的多個層面展示了 kubelet 和 docker engine 的 cpu 和 memory使用情況。

要選擇性的在系統守護程序上執行 kube-reserved,需要把 kubelet 的 --kube-reserved-cgroup 標誌的值設定為 kube 守護程序的父控制組。

推薦將 kubernetes 系統守護程序放置於頂級控制組之下(例如 systemd 機器上的 runtime.slice)。理想情況下每個系統守護程序都應該在其自己的子控制組中執行。請參考這篇文件,獲取更過關於推薦控制組層次結構的細節。

請注意,如果 --kube-reserved-cgroup 不存在,kubelet 將不會建立它。如果指定了乙個無效的 cgroup,kubelet 將會失敗。

system-reserved 用於為諸如 sshd、udev 等系統守護程序爭取資源預留。system-reserved 也應該為 kernel 預留 記憶體,因為目前 kernel 使用的記憶體並不記在 kubernetes 的 pod 上。同時還推薦為使用者登入會話預留資源(systemd 體系中的 user.slice)。

要想在系統守護程序上可選地執行 system-reserved,請指定 --system-reserved-cgroup kubelet 標誌的值為 os 系統守護程序的父級控制組。

推薦將 os 系統守護程序放在乙個頂級控制組之下(例如 systemd 機器上的system.slice)。

請注意,如果 --system-reserved-cgroup 不存在,kubelet 不會建立它。如果指定了無效的 cgroup,kubelet 將會失敗。

節點級別的記憶體壓力將導致系統記憶體不足(system ooms),這將影響到整個節點及其上執行的所有 pod。節點可以暫時離線直到記憶體已經**為止。為了防止(或減少可能性)系統記憶體不足,kubelet 提供了 資源不足(out of resource) 管理。驅逐(eviction)操作只支援 memory 和 storage。通過 --eviction-hard 標誌預留一些記憶體後,當節點上的可用記憶體降至保留值以下時,kubelet 將嘗試 驅逐 pod。假設,如果節點上不存在系統守護程序,pod 將不能使用超過 capacity-eviction-hard 的資源。因此,為驅逐而預留的資源對 pod 是不可用的。

排程器將 allocatable 按 pod 的可用 capacity 對待。

kubelet 預設在 pod 中執行 allocatable。無論何時,如果所有 pod 的總用量超過了 allocatable,驅逐 pod 的措施將被執行。有關驅逐策略的更多細節可以在 這裡 找到。請通過設定 kubelet --enforce-node-allocatable 標誌值為 pods 控制這個措施。

可選的,通過在相同標誌中同時指定 kube-reserved 和 system-reserved 值能夠使 kubelet 執行 kube-reserved 和 system-reserved。請注意,要想執行 kube-reserved 或者 system-reserved時,需要分別指定 --kube-reserved-cgroup 或者 --system-reserved-cgroup。

系統守護程序期望被按照類似 guaranteed pod 一樣對待。系統守護程序可以在其範圍控制組中爆發式增長,您需要將這個行為作為 kubernetes 部署的一部分進行管理。例如,kubelet 應該有它自己的控制組並和容器執行時(container runtime)共享 kube-reserved 資源。然而,如果執行了 kube-reserved,則 kubelet 不能突然爆發並耗盡節點的所有可用資源。

在執行 system-reserved 預留操作時**倍小心,因為它可能導致節點上的關鍵系統服務 cpu 資源短缺或因為記憶體不足(oom)而被終止。

隨著時間的增長以及越來越多特性的加入,kube 系統守護程序對資源的需求可能也會增加。以後 kubernetes 專案將嘗試減少對節點系統守護程序的利用,但目前那並不是優先事項。所以,請期待在將來的發布中將 allocatable 容量降低。

這是乙個用於說明節點 allocatable 計算方式的示例:

在這個場景下,allocatable 將會是 14.5 cpus、28.5gi 記憶體以及 98gi 儲存。排程器保證這個節點上的所有 pod 請求的記憶體總量不超過 28.5gi,儲存不超過 88gi。當 pod 的記憶體使用總量超過 28.5gi 或者磁碟使用總量超過 88gi 時,kubelet 將會驅逐它們。如果節點上的所有程序都盡可能多的使用 cpu,則 pod 加起來不能使用超過 14.5 cpus 的資源。

當沒有執行 kube-reserved 和/或 system-reserved 且系統守護程序使用量超過其預留時,如果節點記憶體用量高於 31.5gi 或儲存大於 90gi,kubelet 將會驅逐 pod。

截至 kubernetes 1.2 版本,已經可以可選的指定 kube-reserved 和 system-reserved 預留。當在相同的發布中都可用時,排程器將轉為使用 allocatable 替代 capacity。

截至 kubernetes 1.6 版本,eviction-thresholds 是通過計算 allocatable 進行考慮。要使用舊版本的行為,請設定 --experimental-allocatable-ignore-eviction kubelet 標誌為 true。

截至 kubernetes 1.6 版本,kubelet 使用控制組在 pod 上執行 allocatable。要使用舊版本行為,請取消設定 --enforce-node-allocatable kubelet 標誌。請注意,除非 --kube-reserved 或者 --system-reserved 或者 --eviction-hard 標誌沒有預設引數,否則 allocatable 的實施不會影響已經存在的 deployment。

截至 kubernetes 1.6 版本,kubelet 在 pod 自己的 cgroup 沙箱中啟動它們,這個 cgroup 沙箱在 kubelet 管理的 cgroup 層次結構中的乙個獨佔部分中。在從前乙個版本公升級 kubelet之前,要求操作員 drain 節點,以保證 pod 及其關聯的容器在 cgroup 層次結構中合適的部分中啟動。

qemu kvm記憶體預留

功能 記憶體預留,顧名思義,將虛擬機器使用的內存在主機上預留出來,不讓其它記憶體使用,同時也禁止主機將記憶體交換到swap。記憶體預留的虛擬機器,使用的記憶體與正常虛機有三點不同 核心不會對這段記憶體執行頁 流程,因此如果虛擬機器程序不退出,這段記憶體永遠不會被釋放 記憶體一旦預留,核心將為虛機程序...

Precondition資源預留

precondition資源預留 在移動通訊網路,ue之間傳輸 流基於pdp上下文,建立 pdp上下文的過程稱為資源預留。pdp上下文建立會花費一些時間甚至失敗,這意味著在資源被成功預留之前,無法保證協商的 會話是否可以建立起來。因此終端不應該在雙方資源預留成功之前有任何通知指示產生,比如振鈴提示 ...

kubelet修改docker主目錄

由於伺服器上週無故失連,讓運維重啟下才可以,從 var log message裡發現大量k8s 重啟資訊,這些指標是kubelet上報的,因此看了對應節點上kubelet的日誌,發現kubelet日誌一直在報錯。以為是docker的主目錄不對,造成的,看了下 etc docker daemon.js...