Kubernetes支援將多種類型的應用以容器化的方式部署在同一台宿主機上運行,不同優先順序的應用會共用宿主機的三級緩衝L3 Cache(Last Level Cache)和記憶體頻寬MBA(Memory Bandwidth Allocation)。ack-koordinator提供了對L3 Cache及記憶體頻寬的隔離能力,避免在資源競爭時影響高優先順序應用的服務品質。本文介紹如何控制不同優先順序應用使用L3 Cache和MBA隔離策略。
背景資訊
為了充分利用機器中的資源,通常會將高優先延遲敏感性LS(Latency-Sensitive)和低優先順序BE(Best-Effort)的任務部署在同一台機器上,導致兩種不同優先順序任務之間存在資源競爭問題。如果不進行隔離控制,不同優先順序的任務在使用L3 cache和MBA記憶體頻寬等資源時可能會出現資源競爭,從而無法保證給LS業務分配足夠的資源,導致LS應用的服務品質受到影響。
RDT(Resource Director Technology)提供了對不同優先順序應用的資源隔離能力,通過限制BE類型應用對L3 Cache和MBA資源的使用量,可以有效保障混合部署情境中LS應用的服務品質。關於RDT的更多資訊,請參見resource-director-technology。
前提條件
已安裝Helm組件,且版本≥3.0。關於Helm的升級操作,請參見【組件升級】Helm V2 Tiller升級公告或如何手動升級Helm的版本?。
宿主機節點為彈性裸金屬類型,且CPU型號支援RDT。更多資訊,請參見ECS Bare Metal Instance概述和intel-cmt-cat。
已安裝ack-koordinator組件(原ack-slo-manager),且版本≥0.8.0,具體操作,請參見ack-koordinator(ack-slo-manager)。
費用說明
ack-koordinator組件本身的安裝和使用是免費的,不過需要注意的是,在以下情境中可能產生額外的費用:
準備工作
在使用容器L3 Cache及記憶體頻寬隔離功能前,您需要確保已開啟核心RDT能力。查看及開啟核心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
操作步驟
核心RDT能力開啟後,使用L3 Cache及MBA隔離功能的具體步驟如下:
使用以下YAML內容,建立configmap.yaml檔案。
enable
為true
表示開啟對BE類型Pod的L3 Cache及MBA隔離機制。apiVersion: v1 kind: ConfigMap metadata: name: ack-slo-config namespace: kube-system data: resource-qos-config: | { "clusterStrategy": { "beClass": { "resctrlQOS": { "enable": true } } } }
查看命名空間
kube-system
下是否存在ConfigMapack-slo-config
。若存在ConfigMap
ack-slo-config
,請使用PATCH方式進行更新,避免幹擾ConfigMap中其他配置項。kubectl patch cm -n kube-system ack-slo-config --patch "$(cat configmap.yaml)"
若不存在ConfigMap
ack-slo-config
,請執行以下命令建立ConfigMap。kubectl apply -f configmap.yaml
使用以下YAML內容,建立pod-demo.yaml檔案。
指定Pod的QoS層級為
BE
,約束Pod對L3 Cache及MBA資源的使用。apiVersion: v1 kind: Pod metadata: name: pod-demo labels: koordinator.sh/qosClass: '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部署到叢集中。
kubectl apply -f pod-demo.yaml
使用以下YAML內容,配置進階參數。
L3 Cache及MBA的隔離能力支援按照QoS等級進行精細化配置。
#ConfigMap ack-slo-config範例。 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只支援以10%的粒度進行調節,LS等級和BE等級的預設值均為
100
。