在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,请参见弹性裸金属服务器概述和intel-cmt-cat。
已安装ack-koordinator组件,且组件版本为0.8.0及以上,请参见ack-koordinator(ack-slo-manager)。
费用说明
ack-koordinator组件本身的安装和使用是免费的,不过需要注意的是,在以下场景中可能产生额外的费用:
ack-koordinator是非托管组件,安装后将占用Worker节点资源。您可以在安装组件时配置各模块的资源申请量。
ack-koordinator默认会将资源画像、精细化调度等功能的监控指标以Prometheus的格式对外透出。若您配置组件时开启了ACK-Koordinator开启Prometheus监控指标选项并使用了阿里云Prometheus服务,这些指标将被视为自定义指标并产生相应费用。具体费用取决于您的集群规模和应用数量等因素。建议您在启用此功能前,仔细阅读阿里云Prometheus计费说明,了解自定义指标的免费额度和收费策略。您可以通过账单和用量查询,监控和管理您的资源使用情况。
步骤一:检查节点内核是否已开启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