在Kubernetes叢集中,多個Pod可能會混合在部署在同一節點上,共用宿主機的三級緩衝L3 Cache(Last Level Cache)和記憶體頻寬MBA(Memory Bandwidth Allocation),在資源緊張時產生資源爭搶。推薦您開啟L3 Cache及記憶體頻寬的隔離能力,在資源競爭時優先保障高優應用的服務品質。
為了協助您更好地理解本文檔並使用本功能,推薦您參見Kubernetes官方文檔瞭解Pod Qos類、為容器和 Pod 分配記憶體資源等概念。
為什麼需要容器L3 Cache及記憶體頻寬隔離
為了充分利用節點資源,您可能會將多個Pod混合部署在同一台機器上,共用宿主機的L3 Cache記憶體頻寬。如果不進行隔離控制,叢集資源緊張時,不同優先順序的Pod在使用L3 Cache和記憶體頻寬等資源時可能會出現資源競爭,導致高優任務無法得到足夠的資源保障,繼而使得服務品質受到影響。
RDT(Resource Director Technology)提供了對不同優先順序應用的資源隔離能力。您可以通過ConfigMap開啟L3 Cache及MBA隔離功能,並在BE類型Pod的YAML中聲明可使用的L3 Cache和MBA資源量,以有效保障LS應用的服務品質。
前提條件
已建立叢集,且節點為彈性裸金屬類型,同時CPU型號支援RDT,請參見ECS Bare Metal Instance概述和intel-cmt-cat。
已安裝ack-koordinator組件,且組件版本為0.8.0及以上,請參見ack-koordinator(ack-slo-manager)。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
步驟一:檢查節點核心是否已開啟RDT
在使用容器L3 Cache及記憶體頻寬隔離功能前,您需要確保已開啟核心RDT能力。
執行以下命令,查看核心RDT能力是否開啟。
cat /proc/cmdline
預期輸出:
#其他內容已省略,本樣本僅顯示BOOT_IMAGE欄位的RDT部分。 BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mba
若輸出內容中包含
l3cat
和mba
選項,表示核心RDT能力已開啟;若不包含,請執行下一步操作。開啟核心RDT能力。
編輯/etc/default/grub檔案,在
GRUB_CMDLINE_LINUX
欄位增加RDT相關配置。# 其餘內容已省略,本樣本僅顯示GRUB_CMDLINE_LINUX欄位的RDT部分。 GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba"
重要請使用空格符將新增的RDT配置與其他內容進行分隔。
執行以下命令,產生新版本grub.cfg檔案。
# 檔案路徑以實際情況為準。 sudo grub2-mkconfig -o /boot/grub2/grub.cfg
執行以下命令,重啟節點。
sudo systemctl reboot
步驟二:使用L3 Cache及MBA隔離功能
核心RDT開啟後,您可以在叢集維度通過ConfigMap啟用L3 Cache及MBA隔離功能。您也可以自行配置不同QoS類Pod可使用的L3 Cache和MBA資源比例,實現更靈活的、更精細化的資源管理。啟用後,您可以在Pod YAML中聲明其QoS層級,約束可使用L3 Cache及MBA資源量。
使用以下YAML內容,建立configmap.yaml檔案。
apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: resource-qos-config: | { "clusterStrategy": { "beClass": { "resctrlQOS": { "enable": true # 配置為true,開啟對BE類型Pod的L3 Cache及MBA隔離機制。 } } } }
查看命名空間kube-system下是否存在ConfigMap
ack-slo-config
。存在:使用PATCH方式進行更新,避免幹擾ConfigMap中其他配置項。
kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
不存在:執行以下命令建立ConfigMap。
kubectl apply -f configmap.yaml
(可選)使用以下YAML內容,配置進階參數,按照QoS進行精細化配置。
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 } } } }
主要參數說明如下。
參數
類型
取值範圍
說明
enable
Boolean
true
false
true
:叢集開啟L3 Cache及MBA的隔離能力。false
:叢集關閉L3 Cache及MBA的隔離能力。
catRangeEndPercent
Int
[0, 100]
對應QoS可以使用的L3 Cache比例。單位為百分比。LS等級預設值為
100
,BE等級預設值為30
。mbaPercent
Int
[0, 100]
對應QoS可以使用的MBA比例。單位為百分比。當前MBA只支援以10%的粒度進行調節,LS等級和BE等級的預設值均為
100
。參見以下YAML內容,約束BE Pod對L3 Cache及MBA資源的使用,建立pod-demo.yaml。
說明如需在工作負載(例如Deployment)中配置,請在
template.metadata
欄位下配置Pod對應的Annotation。apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: 'BE' # 指定Pod的QoS層級為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"]
執行以下命令,將pod-demo.yaml部署到叢集中。
kubectl apply -f pod-demo.yaml