系統(tǒng)資源可分為兩類(lèi):可搶占資源(CPU)和不可搶占資源(memory艺谆、storage)唱逢∫伲可搶占資源比如CPU在系統(tǒng)滿(mǎn)負(fù)荷時(shí)會(huì)劃分時(shí)間片分時(shí)運(yùn)行進(jìn)程陵刹,系統(tǒng)整體會(huì)變慢(一般不會(huì)導(dǎo)致太大的問(wèn)題)。但不可搶占資源如Memory在系統(tǒng)滿(mǎn)負(fù)荷時(shí)碾盐,除了會(huì)導(dǎo)致系統(tǒng)變慢晃跺,還會(huì)進(jìn)一步導(dǎo)致系統(tǒng)OOM,最終導(dǎo)致某些進(jìn)程被Linux系統(tǒng)的OOM killer機(jī)制殺掉廓旬。
在Kubernetes平臺(tái)哼审,默認(rèn)情況下Pod能夠使用節(jié)點(diǎn)全部可用資源。如果節(jié)點(diǎn)上的pod負(fù)載較大孕豹,那么這些pod可能會(huì)與節(jié)點(diǎn)上的系統(tǒng)守護(hù)進(jìn)程和k8s組件爭(zhēng)奪資源并導(dǎo)致節(jié)點(diǎn)資源短缺涩盾,甚至引發(fā)系統(tǒng)OOM而殺進(jìn)程,假如被殺掉的進(jìn)程是系統(tǒng)進(jìn)程或K8S組件励背,會(huì)導(dǎo)致比較嚴(yán)重的問(wèn)題春霍。
針對(duì)這種問(wèn)題,主要有兩種解決方案(兩種也可以結(jié)合使用):
啟用kubelet的Node Allocatable特性叶眉,為系統(tǒng)守護(hù)進(jìn)程和k8s組件預(yù)留資源址儒。 官方文檔:https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources
設(shè)置pod的驅(qū)逐策略,在pod使用資源到一定程度時(shí)進(jìn)行pod驅(qū)逐衅疙。官方文檔:https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/#eviction-policy
本篇文章主要介紹如何正確配置資源預(yù)留莲趣,Pod的驅(qū)逐以后介紹。
kubelet的啟動(dòng)配置中有一個(gè)Node Allocatable特性饱溢,來(lái)為系統(tǒng)守護(hù)進(jìn)程和k8s組件預(yù)留計(jì)算資源喧伞,使得即使節(jié)點(diǎn)滿(mǎn)負(fù)載運(yùn)行時(shí),也不至于出現(xiàn)pod去和系統(tǒng)守護(hù)進(jìn)程以及k8s組件爭(zhēng)搶資源绩郎,導(dǎo)致節(jié)點(diǎn)掛掉的情況潘鲫。目前支持對(duì)CPU, memory, ephemeral-storage三種資源進(jìn)行預(yù)留。kubernetes官方建議根據(jù)各個(gè)節(jié)點(diǎn)的負(fù)載情況來(lái)具體配置相關(guān)參數(shù)肋杖。
節(jié)點(diǎn)計(jì)算資源的分配如下圖所示:
Node Capacity
---------------------------|? ? kube-reserved? ? ? ||-------------------------||? ? system-reserved? ? ||-------------------------||? ? eviction-threshold? ||-------------------------||? ? ? ? ? ? ? ? ? ? ? ? ||? ? ? allocatable? ? ? ? ||? (available for pods)? ||? ? ? ? ? ? ? ? ? ? ? ? ||? ? ? ? ? ? ? ? ? ? ? ? |
---------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14
其中各個(gè)部分的含義如下:?
- Node Capacity:Node的硬件資源總量?
- kube-reserved:給k8s系統(tǒng)進(jìn)程預(yù)留的資源(包括kubelet溉仑、container runtime、node problem detector等状植,但不會(huì)給以pod形式起的k8s系統(tǒng)進(jìn)程預(yù)留資源)?
- system-reserved:給linux系統(tǒng)守護(hù)進(jìn)程預(yù)留的資源?
- eviction-threshold:通過(guò)--eviction-hard參數(shù)為節(jié)點(diǎn)預(yù)留內(nèi)存浊竟,當(dāng)節(jié)點(diǎn)可用內(nèi)存值低于此值時(shí)怨喘,kubelet會(huì)進(jìn)行pod的驅(qū)逐?
- allocatable:是真正可供節(jié)點(diǎn)上Pod使用的容量,kube-scheduler調(diào)度Pod時(shí)的參考此值(kubectl describe node可以看到逐沙,Node上所有Pods的request量不超過(guò)Allocatable)
節(jié)點(diǎn)可供Pod使用資源總量的計(jì)算公式如下:
allocatable=NodeCapacity-[kube-reserved] - [system-reserved] - [eviction-threshold]
1
從公式可以看出哲思,默認(rèn)情況下(不設(shè)置kube-reserved、system-reserved吩案、eviction-threshold)節(jié)點(diǎn)上默認(rèn)可以讓Pod使用的資源總量等于節(jié)點(diǎn)的總?cè)萘浚瑫?huì)導(dǎo)致Pod與系統(tǒng)進(jìn)程和k8s組件爭(zhēng)搶資源的情況發(fā)生帝簇。
kubelet的啟動(dòng)參數(shù)中涉及資源預(yù)留的主要有如下幾個(gè):
--cgroups-per-qos
--cgroup-driver
--cgroup-root
--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]
--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi]
--kube-reserved-cgroup
--system-reserved=[cpu=100mi][,][memory=100Mi][,][ephemeral-storage=1Gi]
--system-reserved-cgroup
--eviction-hard
--cgroups-per-qos
可選徘郭,默認(rèn)開(kāi)啟。開(kāi)啟這個(gè)參數(shù)后丧肴,kubelet會(huì)將所有的pod創(chuàng)建在kubelet管理的cgroup層次結(jié)構(gòu)下(這樣才有了限制所有Pod使用資源總量的基礎(chǔ))残揉。要想啟用Node Allocatable特性,這個(gè)參數(shù)必須開(kāi)啟芋浮。
--cgroup-driver
可選抱环。指定kubelet使用的cgroup driver。默認(rèn)為cgroupfs纸巷,還可以是systemd镇草,但是這個(gè)值需要和docker runtime所使用的cgroup driver保持一致。
--cgroup-root
可選瘤旨。指定給pod使用的根cgroup梯啤,容器運(yùn)行時(shí)會(huì)盡量將pod的資源限制在這個(gè)根cgroup下面。默認(rèn)為空存哲,即使用容器運(yùn)行時(shí)作為根cgroup因宇。
--enforce-node-allocatable
指定kubelet為哪些進(jìn)程做硬限制,可選的值有:pods,kube-reserved,system-reserve祟偷。
這個(gè)參數(shù)開(kāi)啟并指定pods后kubelet會(huì)為所有pod的總cgroup做資源限制
有需要的請(qǐng)聯(lián)系我
yxxy1717? ? ? 2317384986