雖然用戶可以Kubernetes隨意創(chuàng)建和使用Pod粘捎,但是有些特殊的使用場景需要更高的性能和更短的訪問延時(shí)十绑。kubelet提供了一些方法來管理各種復(fù)雜的工作負(fù)載野建。
準(zhǔn)備工作
具有一個(gè)部署好的Kubernetes集群梳玫,并且可以使用kubectl命令行工具與集群互通扬蕊。如果您還沒有集群谊囚,則可以使用Minikube創(chuàng)建一個(gè)集群怕享,也可以使用以下兩種工具進(jìn)行部署:
可以通過命令kubectl version
來核查kubernetes的版本。
kubernetes的CPU 管理策略
默認(rèn)情況下镰踏,kubelet使用CFS quota 機(jī)制限制Pod 的CPU資源函筋。當(dāng)node上運(yùn)行許多設(shè)置了CPU limit的Pod時(shí),不同pod上的工作負(fù)載可能在不同的CPU 核心上來回切換奠伪,不同的Pod中的計(jì)算task運(yùn)行在哪個(gè)CPU核心上具體取決于Pod是否設(shè)置了limit以及在被執(zhí)行時(shí)哪個(gè)CPU核心時(shí)空閑可用的跌帐。許多業(yè)務(wù)的工作負(fù)載在不同的CPU核心之間進(jìn)行不停切換的情況并不敏感,因此也感知不到不停地CPU切換核心帶來的負(fù)面影響绊率。
但是谨敛,在對(duì)CPU cache親和性和調(diào)度延遲敏感的業(yè)務(wù)場景中,kubelet可以通過設(shè)置CPU管理策略來確定node上CPU核心調(diào)度的優(yōu)先級(jí)滤否,來達(dá)到較好的性能脸狸。
配置
通過kubelet的 --cpu-manager-policy
配置項(xiàng)來設(shè)置CPU的管理策略,該配置項(xiàng)有兩個(gè)可選值:
CPU manager會(huì)定期通過CRI對(duì)資源狀態(tài)進(jìn)行更新,以使內(nèi)存欲芹、CPU實(shí)際使用數(shù)量與cgroupfs保持一致卿啡。可以通過Kubelet配置值--cpu-manager-reconcile-period設(shè)置資源狀態(tài)更新頻率菱父。如果未指定颈娜,則默認(rèn)為與--node-status-update-frequency的值相同。
None
none
策略會(huì)顯式的使用默認(rèn)的CPU親和性方案滞伟,CPU的親和性完全依賴于操作系統(tǒng)的自動(dòng)調(diào)度揭鳞。對(duì)于Guaranteed pods 的CPU限制會(huì)強(qiáng)制POD使用CFS的配合。
Static
static
策略:若Guaranteed
級(jí)別的Pod中的Container中的CPU限制是大于等于1的整數(shù)梆奈,那么Container就可以運(yùn)行在node上特定的一個(gè)或者幾個(gè)獨(dú)享CPU核心上野崇。這種CPU核心的獨(dú)享是通過cpuset cgroup controller來保證的.
Note: 像container runtime和kubelet這樣的系統(tǒng)服務(wù)也可以運(yùn)行在獨(dú)享CPU上。這種獨(dú)享性是相對(duì)于其他的Pod而言的亩钟。
Note: CPU Manager不支持在運(yùn)行時(shí)對(duì)CPU進(jìn)行online和offline操作乓梨。若node上的CPU發(fā)生了改變鳖轰,則必須對(duì)該node進(jìn)行維護(hù)并且通過刪除kubelet根目錄下的
cpu_manager_state
狀態(tài)文件對(duì)CPU manager進(jìn)行手動(dòng)重置。
該策略管理著一個(gè)CPU的共享池扶镀,該共享池初始包含了node上的所有CPU蕴侣。可分配的獨(dú)享CPU的數(shù)量等于node上CPU的總數(shù)減去kubelet通過--kube-reserved
或者 --system-reserved
選項(xiàng)指定的保留CPU的數(shù)目臭觉。通過這些選項(xiàng)指定的保留CPU的個(gè)數(shù)必須是整數(shù)昆雀,并且在初始的共享池中按照物理CPU的Core ID的升序順序依次設(shè)置為保留狀態(tài)。BestEffort
和 Burstable
類型的Pod以及CPU核數(shù)設(shè)置為非整數(shù)的 Guaranteed
類型的Pod會(huì)已共享的方式使用共享池中的剩余CPU蝠筑。只有requests和limits的值為整數(shù)的 Guaranteed
類型的Pod才會(huì)以獨(dú)享的方式使用共享池中的CPU狞膘。
Note: 當(dāng)啟用static策略時(shí),必須通過--kube-reserved和/或--system-reserved選項(xiàng)為kubelet保留一部分CPU什乙,而保留的數(shù)量必須大于0挽封。因?yàn)槿魹閗ubelet的保留CPU為零的話,共享池變就有變?yōu)榭盏目赡苄浴?/p>
當(dāng)node滿足Guaranteed
級(jí)別的Pod的資源需求且啟用了static策略時(shí)臣镣,該pod將會(huì)被調(diào)度到該node上辅愿,進(jìn)而從該node的共享池中移除pod所需要的數(shù)量的CPU核心并將這些CPU放置到容器的cpuset中。 static策略可以增加計(jì)算密集型工作負(fù)載的CPU親和性并減少CPU上下文切換的次數(shù)忆某。
假設(shè)有如下幾種Pods点待,我們針對(duì)其進(jìn)行分析:
spec:
containers:
- name: nginx
image: nginx
由于沒有設(shè)置 requests
或 limits
,因此該P(yáng)od是BestEffort
級(jí)別的. 該P(yáng)od會(huì)運(yùn)行在共享池中.
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
由于該P(yáng)od的requests
值與limits
值是不同的褒繁,并且cpu的資源限制也沒有指定亦鳞,因此該P(yáng)od是Burstable
級(jí)別的。該P(yáng)od運(yùn)行在共享池中棒坏。
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "2"
requests:
memory: "100Mi"
cpu: "1"
由于該P(yáng)od的requests
值與limits
值是不同的燕差,因此該P(yáng)od是Burstable
級(jí)別的。該P(yáng)od運(yùn)行在共享池中坝冕。
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "2"
requests:
memory: "200Mi"
cpu: "2"
由于該P(yáng)od同時(shí)指定了requests
和 limits
的值并且兩者相同徒探,因此該P(yáng)od是Guaranteed
級(jí)別的。除此之外喂窟,container的CPU限制是大于等于1的整數(shù)测暗,因此nginx
container會(huì)運(yùn)行在兩個(gè)獨(dú)占的CPU上。
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "1.5"
requests:
memory: "200Mi"
cpu: "1.5"
由于該P(yáng)od同時(shí)指定了requests
和 limits
的值并且兩者相同磨澡,因此該P(yáng)od是Guaranteed
級(jí)別的碗啄。但是由于container中對(duì)CPU的資源限制是非整數(shù),因此該P(yáng)od運(yùn)行在共享池中稳摄,無法獨(dú)占CPU稚字。
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "200Mi"
cpu: "2"
該P(yáng)od由于只設(shè)置了limits
的值,而requests
在沒有明確指定的情況下,默認(rèn)與limits
的值相等胆描,因此該P(yáng)od是 Guaranteed
級(jí)別瘫想。并且由于container的CPU的資源限制是一個(gè)大于等于1的整數(shù)。所以nginx
container會(huì)運(yùn)行在2個(gè)獨(dú)享的CPU核心上昌讲。
總結(jié)
只有同時(shí)滿足如下條件時(shí)国夜,容器才可以運(yùn)行在獨(dú)享CPU上:
- 1 通過kubelet的 --cpu-manager-policy 配置項(xiàng)啟用static策略
- 2 容器必須是Guaranteed的級(jí)別
- 3 容器的CPU限制必須是大于等于1的整數(shù)