ACK为K8s原生的工作负载提供了资源画像的能力,通过对资源使用量历史数据的分析,实现了容器粒度的资源规格推荐,可以有效简化为容器配置Request和Limit的复杂度。本文介绍如何通过控制台和命令行使用资源画像功能。

前提条件

  • 仅支持ACK Pro版集群。具体操作,请参见创建ACK Pro版集群
  • 已安装ack-koordinator(原ack-slo-manager)。具体操作,请参见ack-koordinator
  • 目前,资源画像控制台已在成本套件中开放公测,可直接访问使用。

背景信息

Kubenetes为容器资源管理提供了资源请求(Request)的资源语义描述,当容器指定Request时,调度器会将其与节点的资源容量(Capacity)进行匹配,决定Pod应该被分配到哪个节点。容器的Request一般基于人工经验填写,管理员会参考容器的历史利用率情况、应用的压测表现,并根据线上运行情况的反馈持续调整。

基于人工经验的资源规格配置模式存在以下局限性:
  • 为了保障线上应用的稳定性,管理员通常会预留相当数量的资源Buffer来应对上下游链路的负载波动,容器的Request配置会远高于其实际的资源利用率,导致集群资源利用率过低,造成大量资源浪费。
  • 当集群分配率较高时,为了提升集群资源利用率,管理员会主动缩小Request配置,协调更多的资源容量。该操作会提升容器的部署密度,当应用流量上涨时会影响集群的稳定性。

针对以上问题,ack-koordinator提供资源画像能力,实现容器粒度的资源规格推荐,降低容器配置的复杂度。ACK在控制台提供了相应功能,便于应用管理员快速分析应用资源规格的合理性,并进行资源规格配置的变更。同时还提供了命令行的访问方式,支持通过CRD直接对应用资源画像进行管理。关于资源画像的更多信息,请参见云栖号视频课程-ACK资源画像

使用限制

组件 版本要求
Kubernetes ≥v1.18
metrics-server ≥v0.3.8
ack-koordinator(ack-slo-manager) ≥v0.7.1
Helm版本 ≥v3.0
重要 当您使用的容器运行时为Containerd,且节点加入集群的时间早于2022年01月19日14:00点,您需要重新加入节点或升级到最新版本的K8s。关于升级集群的具体操作,请参见 升级ACK集群K8s版本

通过控制台使用资源画像

安装资源画像

  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择成本套件 > 成本优化
  3. 成本优化页面,单击资源画像页签。
  4. 资源画像页面,单击开始安装开始升级。安装或升级完成后,将自动进入资源画像页面。
    说明

资源画像策略管理

  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择成本套件 > 成本优化
  3. 成本优化页面,单击资源画像页签,单击策略管理
  4. 策略管理对话框中,配置参数,单击确定
    策略管理
    配置项 说明 取值范围
    策略名称 资源画像策略的名称。 长度需小于64个字符,可以包含短划线(-)、下划线(_)、半角句号(.)、字母或数字,必须以字母或数字(a-z0-9A-Z)开头和结尾。
    命名空间 开启资源画像的命名空间,最终开启范围为命名空间和负载类型的交集。 当前集群内已经存在的命名空间,支持多选。
    负载类型 开启资源画像的负载类型范围,最终开启范围为命名空间和负载类型的交集。 支持K8s原生的三类工作负载,包括Deployment,StatefulSet和DaemonsSet,支持多选。
    资源消耗冗余 生成资源画像参考的安全冗余水位,详见下文描述。 要求为非负数,提供三档常用的冗余度(70%,50%,30%)。
资源消耗冗余:具体对应的场景是管理员在评估应用业务容量时(例如QPS),通常不会将物理资源使用到100%,原因既包括超线程等物理资源的局限性,也包括应用自身需要保留部分资源以应对高峰时段的负载请求。当资源画像的推荐值与原始资源请求的差距超过安全冗余时,会提示降配建议,具体算法参见 应用画像概览部分中有关画像建议的说明。 资源冗余

应用画像概览

配置完资源画像的策略后,在 资源画像页面,可以看到各工作负载的资源画像情况,页面各列的详细说明如下表所示。 资源画像详情
列名 含义 取值说明 是否支持字段筛选
工作负载名称 对应工作负载的名字(Name)。 - 支持在菜单栏顶部按名称进行精确查找。
命名空间 对应工作负载的名字(Namespace) - 支持,默认筛选条件中不包括kube-system命名空间。
工作负载类型 对应工作负载的类型。 包括Deployment,DaemonSet和StatefulSet三种类型。 支持,默认筛选条件为全部。
CPU请求 工作负载Pod的CPU资源申请量(Request)。 - 不支持。
内存请求 工作负载Pod的内存资源申请量。 - 不支持。
画像数据状态 工作负载资源画像。
  • 收集中:资源画像刚创建,累积的数据较少,首次使用时建议至少等待一天以上,确保工作负载稳定运行一段时间,完整覆盖了流量的波峰波谷之后再使用。
  • 正常:资源画像结果已经生成。
  • 工作负载已删除:对应的工作负载已经删除,画像结果将在保留一段时间后自动删除。
不支持。
CPU画像、内存画像 资源画像针对工作负载原始的资源请求量给出的规格(Request)调整建议,建议参考了资源画像的推荐值、原始资源请求量(Request)以及画像策略配置的资源消耗冗余,详见下文描述。 包括升配、降配、以及保持三种。对应加号(+)或减号(-)越多表示当前CPU请求与推荐值差距越大,若工作负载有多个容器,此处提示对应为偏差幅度最大的容器。 支持,默认筛选条件不包括保持。
创建时间 画像结果的创建时间。 - 不支持。
ACK资源画像会为工作负载的每个容器资源规格生成推荐值,通过对比推荐值(Recommend)、原始资源请求量(Request),以及画像策略的资源消耗冗余(Buffer),资源画像控制台会为工作负载生成操作的提示,例如对资源请求提高或降低(即升配或降配)。若工作负载有多个容器,则会提示偏差幅度最大的容器,具体计算原理如下:
  • 推荐值(Recommend)大于原始资源请求量(Request):表示容器长期处于资源超用状态(使用量大于申请量),存在稳定性风险,应及时提高资源规格。详细过程如下:

    计算资源推荐值(Recommend)与原始资源请求量(Request)的偏离程度(Degree)。Degree的计算公式如下:

    Degree = min(1.0, 1 - Request / Recommend)

    偏离程度范围(Degree) 提示信息 含义
    0 < Degree ≤ 0.3 升配+ 容器有少量的资源超用,应提高请求规格。
    0.3 < Degree ≤ 0.6 升配++ 容器有明显的资源超用,应提高请求规格。
    0.6 < Degree ≤ 1.0 升配+++ 容器有大量的资源超用,应提高请求规格。
  • 推荐值(Recommend)小于原始资源请求量(Request):表示容器可能有一定程度的资源浪费,可以降低资源规格,需要结合画像策略的资源消耗冗余进行判断,详情如下:
    1. 根据推荐值和画像策略的资源消耗冗余,计算目标资源规格(Target):Target = Recommend * (1 + Buffer)
    2. 计算目标资源规格(Target)与原始资源请求量(Request)的偏离程度(Degree):Degree = 1 - Request / Target
    3. 根据推荐值以及偏离程度(Degree)的水位,生成CPU和内存建议的提示操作,详情如下:
      偏离程度范围(Degree) 提示信息 含义
      -0.3 ≤ Degree < -0.1 降配- 容器有少量的资源空闲,可以降低请求规格。
      -0.6 ≤ Degree < -0.3 降配-- 容器有明显的资源空闲,可以降低请求规格。
      -1.0 ≤ Degree < -0.6 降配--- 容器有大量的资源空闲,可以降低请求规格。
  • 针对其他情况,资源画像为应用资源规格建议的提示为保持,表示可以暂时不调整。

查看应用画像详情

资源画像页面,单击工作负载名称,进入对应的画像详情页面。详情页包括三部分功能:工作负载基本信息、各容器的画像详情资源曲线、针对应用进行资源规格变更窗口。 应用画像详情
如上图所示,以CPU例,画像详情资源曲线中各项指标的含义如下:
曲线名称 含义
cpu limit 容器的CPU资源限制值。
cpu request 容器的CPU资源请求值。
cpu recommend 容器的CPU资源推荐值。
cpu usage(average) 对应工作负载内,各容器副本CPU使用量的平均值。
cpu usage(max) 对应工作负载内,各容器副本CPU使用量的最大值。

应用资源规格变更

在应用画像详情页面底部的资源变配窗口中,可以根据画像生成的推荐值修改各容器的资源规格,各列含义如下: 资源变更
参数 含义
当前所需资源 容器当前填写的资源请求量(Request)。
当前限制资源 容器当前填写的资源限制量(Limit)。
推荐值 资源画像为容器生成的推荐值,可作为资源请求量(Request)的参考值。
安全冗余 资源画像策略管理中配置的安全冗余,可作为目标所需资源的参考值,例如在推荐值的基础上累加冗余系数(如上图4.28 * 1.3 = 5.6)。
目标所需资源 容器资源请求量(Request)计划调整的目标值。
目标限制资源 容器资源限制量(Limit)计划调整的目标值。注意,若工作负载使用了CPU拓扑感知调度,CPU资源的限制需要配置为整数。

配置完成后,单击提交,将执行资源规格更新操作并自动跳转到工作负载详情页。资源规格更新后,控制器会对工作负载进行滚动更新并重新创建Pod。

通过命令行使用资源画像

操作步骤

  1. 使用以下YAML内容,开启工作负载的资源规格推荐。
    通过创建RecommendationProfile CRD可以开启工作负载的资源画像,并获取容器的资源规格推荐数据。RecommendationProfile CRD支持通过命名空间(Namespace)以及工作负载类型控制开启范围,开启范围为二者的交集。
    apiVersion: autoscaling.alibabacloud.com/v1alpha1
    kind: RecommendationProfile
    metadata:
      # 对象名称,nonNamespaced类型不需指定命名空间。
      name: profile-demo
    spec:
      # 开启资源画像的工作负载类型。
      controllerKind:
      - Deployment
      # 开启资源画像的命名空间范围。
      enabledNamespaces:
      - recommender-demo
    各项配置字段含义如下:
    参数 类型 说明
    metadata.name String 表示对象的名称。若RecommendationProfile为nonNamespaced类型,则无需指定命名空间。
    spec.controllerKind String 表示开启资源画像的工作负载类型。支持的工作负载类型包括Deployment 、StatefulSet和DaemonSet。
    spec.enabledNamespaces String 表示开启资源画像的命名空间范围。
    重要 为了确保推荐结果的准确性,建议您在开启工作负载的资源画像后最少观察等待1天以上,以便累积充足的数据。
  2. 执行kubectl get recommendations -o yaml命令,获取资源规格推荐结果。
    ack-koordinator为每个开启资源画像的工作负载生成对应的资源规格推荐,并将结果保存在Recommendation CRD中。名为 cpu-load-gen的工作负载资源规格推荐结果示例如下。
    apiVersion: autoscaling.alibabacloud.com/v1alpha1
    kind: Recommendation
    metadata:
      labels:
        alpha.alibabacloud.com/recommendation-workload-apiVersion: app-v1
        alpha.alibabacloud.com/recommendation-workload-kind: Deployment
        alpha.alibabacloud.com/recommendation-workload-name: cpu-load-gen
      name: f20ac0b3-dc7f-4f47-b3d9-bd91f906****
      namespace: recommender-demo
    spec:
      workloadRef:
        apiVersion: apps/v1
        kind: Deployment
        name: cpu-load-gen
    status:
      recommendResources:
        containerRecommendations:
        - containerName: cpu-load-gen
          target:
            cpu: 4742m
            memory: 262144k
          originalTarget: #表示资源规格推荐算法的中间结果,不建议直接使用。
           # ...
    为了便于检索,Recommendation和工作负载的Namespace一致,同时在Label中保存了工作负载的API Version、类型以及名称,格式如下表所示。
    Label Key Label含义 示例
    alpha.alibabacloud.com/recommendation-workload-apiVersion 表示工作负载的API Version,由K8s的Label规范约束,正斜线(/)将被替换为短划线(-)。 app-v1(替换前为app/v1)
    alpha.alibabacloud.com/recommendation-workload-kind 表示对应的工作负载类型,例如Deployment、StatefulSet等。 Deployment
    alpha.alibabacloud.com/recommendation-workload-name 表示工作负载名称,由K8s的Label规范约束,长度不能超过63个字符。 cpu-load-gen
    各容器的资源规格推荐结果保存在 status.recommendResources.containerRecommendations中,各字段含义如下表所示。
    字段名称 含义 格式 示例
    containerName 表示容器名称。 string cpu-load-gen
    target 表示资源规格推荐结果,包括CPU和Memory两个维度。 map[ResourceName]resource.Quantity cpu: 4742mmemory: 262144k
    originalTarget 表示资源规格推荐算法的中间结果,不建议直接使用。若您有特殊需求,请提交工单 - -
    说明 单个Pod推荐的CPU最小值为0.025核,内存的最小值为250 MB。
  3. 可选:通过Prometheus查看结果。
    ack-koordinator为资源规格推荐结果提供了Prometheus查询接口,您可以通过ACK体统的Prometheus监控直接查看。
    • 如果您首次使用该功能的大盘,请进行重置操作,确保已安装资源画像。关于重置的具体操作,请参见重置大盘

      通过ACK控制台Prometheus监控查看资源画像结果的具体操作如下:

      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理左侧导航栏中,选择运维管理 > Prometheus监控
      5. Prometheus监控页面,选择成本分析/资源优化 > 资源画像

        您可以在资源画像页签查看详细数据,包括容器的规格(Request)、容器实际的资源使用量(Usage)以及容器的资源规格推荐值(Recommend)。更多信息,请参见阿里云Prometheus监控

        资源画像
    • 如果您自建了Prometheus监控,请参考以下监控项来配置大盘。
      #指定工作负载中容器的CPU资源规格推荐。
      slo_manager_recommender_recommendation_workload_target{exported_namespace="$namespace", workload_name="$workload", container_name="$container", resource="cpu"}
      #指定工作负载中容器的Memory资源规格推荐。
      slo_manager_recommender_recommendation_workload_target{exported_namespace="$namespace", workload_name="$workload", container_name="$container", resource="memory"}

使用样例

  1. 使用以下YAML内容,创建cpu-load-gen.yaml文件。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cpu-load-gen
      labels:
        app: cpu-load-gen
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: cpu-load-gen-selector
      template:
        metadata:
          labels:
            app: cpu-load-gen-selector
        spec:
          containers:
          - name: cpu-load-gen
            image: registry.cn-zhangjiakou.aliyuncs.com/acs/slo-test-cpu-load-gen:v0.1
            command: ["cpu_load_gen.sh"]
            imagePullPolicy: Always
            resources:
              requests:
                cpu: 8 # 该应用的CPU请求资源为8核。
                memory: "1G"
              limits:
                cpu: 12
                memory: "2G"
  2. 执行以下命令,部署cpu-load-gen作为目标应用。
    kubectl apply -f cpu-load-gen.yaml
  3. 使用以下YAML内容,创建recommender-profile.yaml文件。
    apiVersion: autoscaling.alibabacloud.com/v1alpha1
    kind: RecommendationProfile
    metadata:
      name: profile-demo
    spec:
      controllerKind:
      - Deployment
      enabledNamespaces: #表示开启Namespace为default下所有Deployment类型工作负载的资源规格推荐。
      - default
  4. 执行以下命令,为目标应用开启资源画像。
    kubectl apply -f recommender-profile.yaml
  5. 执行以下命令,获取资源规格推荐结果。
    说明 为了确保推荐结果的准确性,建议您最少等待1天以上,以便累积充足的数据。关于Label的具体含义,请参见 Label介绍
    kubectl get recommendations -l \
      "alpha.alibabacloud.com/recommendation-workload-apiVersion=apps-v1, \
      alpha.alibabacloud.com/recommendation-workload-kind=Deployment, \
      alpha.alibabacloud.com/recommendation-workload-name=cpu-load-gen" -o yaml
    预期输出:
    apiVersion: autoscaling.alibabacloud.com/v1alpha1
    kind: Recommendation
    metadata:
      creationTimestamp: "2022-02-09T08:56:51Z"
      labels:
        alpha.alibabacloud.com/recommendation-workload-apiVersion: app-v1
        alpha.alibabacloud.com/recommendation-workload-kind: Deployment
        alpha.alibabacloud.com/recommendation-workload-name: cpu-load-gen
      name: f20ac0b3-dc7f-4f47-b3d9-bd91f906****
      namespace: recommender-demo
    spec:
      workloadRef:
        apiVersion: apps/v1
        kind: Deployment
        name: cpu-load-gen
    status:
      conditions:
      - lastTransitionTime: "2022-02-09T08:56:52Z"
        status: "True"
        type: RecommendationProvided
      recommendResources:
        containerRecommendations:
        - containerName: cpu-load-gen
          target:
            cpu: 4742m #推荐资源规格为4.742核。
            memory: 262144k
          originalTarget: #表示资源规格推荐算法的中间结果,不建议直接使用。
            #...

结果分析

对比使用样例中步骤1步骤5的资源规格,以CPU为例,可以发现该容器的Request申请过大,您可以通过调小Request来节省集群资源容量。

类别 原始资源规格 推荐资源规格
CPU 8核 4.742核

FAQ

资源画像的算法原理是什么?

资源画像算法涉及了一套多维度的数据模型,算法原理可以总结为以下几点:
  • 资源画像算法会持续不断的收集容器的资源使用数据,取CPU和内存的聚合统计值作为推荐。
  • 针对时间这一因素进行了优化,在聚合统计时,较新的数据采样点会拥有更高的权重。
  • 算法参考了容器出现OOM等运行状态信息,可以进一步提高推荐值的准确性。

资源画像对应用的类型有什么要求?

适合于在线服务类应用使用。

目前资源画像的推荐值优先考虑满足容器的资源需求,确保可以覆盖绝大部分数据样本。不过对于离线应用来说,这种批处理类型的任务更加关注整体的吞吐,可以接受一定程度的资源竞争,以提高集群资源的整体利用率,资源画像的推荐值对于离线应用来说会显得有些保守。此外,对于关键的系统组件,通常以“主备”的形式部署多个副本,处于“备份”角色的副本长期处于闲置状态,这些副本的资源用量样本也会对画像算法产生一定程度的干扰。针对以上场景,请对资源画像的推荐值按需加工后再使用,后续您可持续关注资源画像的产品动态。

是否可以直接使用画像推荐值来设置容器的Request和Limit?

需要结合业务自身特点来判断,资源画像提供的推荐值是对应用当前资源需求情况的总结,管理员应结合应用自身特性,在推荐值的基础之上加工后使用,例如考虑留有一定的容量来应对流量高峰,或是做“同城双活”的无缝切换,都需要留有一定数量的资源冗余;或者应用对资源较为敏感,无法在宿主机负载较高时平稳运行,也需要在推荐值的基础上调高规格。

自建Prometheus如何查看资源画像监控指标?

参见通过命令行使用资源画像中的步骤3,在环境中配置Grafana监控大盘。

如何清理资源画像结果和规则?

资源画像结果和规则分别保存在Recommendation和RecommendationProfile两个CRD中,执行以下命令删除所有资源画像结果和规则。

# 删除所有资源画像结果。
kubectl delete recommendation -A --all

# 删除所有资源画像规则。
kubectl delete recommendationprofile -A --all