摘要:中對(duì)容器的資源分配有三種策略。顧名思義是該容器對(duì)資源的最低要求和最高使用量限制。磁盤的使用不像有通過和進(jìn)行配置,磁盤用量可以認(rèn)為是一種策略為的資源。在這個(gè)時(shí)長范圍內(nèi)即便資源使用下降到閾值以下,也不會(huì)恢復(fù)。
QoS
k8s中對(duì)容器的資源分配有三種策略:
Guaranteed 。該策略下,pod.spec.containers[].resources中會(huì)存在cpu或memory的request和limit。顧名思義是該容器對(duì)資源的最低要求和最高使用量限制。如果我們配置了limit,沒有配置request,默認(rèn)會(huì)以limit的值來定義request。具體的配置可以參考以前的這篇筆記。
BestEffort。當(dāng)pod的描述文件中沒有resource.limit、resource.request相關(guān)的配置時(shí),意味著這個(gè)容器想跑多少資源就跑多少資源,其資源使用上限實(shí)際上即所在node的capacity。
Burstable。當(dāng)resource.limit和resource.request以上述兩種方式以外的形式配置的時(shí)候,就會(huì)采用本模式。
QoS目前只用cpu和memory來描述,其中cpu可壓縮資源,當(dāng)一個(gè)容器的cpu使用率超過limit時(shí)會(huì)被進(jìn)行流控,而當(dāng)內(nèi)存超過limit時(shí)則會(huì)被oom_kill。這里kubelet是通過自己計(jì)算容器的oom_score,確認(rèn)相應(yīng)的linux進(jìn)程的oom_adj,oom_adj最高的進(jìn)程最先被oom_kill。
Guaranteed模式的容器oom_score最?。?998,對(duì)應(yīng)的oom_adj為0或1,BestEffort模式則是1000,Burstable模式的oom_score隨著其內(nèi)存使用狀況浮動(dòng),但會(huì)處在2-1000之間。
因此我們可以看出,當(dāng)某個(gè)node內(nèi)存被嚴(yán)重消耗時(shí),BestEffort策略的pod會(huì)最先被kubelet殺死,其次Burstable(該策略的pods如有多個(gè),也是按照內(nèi)存使用率來由高到低地終止),再其次Guaranteed。
kubelet的eviction機(jī)制完全依賴于oom_kill并不是一個(gè)很好的方案,一來對(duì)于cpu要求高的容器沒有作用,二來單純將pod殺死,并不能根本上解決困局,比如pod占用node絕大部分內(nèi)存,加入pod被kill后再次調(diào)度到這個(gè)node上,oom的情況還會(huì)復(fù)現(xiàn)。所以kubelet增加了一套驅(qū)逐機(jī)制。
eviction機(jī)制適用于:
memory.available 、nodefs.available 、nodefs.inodesFree 、imagefs.available 、imagefs.inodesFree
分別對(duì)應(yīng)于node目前可用內(nèi)存、node上用于kubelet運(yùn)行日志、容器掛載磁盤所使用的的文件系統(tǒng)的余量和inode余量、node上用于存放容器鏡像和讀寫層的文件系統(tǒng)的余量、inode余量。
eviction中要設(shè)置觸發(fā)驅(qū)逐的閾值Eviction Thresholds,這個(gè)閾值的配置可以是一個(gè)定值或一個(gè)百分比。如:
memory.available<10%
memory.available<1Gi
軟驅(qū)逐機(jī)制表示,當(dāng)node的內(nèi)存/磁盤空間達(dá)到一定的閾值后,我要觀察一段時(shí)間,如果改善到低于閾值就不進(jìn)行驅(qū)逐,若這段時(shí)間一直高于閾值就進(jìn)行驅(qū)逐。
這里閾值通過參數(shù)--eviction-soft配置,樣例如上;觀察時(shí)間通過參數(shù)--eviction-soft-grace-period進(jìn)行配置,如1m30s。
另外還有一個(gè)參數(shù)eviction-max-pod-grace-period,該參數(shù)會(huì)影響到要被驅(qū)逐的pod的termination time,即終止該pod的容器要花費(fèi)的時(shí)間。
強(qiáng)制驅(qū)逐機(jī)制則簡(jiǎn)單的多,一旦達(dá)到閾值,立刻把pod從本地kill,驅(qū)逐eviction-hard參數(shù)配置,樣例亦如上。
pod eviction當(dāng)資源使用情況觸發(fā)了驅(qū)逐條件時(shí),kubelet會(huì)啟動(dòng)一個(gè)任務(wù)去輪流停止運(yùn)行中的pod,直到資源使用狀況恢復(fù)到閾值以下。以硬驅(qū)逐為例,整體流程是:
每隔一段時(shí)間從cadvisor中獲取資源使用情況,發(fā)現(xiàn)觸發(fā)了閾值;
從運(yùn)行中的pod里找到QoS策略最開放的一個(gè),比如策略為bestEffort的一個(gè)pod(即便這個(gè)pod沒有吃多少內(nèi)存,大部分內(nèi)存是另一個(gè)策略為burstable,但內(nèi)存使用率也很高的pod),kubelet停止該pod對(duì)應(yīng)的所有容器,然后將pod狀態(tài)更新為Failed。如果該pod長時(shí)間沒有被成功kill掉,kubelet會(huì)再找一個(gè)pod進(jìn)行驅(qū)逐。
檢查內(nèi)存用量是否恢復(fù)到閾值以下,如果沒有,則重復(fù)第二步(這里就要干掉那個(gè)罪魁禍?zhǔn)琢耍?。一直到?nèi)存使用情況恢復(fù)到閾值以下為止。
有幾個(gè)要注意的點(diǎn)是:
kubelet挑選pod進(jìn)行驅(qū)逐的策略,就是按照QoS的策略開放度排序,而同一個(gè)QoS的多個(gè)pod中,kubelet會(huì)優(yōu)先驅(qū)逐使用觸發(fā)指標(biāo)資源最多的一個(gè)。
磁盤的使用不像memory有通過request和limit進(jìn)行配置,磁盤用量可以認(rèn)為是一種QoS策略為BestEffort的資源。當(dāng)觸發(fā)磁盤資源不足時(shí),kubelet會(huì)做一些額外的工作,比如清理已經(jīng)dead的pod的容器日志,清理沒有被使用的容器鏡像,當(dāng)然kubelet也會(huì)挑磁盤使用量(包括掛載本地volume空間+容器log大小,若是imagefs指標(biāo)超額,此處還要加上容器運(yùn)行時(shí)讀寫層的文件大?。┳畲蟮囊粋€(gè)pod進(jìn)行驅(qū)逐。
node condition
如上圖,當(dāng)軟驅(qū)逐或者硬驅(qū)逐觸發(fā)時(shí),kubelet會(huì)嘗試干掉一個(gè)pod,并且會(huì)將自身的狀態(tài)從驅(qū)逐的指標(biāo)信息中映射過來,比如內(nèi)存使用超標(biāo)觸發(fā)驅(qū)逐,node的condtion就會(huì)變成memoryPressure,這個(gè)condition伴隨的kubelet定時(shí)的心跳報(bào)文上傳到master,記錄在etcd中。在調(diào)度器進(jìn)行調(diào)度時(shí),會(huì)以這些condition作為調(diào)度條件的參考。比如,處于diskPressure的node,調(diào)度器就不會(huì)再將任何pod調(diào)度上去。否則一旦磁盤空間用滿,node上的容器可能會(huì)嚴(yán)重崩潰。
但如果node的內(nèi)存在閾值上下波動(dòng),condition被反復(fù)更新為pressure或正常,那么pod被誤調(diào)度到node上也會(huì)很耽誤事,所以用eviction-pressure-transition-period參數(shù)指定觸發(fā)eviction后condition更新一次后要保留改狀態(tài)的最小時(shí)長。在這個(gè)時(shí)長范圍內(nèi)即便資源使用下降到閾值以下,condition也不會(huì)恢復(fù)。
其他Minimum eviction reclaim 我們擔(dān)心node可能驅(qū)逐了一個(gè)小pod后,指標(biāo)就只是稍低于閾值,那么一旦其他pod的指標(biāo)稍一上來,該node就又要進(jìn)行eviction。所以用這個(gè)參數(shù):
--eviction-minimum-reclaim(值如"memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi")進(jìn)行限定,一旦發(fā)生了eviction,必須要保證node的某指標(biāo)用量低于(該指標(biāo)閾值-本參數(shù)指定的該指標(biāo)值)才認(rèn)為node恢復(fù)正常,否則還要接著驅(qū)逐pod。
簡(jiǎn)單的說,該參數(shù)表示的是node進(jìn)行驅(qū)逐工作后要達(dá)到的效果是低于閾值多少。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/33037.html
摘要:將用戶命令通過接口傳送給,從而進(jìn)行資源的增刪改等操作。要使用編寫應(yīng)用程序,當(dāng)下大多語言都可以很方便地去實(shí)現(xiàn)請(qǐng)求來操作的接口從而控制和查詢資源,但本文主要是利用已有的客戶端來更加優(yōu)雅地實(shí)現(xiàn)的資源控制。 showImg(https://segmentfault.com/img/remote/1460000013517345); 【利用K8S技術(shù)棧打造個(gè)人私有云系列文章目錄】 利用K8S...
摘要:將用戶命令通過接口傳送給,從而進(jìn)行資源的增刪改等操作。要使用編寫應(yīng)用程序,當(dāng)下大多語言都可以很方便地去實(shí)現(xiàn)請(qǐng)求來操作的接口從而控制和查詢資源,但本文主要是利用已有的客戶端來更加優(yōu)雅地實(shí)現(xiàn)的資源控制。 showImg(https://segmentfault.com/img/remote/1460000013517345); 【利用K8S技術(shù)棧打造個(gè)人私有云系列文章目錄】 利用K8S...
摘要:去年換工作后,開始真正在生產(chǎn)環(huán)境中接觸容器與。今天想先談?wù)?,我理解的容器是什么,以及為什么它們能火起來。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置依賴的集合。這里再談?wù)勎依斫獾?。而,就是目前的容器編排的平臺(tái)的事實(shí)標(biāo)準(zhǔn)了。 去年換工作后,開始真正在生產(chǎn)環(huán)境中接觸容器與Kubernetes。邊惡補(bǔ)相關(guān)知識(shí)的同時(shí),也想把學(xué)到的內(nèi)容和自己的理解整理出來。學(xué)習(xí)的途徑包括k8s官方文檔...
摘要:去年換工作后,開始真正在生產(chǎn)環(huán)境中接觸容器與。今天想先談?wù)?,我理解的容器是什么,以及為什么它們能火起來。一個(gè)容器鏡像的實(shí)質(zhì)就是程序進(jìn)程加所有運(yùn)行時(shí)環(huán)境及配置依賴的集合。這里再談?wù)勎依斫獾?。而,就是目前的容器編排的平臺(tái)的事實(shí)標(biāo)準(zhǔn)了。 去年換工作后,開始真正在生產(chǎn)環(huán)境中接觸容器與Kubernetes。邊惡補(bǔ)相關(guān)知識(shí)的同時(shí),也想把學(xué)到的內(nèi)容和自己的理解整理出來。學(xué)習(xí)的途徑包括k8s官方文檔...
摘要:如版本之前版本到版本之間版本之后一各種的含義該軟件可能包含錯(cuò)誤。啟用一個(gè)功能可能會(huì)導(dǎo)致隨時(shí)可能會(huì)丟棄對(duì)該功能的支持,恕不另行通知軟件經(jīng)過很好的測(cè)試。啟用功能被認(rèn)為是安全的。 本篇文章來自Terraform與Kubernetes中關(guān)于Deployment apps/v1的吐槽 Kubernetes的官方文檔中并沒有對(duì)apiVersion的詳細(xì)解釋,而且因?yàn)镵8S本身版本也在快速迭代,有些...
摘要:但考慮到該用戶在跨集群模式下的困擾,開始策劃將托管云物理機(jī)納入現(xiàn)有集群統(tǒng)一管理的方案,即在混合云架構(gòu)下僅需部署管理一套集群。托管云物理機(jī)納入U(xiǎn)K8S集群統(tǒng)一管理后,可實(shí)現(xiàn)托管云物理機(jī)保障平峰時(shí)業(yè)務(wù)正常運(yùn)行,高峰時(shí)期利用UK8S快速擴(kuò)容公有云資源的理想應(yīng)用場(chǎng)景,繼而提升混合云的可用性。 ——海豹他趣技術(shù)負(fù)責(zé)人 張嵩 混合云的業(yè)務(wù)模式 廈門海豹他趣信息技術(shù)股份有限公司于2012年4...
閱讀 2158·2021-11-11 16:55
閱讀 1502·2021-09-28 09:36
閱讀 1099·2019-08-29 15:21
閱讀 1650·2019-08-29 14:10
閱讀 2837·2019-08-29 14:08
閱讀 1692·2019-08-29 12:31
閱讀 3312·2019-08-29 12:31
閱讀 1089·2019-08-26 16:47