Kubernetes支持将多种类型的应用以容器化的方式部署在同一台宿主机上运行,不同优先级的应用会共享宿主机的三级缓存L3 Cache(Last Level Cache)和内存带宽MBA(Memory
Bandwidth Allocation)。ack-slo-manager提供了对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。
准备工作
在使用容器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文件。
#文件路径以实际情况为准。
grub2-mkconfig -o /boot/grub2/grub.cfg
- 执行以下命令,重启节点。
操作步骤
内核RDT能力开启后,使用L3 Cache及MBA隔离功能的具体步骤如下:
- 使用以下YAML内容,创建configmap.yaml文件。
enable
为
true
表示开启对BE类型Pod的L3 Cache及MBA隔离机制。
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-manager-config
namespace: kube-system
data:
resource-qos-config: |
{
"clusterStrategy": {
"beClass": {
"resctrlQOS": {
"enable": true
}
}
}
}
- 执行以下命令,更新ConfigMap。
使用PATCH方式进行更新,避免干扰ConfigMap中其他配置项。
kubectl patch cm -n kube-system ack-slo-manager-config --patch "$(cat configmap.yaml)"
- 使用以下YAML内容,创建pod-demo.yaml文件。
指定Pod的QoS级别为
BE
,约束Pod对L3 Cache及MBA资源的使用。
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
labels:
name: pod-demo
annotations:
alibabacloud.com/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-manager-config样例。
apiVersion: v1
kind: ConfigMap
metadata:
name: ack-slo-manager-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 :表示集群开启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 。
|
说明 ack-slo-manager完全兼容了原resource-controller组件的配置形式,我们强烈建议您使用新的配置模式。您也可以暂时沿用原配置,若您想了解原配置模式的更多细节,请
提交工单。