共計 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 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!