Kubernetes支持将多种类型的应用以容器化的方式部署在同一台宿主机上运行,不同优先级的应用可能会竞争CPU资源,导致应用服务受损。ack-koordinator支持基于容器的QoS等级,优先保障高优先级应用的CPU性能。本文介绍如何使用容器CPU QoS功能。
背景信息
为了充分利用机器中的资源,通常会将高优先延迟敏感性LS(Latency-Sensitive)和低优先级BE(Best-Effort)的任务部署在同一台机器上,导致两种不同优先级任务之间存在资源竞争问题。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应用的服务质量。更多信息,请参见Group Identity功能说明。
通过启用容器CPU QoS功能,您可以获取以下功能特性:
LS应用的任务唤醒延迟最小化。
BE应用的任务唤醒不会对LS容器造成性能影响。
BE应用的任务不会通过同时多线程SMT(Simultaneous MultiThreading)调度器共享物理核而对LS应用造成性能影响。
前提条件
仅支持ACK Pro版集群。具体操作,请参见创建ACK Pro版集群。
已安装ack-koordinator(原ack-slo-manager)。具体操作,请参见ack-koordinator(ack-slo-manager)。
使用限制
系统组件版本要求如下表所示。
组件 | 版本要求 |
Kubernetes | ≥v1.18 |
≥v0.8.0 | |
Helm版本 | ≥v3.0 |
操作系统 | Alibaba Cloud Linux(版本号详情,请参见Group Identity功能说明) |
若您未使用Alibaba Cloud Linux,可以使用ack-koordinator提供的CPU弹性资源限制功能,保障容器CPU服务质量。更多信息,请参见弹性资源限制。
费用说明
ack-koordinator组件本身的安装和使用是免费的,不过需要注意的是,在以下场景中可能产生额外的费用:
ack-koordinator是非托管组件,安装后将占用Worker节点资源。您可以在安装组件时配置各模块的资源申请量。
ack-koordinator默认会将资源画像、精细化调度等功能的监控指标以Prometheus的格式对外透出。若您配置组件时开启了ACK-Koordinator开启Prometheus监控指标选项并使用了阿里云Prometheus服务,这些指标将被视为自定义指标并产生相应费用。具体费用取决于您的集群规模和应用数量等因素。建议您在启用此功能前,仔细阅读阿里云Prometheus计费说明,了解自定义指标的免费额度和收费策略。您可以通过账单和用量查询,监控和管理您的资源使用情况。
操作步骤
使用以下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 } } } }
lsClass
、beClass
分别用于配置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功能说明。说明对于未指定
koordinator.sh/qosClass
的Pod,ack-koordinator将参考Pod原生的QoSClass来设置参数,其中Besteffort使用ConfigMap中BE的配置,其他QoSClass使用ConfigMap中LS的配置。查看命名空间
kube-system
下是否存在ConfigMapack-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
使用以下YAML内容,创建ls-pod-demo.yaml文件。
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
执行以下命令,将ls-pod-demo部署到集群。
kubectl apply -f ls-pod-demo.yaml
执行以下命令,在单机端的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
使用以下YAML内容,创建be-pod-demo.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
执行以下命令,将be-pod-demo部署到集群。
kubectl apply -f be-pod-demo.yaml
执行以下命令,在单机端的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服务质量将被优先保障。
FAQ
当前已经通过ack-slo-manager的旧版本协议使用了CPU QoS功能,升级为ack-koordinator后是否继续支持CPU QoS功能?
旧版本(≤0.8.0)的Pod协议:在Pod的Annotation中填写alibabacloud.com/qosClass
。
ack-koordinator保持了对以上旧版本协议的兼容,您可以将组件无缝升级至ack-koordinator。ack-koordinator将对以上旧版本协议兼容至2023年7月30日,我们建议您将原协议资源字段及时升级到新版本。
ack-koordinator各版本对CPU QoS功能的适配如下。
ack-koordinator版本 | alibabacloud.com协议 | koordinator.sh协议 |
≥0.5.2且<0.8.0 | 支持 | 不支持 |
≥0.8.0 | 支持 | 支持 |