啟用容器L3 Cache及內(nèi)存帶寬隔離
在Kubernetes集群中,多個(gè)Pod可能會(huì)混合在部署在同一節(jié)點(diǎn)上,共享宿主機(jī)的三級(jí)緩存L3 Cache(Last Level Cache)和內(nèi)存帶寬MBA(Memory Bandwidth Allocation),在資源緊張時(shí)產(chǎn)生資源爭搶。推薦您開啟L3 Cache及內(nèi)存帶寬的隔離能力,在資源競爭時(shí)優(yōu)先保障高優(yōu)應(yīng)用的服務(wù)質(zhì)量。
為了幫助您更好地理解本文檔并使用本功能,推薦您參見Kubernetes官方文檔了解Pod Qos類、為容器和 Pod 分配內(nèi)存資源等概念。
為什么需要容器L3 Cache及內(nèi)存帶寬隔離
為了充分利用節(jié)點(diǎn)資源,您可能會(huì)將多個(gè)Pod混合部署在同一臺(tái)機(jī)器上,共享宿主機(jī)的L3 Cache內(nèi)存帶寬。如果不進(jìn)行隔離控制,集群資源緊張時(shí),不同優(yōu)先級(jí)的Pod在使用L3 Cache和內(nèi)存帶寬等資源時(shí)可能會(huì)出現(xiàn)資源競爭,導(dǎo)致高優(yōu)任務(wù)無法得到足夠的資源保障,繼而使得服務(wù)質(zhì)量受到影響。
RDT(Resource Director Technology)提供了對(duì)不同優(yōu)先級(jí)應(yīng)用的資源隔離能力。您可以通過ConfigMap開啟L3 Cache及MBA隔離功能,并在BE類型Pod的YAML中聲明可使用的L3 Cache和MBA資源量,以有效保障LS應(yīng)用的服務(wù)質(zhì)量。
前提條件
已創(chuàng)建集群,且節(jié)點(diǎn)為彈性裸金屬類型,同時(shí)CPU型號(hào)支持RDT,請(qǐng)參見彈性裸金屬服務(wù)器概述和intel-cmt-cat。
已安裝ack-koordinator組件,且組件版本為0.8.0及以上,請(qǐng)參見ack-koordinator(ack-slo-manager)。
費(fèi)用說明
ack-koordinator組件本身的安裝和使用是免費(fèi)的,不過需要注意的是,在以下場景中可能產(chǎn)生額外的費(fèi)用:
ack-koordinator是非托管組件,安裝后將占用Worker節(jié)點(diǎn)資源。您可以在安裝組件時(shí)配置各模塊的資源申請(qǐng)量。
ack-koordinator默認(rèn)會(huì)將資源畫像、精細(xì)化調(diào)度等功能的監(jiān)控指標(biāo)以Prometheus的格式對(duì)外透出。若您配置組件時(shí)開啟了ACK-Koordinator開啟Prometheus監(jiān)控指標(biāo)選項(xiàng)并使用了阿里云Prometheus服務(wù),這些指標(biāo)將被視為自定義指標(biāo)并產(chǎn)生相應(yīng)費(fèi)用。具體費(fèi)用取決于您的集群規(guī)模和應(yīng)用數(shù)量等因素。建議您在啟用此功能前,仔細(xì)閱讀阿里云Prometheus計(jì)費(fèi)說明,了解自定義指標(biāo)的免費(fèi)額度和收費(fèi)策略。您可以通過賬單和用量查詢,監(jiān)控和管理您的資源使用情況。
步驟一:檢查節(jié)點(diǎn)內(nèi)核是否已開啟RDT
在使用容器L3 Cache及內(nèi)存帶寬隔離功能前,您需要確保已開啟內(nèi)核RDT能力。
執(zhí)行以下命令,查看內(nèi)核RDT能力是否開啟。
cat /proc/cmdline
預(yù)期輸出:
#其他內(nèi)容已省略,本示例僅顯示BOOT_IMAGE字段的RDT部分。 BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mba
若輸出內(nèi)容中包含
l3cat
和mba
選項(xiàng),表示內(nèi)核RDT能力已開啟;若不包含,請(qǐng)執(zhí)行下一步操作。開啟內(nèi)核RDT能力。
編輯/etc/default/grub文件,在
GRUB_CMDLINE_LINUX
字段增加RDT相關(guān)配置。# 其余內(nèi)容已省略,本示例僅顯示GRUB_CMDLINE_LINUX字段的RDT部分。 GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba"
重要請(qǐng)使用空格符將新增的RDT配置與其他內(nèi)容進(jìn)行分隔。
執(zhí)行以下命令,生成新版本grub.cfg文件。
# 文件路徑以實(shí)際情況為準(zhǔn)。 sudo grub2-mkconfig -o /boot/grub2/grub.cfg
執(zhí)行以下命令,重啟節(jié)點(diǎn)。
sudo systemctl reboot
步驟二:使用L3 Cache及MBA隔離功能
內(nèi)核RDT開啟后,您可以在集群維度通過ConfigMap啟用L3 Cache及MBA隔離功能。您也可以自行配置不同QoS類Pod可使用的L3 Cache和MBA資源比例,實(shí)現(xiàn)更靈活的、更精細(xì)化的資源管理。啟用后,您可以在Pod YAML中聲明其QoS級(jí)別,約束可使用L3 Cache及MBA資源量。
使用以下YAML內(nèi)容,創(chuàng)建configmap.yaml文件。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: resource-qos-config: | { "clusterStrategy": { "beClass": { "resctrlQOS": { "enable": true # 配置為true,開啟對(duì)BE類型Pod的L3 Cache及MBA隔離機(jī)制。 } } } }
查看命名空間kube-system下是否存在ConfigMap
ack-slo-config
。存在:使用PATCH方式進(jìn)行更新,避免干擾ConfigMap中其他配置項(xiàng)。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
不存在:執(zhí)行以下命令創(chuàng)建ConfigMap。
kubectl apply -f configmap.yaml
(可選)使用以下YAML內(nèi)容,配置高級(jí)參數(shù),按照QoS進(jìn)行精細(xì)化配置。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: resource-qos-config: | { "clusterStrategy": { "lsClass": { "resctrlQOS": { "enable": true, "catRangeEndPercent": 100, "mbaPercent": 100 } }, "beClass": { "resctrlQOS": { "enable": true, "catRangeEndPercent": 30, "mbaPercent": 100 } } } }
主要參數(shù)說明如下。
參數(shù)
類型
取值范圍
說明
enable
Boolean
true
false
true
:集群開啟L3 Cache及MBA的隔離能力。false
:集群關(guān)閉L3 Cache及MBA的隔離能力。
catRangeEndPercent
Int
[0, 100]
對(duì)應(yīng)QoS可以使用的L3 Cache比例。單位為百分比。LS等級(jí)默認(rèn)值為
100
,BE等級(jí)默認(rèn)值為30
。mbaPercent
Int
[0, 100]
對(duì)應(yīng)QoS可以使用的MBA比例。單位為百分比。當(dāng)前MBA只支持以10%的粒度進(jìn)行調(diào)節(jié),LS等級(jí)和BE等級(jí)的默認(rèn)值均為
100
。參見以下YAML內(nèi)容,約束BE Pod對(duì)L3 Cache及MBA資源的使用,創(chuàng)建pod-demo.yaml。
說明如需在工作負(fù)載(例如Deployment)中配置,請(qǐng)?jiān)?code data-tag="code" class="code">template.metadata字段下配置Pod對(duì)應(yīng)的Annotation。
apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'BE' # 指定Pod的QoS級(jí)別為BE。 spec: containers: - name: pod-demo image: polinux/stress resources: requests: cpu: 1 memory: "50Mi" limits: cpu: 1 memory: "1Gi" command: ["stress"] args: ["--vm", "1", "--vm-bytes", "256M", "-c", "2", "--vm-hang", "1"]
執(zhí)行以下命令,將pod-demo.yaml部署到集群中。
kubectl apply -f pod-demo.yaml