启用容器CPU QoS

在Kubernetes集群中,您可能会将延迟敏感型LS(Latency Sensitive)和低优先级BE(Best Effort)的应用部署在同一节点上。虽然应用会有CPU Request和Limit的限制,但不同优先级的应用之间可能会存在CPU资源的争抢,导致服务质量,尤其是高优先级应用的服务质量下降。建议您开启容器CPU QoS功能,优先保障LS应用的CPU资源使用。

说明

为了帮助您更好地理解本文档并使用本功能,推荐您参见Kubernetes官方文档了解Pod Qos类为容器和 Pod 分配内存资源等概念,并参见Group Identity功能说明了解Group Identity功能原理。

为什么需要容器CPU QoS

为了充分利用节点资源,在离线混部场景会将高优先级的LS应用和低优先级的BE应用部署在同一台机器上。虽然Kubernetes根据应用的CPU Request和Limit限制容器物理资源的使用,但容器间CPU资源的竞争仍然不可避免。例如,BE应用和LS应用共享物理核或逻辑核时,在BE应用负载较高时,会干扰LS应用的运行,导致服务响应延迟变高。

为了提高LS应用可用的CPU资源的稳定性,降低BE应用带来的干扰,ack-koordinator基于Alibaba Cloud Linux提供了容器CPU QoS功能。ack-koordinator基于Group Identity提供的Linux调度优先级支持差异化保障不同优先级应用的CPU调度,将LS应用标识为高优,BE应用标识为低优,在混合部署场景中有效改善LS应用的服务质量。

启用容器CPU QoS后,您将获得以下功能特性。

  • LS应用的任务能更快地被操作系统调度运行,提高响应速度和性能。

  • BE应用的任务被唤醒时,不会抢占LS应用的进程,避免对高优先级任务的干扰。

  • 即使在同时多线程SMT(Simultaneous MultiThreading)的场景下,BE应用的任务也不会与LS应用的任务在同一物理核心上并行执行,防止BE任务因争夺同一物理核心的计算资源而对LS任务的性能产生影响。

前提条件

  • 已创建ACK集群,且符合以下要求:

    • 集群版本:1.18及以上。如需升级集群,请参见手动升级集群

    • 操作系统:本功能使用的Group Identity参数依赖Alibaba Cloud Linux。关于内核版本号限制,请参见Group Identity功能说明

      说明

      若您的操作系统类型不是Alibaba Cloud Linux,您可以使用CPU弹性资源限制功能控制BE类型Pod可使用的CPU资源量,请参见启用CPU资源弹性限制能力

  • 已安装ack-koordinator组件,且组件版本为v0.8.0及以上,请参见ack-koordinator(ack-slo-manager)

费用说明

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

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

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

操作步骤

您可以通过ConfigMap在集群维度开启容器CPU QoS功能,为LS、BE类型的Pod配置对应的CPU Group Identity的优先级。Group Identity可以为每一个CPU cgroup设置身份标识,系统内核在调度包含具有身份标识的任务时,会根据不同的优先级做相应处理。

配置完成后,您便可以在Pod YAML中通过Labelkoordinator.sh/qosClass声明Pod对应的CPU QoS类。对于未指定koordinator.sh/qosClass的Pod,ack-koordinator将遵循Kubernetes原生的QoS类来配置,其中BestEffort类型的Pod为BE、其他QoS类的Pod为LS

  1. 使用以下ConfigMap,创建configmap.yaml文件,启用CPU QoS功能。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
    data:
      # 开启容器CPU QoS功能。
      resource-qos-config: |
        {
          "clusterStrategy": {
            "lsClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": 2
              }
            },
            "beClass": {
              "cpuQOS": {
                "enable": true,
                "groupIdentity": -1
              }
            }
          }
        }

    lsClassbeClass分别用于配置QoS等级为LS、BE的Pod,cpuQOS用于配置容器CPU QoS功能。关键参数说明如下。

    参数

    类型

    取值范围

    说明

    enable

    Boolean

    • true

    • false

    • true:集群全局开启容器CPU QoS功能。

    • false:集群全局关闭容器CPU QoS功能。

    groupIdentity

    Int

    [-1, 2]

    CPU Group Identity的优先级。groupIdentity值越大,表示容器在内核调度的优先级越高。更多信息,请参见Group Identity功能说明

    默认情况下,LS Pod为2,BE为-10表示关闭。

  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内容,创建ls-pod-demo.yaml文件,其中指定Pod的QoS类为LS,并将YAML文件部署到集群中。

    说明

    如需在工作负载(例如Deployment)中配置,请在template.metadata字段下配置Pod对应的Annotation。

    apiVersion: v1
    kind: Pod
    metadata:
      name: ls-pod-demo
      labels:
        koordinator.sh/qosClass: 'LS' # 指定Pod的QoS类为LS。
    spec:
      containers:
      - command:
        - httpd
        - -D
        - FOREGROUND
        image: registry.cn-zhangjiakou.aliyuncs.com/acs/apache-2-4-51-for-slo-test:v0.1
        imagePullPolicy: Always
        name: apache
        resources:
          limits:
            cpu: "4"
            memory: 10Gi
          requests:
            cpu: "4"
            memory: 10Gi
      restartPolicy: Never
      schedulerName: default-scheduler
    kubectl apply -f ls-pod-demo.yaml
  4. 执行以下命令,在单机端的Cgroup分组中查看LS Pod的内核Group Identity生效情况。

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-pod1c20f2ad****.slice/cpu.bvt_warp_ns

    预期输出:

    # LS Pod的Group Identity优先级为2,表示高优。
    2
  5. 使用以下YAML内容,创建be-pod-demo.yaml文件,其中指定Pod的QoS类为BE,并将YAML文件部署到集群中。

    apiVersion: v1
    kind: Pod
    metadata:
      name: be-pod-demo
      labels:
        koordinator.sh/qosClass: 'BE' # 指定Pod的QoS类为BE。
    spec:
      containers:
        - args:
            - '-c'
            - '1'
            - '--vm'
            - '1'
          command:
            - stress
          image: polinux/stress
          imagePullPolicy: Always
          name: stress
      restartPolicy: Always
      schedulerName: default-scheduler
    kubectl apply -f be-pod-demo.yaml
  6. 执行以下命令,在单机端的Cgroup分组中查看BE Pod的内核Group Identity生效情况。

    cat /sys/fs/cgroup/cpu/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-pod4b6e96c8****.slice/cpu.bvt_warp_ns

    预期输出:

    # BE Pod的Group Identity优先级为-1,表示低优。
    -1

    预期输出表明,LS Pod的Group Identity为高优先级,BE Pod的Group Identity为低优先级,即LS Pod的CPU服务质量将被优先保障。

FAQ

当前已经通过ack-slo-manager的旧版本协议使用了CPU QoS功能,升级为ack-koordinator后是否继续支持CPU QoS功能?

旧版本(≤0.8.0)的Pod协议中,通过在Pod的Annotation中填写alibabacloud.com/qosClass启用CPU QoS。

ack-koordinator保持了对以上旧版本协议的兼容,您可以将组件无缝升级至ack-koordinator,并逐步将Pod切换为koordinator.sh协议。ack-koordinator将对以上旧版本协议兼容至2023年07月30日,我们建议您将原协议资源字段及时升级到新版本。

ack-koordinator各版本对CPU QoS功能的适配如下。

组件版本

alibabacloud.com协议

koordinator.sh协议

≥0.5.2且<0.8.0

支持

不支持

≥0.8.0

支持

支持