Kubernetes支持将多种类型的应用以容器化的方式部署在同一台宿主机上运行,不同优先级的应用可能会竞争CPU资源,导致应用服务受损。ack-slo-manager支持基于容器的QoS等级,优先保障高优先级应用的CPU性能。本文介绍如何使用容器CPU QoS功能。

前提条件

背景信息

为了充分利用机器中的资源,通常会将高优先延迟敏感性LS(Latency-Sensitive)和低优先级BE(Best-Effort)的任务部署在同一台机器上,导致两种不同优先级任务之间存在资源竞争问题。Kubernetes根据应用的CPU Request/Limit,为容器设置物理资源限制,但仍存在容器间对CPU资源的竞争。例如,BE应用和LS应用共享物理核或逻辑核时,当BE应用负载较高时,会干扰LS应用的运行,导致服务响应延迟变高。

为了提高LS应用使用CPU资源的稳定性,降低BE应用的干扰,ack-slo-manager基于Alibaba Cloud Linux 2,提供了容器CPU QoS功能。ack-slo-manage基于Group Identity提供的Linux调度优先级,差异化保障不同优先级应用的CPU调度,将LS应用标识为高优,BE应用标识为低优,在混合部署场景中有效改善LS应用的服务质量。更多信息,请参见Group Identity功能说明

通过启用容器CPU QoS功能,您可以获取以下功能特性:
  • LS应用的任务唤醒延迟最小化。
  • BE应用的任务唤醒不会对LS容器造成性能影响。
  • BE应用的任务不会通过同时多线程SMT(Simultaneous MultiThreading)调度器共享物理核而对LS应用造成性能影响。

使用限制

系统组件版本要求如下表所示。

组件 版本要求
Kubernetes ≥1.18
ack-slo-manager ≥0.5.2
Helm版本 ≥v3.0
操作系统 Alibaba Cloud Linux 2(版本号详情请参见Group Identity功能说明
说明 若您未使用Alibaba Cloud Linux 2,可以使用ack-slo-manager提供的CPU弹性资源限制功能,保障容器CPU服务质量。更多信息,请参见弹性资源限制

操作步骤

  1. 使用以下ConfigMap,创建configmap.yaml文件。
    #ConfigMap ack-slo-config样例。
    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的优先级。默认值依据QoS,LS对应2,BE对应-1。0表示关闭。

    groupIdentity值越大,表示容器在内核调度的优先级越高。例如,按默认配置,QoS等级为LS的容器Group Identity接口配置为cpu.bvt_warp_ns=2,BE容器配置为cpu.bvt_warp_ns=-1。更多信息,请参见Group Identity功能说明

    说明 对于未指定alibabacloud.com/qosClass的Pod,ack-slo-manager将参考Pod原生的QOSClass来设置参数,其中Besteffort使用ConfigMap中BE的配置,其他QOSClass使用ConfigMap中LS的配置。
  2. 查看命名空间kube-system下是否存在ConfigMap ack-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
  3. 使用以下YAML内容,创建ls-pod-demo.yaml文件。
    apiVersion: v1
    kind: Pod
    metadata:
      name: ls-pod-demo
      annotations:
        alibabacloud.com/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
  4. 执行以下命令,将ls-pod-demo部署到集群。
    kubectl apply -f ls-pod-demo.yaml
  5. 执行以下命令,在单机端的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
  6. 使用以下YAML内容,创建be-pod-demo.yaml文件。
    apiVersion: v1
    kind: Pod
    metadata:
      name: be-pod-demo
      annotations:
        alibabacloud.com/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
  7. 执行以下命令,将be-pod-demo部署到集群。
    kubectl apply -f be-pod-demo.yaml
  8. 执行以下命令,在单机端的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容器为Group Identity高优先级,BE容器为Group Identity低优先级,表示LS容器的CPU服务质量将被优先保障。