溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubelet Node Allocatable怎么配置

發(fā)布時(shí)間:2021-12-20 10:16:06 來源:億速云 閱讀:607 作者:iii 欄目:云計(jì)算

本篇內(nèi)容主要講解“Kubelet Node Allocatable怎么配置”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Kubelet Node Allocatable怎么配置”吧!

Kubelet Node Allocatable

  • Kubelet Node Allocatable用來為Kube組件和System進(jìn)程預(yù)留資源,從而保證當(dāng)節(jié)點(diǎn)出現(xiàn)滿負(fù)荷時(shí)也能保證Kube和System進(jìn)程有足夠的資源。

  • 目前支持cpu, memory, ephemeral-storage三種資源預(yù)留。

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

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

Kubelet Node Allocatable怎么配置

如何配置

  • --enforce-node-allocatable,默認(rèn)為pods,要為kube組件和System進(jìn)程預(yù)留資源,則需要設(shè)置為pods,kube-reserved,system-reserve。

  • --cgroups-per-qos,Enabling QoS and Pod level cgroups,默認(rèn)開啟。開啟后,kubelet會(huì)將管理所有workload Pods的cgroups。

  • --cgroup-driver,默認(rèn)為cgroupfs,另一可選項(xiàng)為systemd。取決于容器運(yùn)行時(shí)使用的cgroup driver,kubelet與其保持一致。比如你配置docker使用systemd cgroup driver,那么kubelet也需要配置--cgroup-driver=systemd。

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

  • --kube-reserved-cgroup,如果你設(shè)置了--kube-reserved,那么請(qǐng)一定要設(shè)置對(duì)應(yīng)的cgroup,并且該cgroup目錄要事先創(chuàng)建好,否則kubelet將不會(huì)自動(dòng)創(chuàng)建導(dǎo)致kubelet啟動(dòng)失敗。比如設(shè)置為kube-reserved-cgroup=/kubelet.service 。

  • --system-reserved,用于配置為System進(jìn)程預(yù)留的資源量,比如—system-reserved=cpu=500m,memory=4Gi,ephemeral-storage=4Gi。

  • --system-reserved-cgroup,如果你設(shè)置了--system-reserved,那么請(qǐng)一定要設(shè)置對(duì)應(yīng)的cgroup,并且該cgroup目錄要事先創(chuàng)建好,否則kubelet將不會(huì)自動(dòng)創(chuàng)建導(dǎo)致kubelet啟動(dòng)失敗。比如設(shè)置為system-reserved-cgroup=/system.slice。

  • --eviction-hard,用來配置kubelet的hard eviction條件,只支持memory和ephemeral-storage兩種不可壓縮資源。當(dāng)出現(xiàn)MemoryPressure時(shí),Scheduler不會(huì)調(diào)度新的Best-Effort QoS Pods到此節(jié)點(diǎn)。當(dāng)出現(xiàn)DiskPressure時(shí),Scheduler不會(huì)調(diào)度任何新Pods到此節(jié)點(diǎn)。關(guān)于Kubelet Eviction的更多解讀,請(qǐng)參考我的相關(guān)博文。

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

關(guān)于如何規(guī)劃Node的Cgroup結(jié)構(gòu),請(qǐng)參考官方建議: recommended-cgroups-setup

Sample

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

--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會(huì)確保Node上所有的Pod Resource Request不超過NodeAllocatable。Pods所使用的memory和storage之和超過NodeAllocatable后就會(huì)觸發(fā)kubelet Evict Pods。

我踩的坑

kube-reserved-cgroup及system-reserved-cgroup配置

最開始,我只對(duì)kubelet做了如下配置--kube-reserved, --system-reserved,我就以為kubelet會(huì)自動(dòng)給kube和system創(chuàng)建對(duì)應(yīng)的Cgroup,并設(shè)置對(duì)應(yīng)的cpu share, memory limit等,然后高枕無憂了。

然而實(shí)際上并非如此,直到在線上有一次某個(gè)TensorFlow worker的問題,無限制的使用節(jié)點(diǎn)的cpu,導(dǎo)致節(jié)點(diǎn)上cpu usage持續(xù)100%運(yùn)行,并且壓榨到了kubelet組件的cpu使用,導(dǎo)致kubelet與APIServer的心跳斷了,這個(gè)節(jié)點(diǎn)便Not Ready了。

接著,Kubernetes會(huì)在其他某個(gè)最優(yōu)的Ready Node上啟動(dòng)這個(gè)貪婪的worker,進(jìn)而把這個(gè)節(jié)點(diǎn)的cpu也跑滿了,節(jié)點(diǎn)Not Ready了。

如此就出現(xiàn)了集群雪崩,集群內(nèi)的Nodes逐個(gè)的Not Ready了,后果非常嚴(yán)重。

把kublet加上如下配置后,即可保證在Node高負(fù)荷時(shí),也能保證當(dāng)kubelet需要cpu時(shí)至少能有--kube-reserved設(shè)置的cpu cores可用。

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

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

Kubernetes會(huì)檢查的cgroup subsystem

  • 在Kubernetes 1.7版本,Kubelet啟動(dòng)會(huì)檢查以下cgroup subsystem的存在:

Kubelet Node Allocatable怎么配置

  • 在Kubernetes 1.8及1.9版本,Kubelet啟動(dòng)會(huì)檢查以下cgroup subsystem的存在:

Kubelet Node Allocatable怎么配置

對(duì)于Centos系統(tǒng),cpuset和hugetlb subsystem是默認(rèn)沒有初始化system.slice,因此需要手動(dòng)創(chuàng)建,否則會(huì)報(bào)Failed to start ContainerManager Failed to enforce System Reserved Cgroup Limits on "/system.slice": "/system.slice" cgroup does not exist的錯(cuò)誤日志。

我們可以通過在kubelet service中配置ExecStartPre來實(shí)現(xiàn)。

Kubelet Node Allocatable怎么配置

到此,相信大家對(duì)“Kubelet Node Allocatable怎么配置”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI