久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Kubelet Node Allocatable怎么配置

140次閱讀
沒有評論

共計 3749 個字符,預計需要花費 10 分鐘才能閱讀完成。

本篇內容主要講解“Kubelet Node Allocatable 怎么配置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“Kubelet Node Allocatable 怎么配置”吧!

Kubelet Node Allocatable

Kubelet Node Allocatable 用來為 Kube 組件和 System 進程預留資源,從而保證當節點出現滿負荷時也能保證 Kube 和 System 進程有足夠的資源。

目前支持 cpu, memory, ephemeral-storage 三種資源預留。

Node Capacity 是 Node 的所有硬件資源,kube-reserved 是給 kube 組件預留的資源,system-reserved 是給 System 進程預留的資源,eviction-threshold 是 kubelet eviction 的閾值設定,allocatable 才是真正 scheduler 調度 Pod 時的參考值(保證 Node 上所有 Pods 的 request resource 不超過 Allocatable)。

Node Allocatable Resource = Node Capacity – Kube-reserved – system-reserved – eviction-threshold

如何配置

–enforce-node-allocatable,默認為 pods,要為 kube 組件和 System 進程預留資源,則需要設置為 pods,kube-reserved,system-reserve。

–cgroups-per-qos,Enabling QoS and Pod level cgroups,默認開啟。開啟后,kubelet 會將管理所有 workload Pods 的 cgroups。

–cgroup-driver,默認為 cgroupfs,另一可選項為 systemd。取決于容器運行時使用的 cgroup driver,kubelet 與其保持一致。比如你配置 docker 使用 systemd cgroup driver,那么 kubelet 也需要配置 –cgroup-driver=systemd。

–kube-reserved, 用于配置為 kube 組件(kubelet,kube-proxy,dockerd 等)預留的資源量,比如—kube-reserved=cpu=1000m,memory=8Gi,ephemeral-storage=16Gi。

–kube-reserved-cgroup,如果你設置了 –kube-reserved,那么請一定要設置對應的 cgroup,并且該 cgroup 目錄要事先創建好,否則 kubelet 將不會自動創建導致 kubelet 啟動失敗。比如設置為 kube-reserved-cgroup=/kubelet.service。

–system-reserved,用于配置為 System 進程預留的資源量,比如—system-reserved=cpu=500m,memory=4Gi,ephemeral-storage=4Gi。

–system-reserved-cgroup,如果你設置了 –system-reserved,那么請一定要設置對應的 cgroup,并且該 cgroup 目錄要事先創建好,否則 kubelet 將不會自動創建導致 kubelet 啟動失敗。比如設置為 system-reserved-cgroup=/system.slice。

–eviction-hard,用來配置 kubelet 的 hard eviction 條件,只支持 memory 和 ephemeral-storage 兩種不可壓縮資源。當出現 MemoryPressure 時,Scheduler 不會調度新的 Best-Effort QoS Pods 到此節點。當出現 DiskPressure 時,Scheduler 不會調度任何新 Pods 到此節點。關于 Kubelet Eviction 的更多解讀,請參考我的相關博文。

Kubelet Node Allocatable 的代碼很簡單,主要在 pkg/kubelet/cm/node_container_manager.go,感興趣的同學自己去走讀一遍。

關于如何規劃 Node 的 Cgroup 結構,請參考官方建議: recommended-cgroups-setup

Sample

以如下的 kubelet 資源預留為例,Node Capacity 為 memory=32Gi, cpu=16, ephemeral-storage=100Gi,我們對 kubelet 進行如下配置:

--enforce-node-allocatable=pods,kube-reserved,system-reserved
--kube-reserved-cgroup=/kubelet.service
--system-reserved-cgroup=/system.slice
--kube-reserved=cpu=1,memory=2Gi,ephemeral-storage=1Gi
--system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=1Gi
--eviction-hard=memory.available 500Mi,nodefs.available 10%

NodeAllocatable = NodeCapacity – Kube-reserved – system-reserved – eviction-threshold = cpu=14.5,memory=28.5Gi,ephemeral-storage=98Gi.

Scheduler 會確保 Node 上所有的 Pod Resource Request 不超過 NodeAllocatable。Pods 所使用的 memory 和 storage 之和超過 NodeAllocatable 后就會觸發 kubelet Evict Pods。

我踩的坑 kube-reserved-cgroup 及 system-reserved-cgroup 配置

最開始,我只對 kubelet 做了如下配置 –kube-reserved, –system-reserved, 我就以為 kubelet 會自動給 kube 和 system 創建對應的 Cgroup,并設置對應的 cpu share, memory limit 等,然后高枕無憂了。

然而實際上并非如此,直到在線上有一次某個 TensorFlow worker 的問題,無限制的使用節點的 cpu,導致節點上 cpu usage 持續 100% 運行,并且壓榨到了 kubelet 組件的 cpu 使用,導致 kubelet 與 APIServer 的心跳斷了,這個節點便 Not Ready 了。

接著,Kubernetes 會在其他某個最優的 Ready Node 上啟動這個貪婪的 worker,進而把這個節點的 cpu 也跑滿了,節點 Not Ready 了。

如此就出現了集群雪崩,集群內的 Nodes 逐個的 Not Ready 了, 后果非常嚴重。

把 kublet 加上如下配置后,即可保證在 Node 高負荷時,也能保證當 kubelet 需要 cpu 時至少能有 –kube-reserved 設置的 cpu cores 可用。

--enforce-node-allocatable=pods,kube-reserved,system-reserved
--kube-reserved-cgroup=/kubelet.service
--system-reserved-cgroup=/system.slice

注意, 因為 kube-reserved 設置的 cpu 其實最終是寫到 kube-reserved-cgroup 下面的 cpu shares。了解 cpu shares 的同學知道,只有當集群的 cpu 跑滿需要搶占時才會起作用,因此你會看到 Node 的 cpu usage 還是有可能跑到 100% 的,但是不要緊,kubelet 等組件并沒有收到影響,如果 kubelet 此時需要更多的 cpu,那么它就能搶到更多的時間片,最多可以搶到 kube-reserved 設置的 cpu nums。

Kubernetes 會檢查的 cgroup subsystem

在 Kubernetes 1.7 版本,Kubelet 啟動會檢查以下 cgroup subsystem 的存在:

在 Kubernetes 1.8 及 1.9 版本,Kubelet 啟動會檢查以下 cgroup subsystem 的存在:

對于 Centos 系統,cpuset 和 hugetlb subsystem 是默認沒有初始化 system.slice,因此需要手動創建,否則會報 Failed to start ContainerManager Failed to enforce System Reserved Cgroup Limits on /system.slice : /system.slice cgroup does not exist 的錯誤日志。

我們可以通過在 kubelet service 中配置 ExecStartPre 來實現。

到此,相信大家對“Kubelet Node Allocatable 怎么配置”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計3749字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 诏安县| 通河县| 贵南县| 盘山县| 刚察县| 神池县| 都昌县| 广河县| 田林县| 沧州市| 怀远县| 启东市| 宜都市| 保亭| 库车县| 宽甸| 岳普湖县| 锡林郭勒盟| 大田县| 武威市| 蒙阴县| 井陉县| 遂溪县| 化德县| 庄河市| 安福县| 二连浩特市| 饶河县| 临海市| 崇义县| 靖江市| 琼中| 会东县| 盐城市| 东乡县| 百色市| 舒城县| 翁源县| 桑日县| 西安市| 灵川县|