启用容器L3 Cache及内存带宽隔离

在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应用的服务质量。

前提条件

费用说明

ack-koordinator组件本身的安装和使用是免费的,不过需要注意的是,在以下场景中可能产生额外的费用:

  • ack-koordinator是非托管组件,安装后将占用Worker节点资源。您可以在安装组件时配置各模块的资源申请量。

  • ack-koordinator默认会将资源画像、精细化调度等功能的监控指标以Prometheus的格式对外透出。若您配置组件时开启了ACK-Koordinator开启Prometheus监控指标选项并使用了阿里云Prometheus服务,这些指标将被视为自定义指标并产生相应费用。具体费用取决于您的集群规模和应用数量等因素。建议您在启用此功能前,仔细阅读阿里云Prometheus计费说明,了解自定义指标的免费额度和收费策略。您可以通过账单和用量查询,监控和管理您的资源使用情况。

步骤一:检查节点内核是否已开启RDT

在使用容器L3 Cache及内存带宽隔离功能前,您需要确保已开启内核RDT能力。

  1. 执行以下命令,查看内核RDT能力是否开启。

    cat /proc/cmdline

    预期输出:

    #其他内容已省略,本示例仅显示BOOT_IMAGE字段的RDT部分。
    BOOT_IMAGE=... rdt=cmt,l3cat,l3cdp,mba

    若输出内容中包含l3catmba选项,表示内核RDT能力已开启;若不包含,请执行下一步操作。

  2. 开启内核RDT能力。

    1. 编辑/etc/default/grub文件,在GRUB_CMDLINE_LINUX字段增加RDT相关配置。

      # 其余内容已省略,本示例仅显示GRUB_CMDLINE_LINUX字段的RDT部分。
      GRUB_CMDLINE_LINUX="... rdt=cmt,mbmtotal,mbmlocal,l3cat,l3cdp,mba" 
      重要

      请使用空格符将新增的RDT配置与其他内容进行分隔。

    2. 执行以下命令,生成新版本grub.cfg文件。

      # 文件路径以实际情况为准。
      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
    3. 执行以下命令,重启节点。

      sudo systemctl reboot

步骤二:使用L3 Cache及MBA隔离功能

内核RDT开启后,您可以在集群维度通过ConfigMap启用L3 Cache及MBA隔离功能。您也可以自行配置不同QoS类Pod可使用的L3 Cache和MBA资源比例,实现更灵活的、更精细化的资源管理。启用后,您可以在Pod YAML中声明其QoS级别,约束可使用L3 Cache及MBA资源量。

  1. 使用以下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隔离机制。
              }
            }
          }
        }
  2. 查看命名空间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
  3. (可选)使用以下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

  4. 参见以下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"]
  5. 执行以下命令,将pod-demo.yaml部署到集群中。

    kubectl apply -f pod-demo.yaml