Request 智能推荐

最近更新时间:2024-11-05 14:34:52

我的收藏

简介

组件介绍

Kubernetes 可以显著提升业务编排能力和资源利用率,但如果没有额外的支持,其提升效果会非常有限。根据 TKE 团队之前的统计数据(参见 Kubernetes 降本增效标准指南 | 容器化计算资源利用率现象剖析),TKE 节点的资源平均利用率仅为 14%左右,如下图所示:


Kubernetes 集群的资源利用率不高的主要原因是根据 Kubernetes 的资源调度逻辑,在创建 Kubernetes 工作负载时,通常需要为工作负载配置合适的资源 Request 和 Limit,表示对资源的占用和限制,其中对利用率影响最大的是 Request。为了防止自己的工作负载资源被其他工作负载占用,或者为了应对高峰流量时的资源消耗需求,用户习惯于为 Request 设置较大的数值。Request 和实际使用资源之间的差值是不能被其他工作负载使用的,因此造成了资源浪费。Request 数值设置不合理,导致了 Kubernetes 集群资源利用率低下。
容器服务 TKE 支持在集群中安装 Request 智能推荐组件。该组件可以为 Kubernetes 的 Workload 推荐容器级别的 Request/Limit 数值,从而减少资源浪费。该功能仅适用于标准集群,会对标准集群下所有的 Workload 定时更新推荐的 Request 配置。用户可以按需配置一键更新,但更新后 Pod 会重新调度到原生节点上。

部署在集群内的资源对象

开启集群的 Request 智能推荐 , 将在集群内部署以下 Kubernetes 对象:
Kubernetes 对象名称
类型
默认占用资源
所属 Namespaces
analytics.analysis.crane.io
CustomResourceDefinition
-
-
recommendations.analysis.crane.io
CustomResourceDefinition
-
-
crane-system
Namespace
-
-
housekeeper-default
Analytics
-
crane-system
recommendation-config
ConfigMap
-
crane-system
craned
ClusterRole
-
-
craned
ClusterRoleBinding
-
-
craned
Service
-
crane-system
craned
ServiceAccount
-
crane-system
craned
Deployment
-
crane-system

功能说明

支持为 Deployment、StatefulSet、DaemonSet 中的每一个 Container 智能推荐合适的资源 Request/Limit。
支持一键更新:使用推荐值一键更新 Workload 中 Container 的资源值。
支持维持 Request/Limit 比例:推荐的 Request/Limit 会维持初始 Workload 中 Container 设置的 Reqeust/Limit 之间的比例,若 Limit 在创建 Workload 时没有设置,则不会推荐 Limit。
控制台的 Request 推荐一键更新能力会默认给工作负载加上 nodeSelector 的属性,Workload 在更新时, Pod 将只能调度到原生节点上,若原生节点资源不足,会引发 Pod 的 Pending。

Request 推荐原理

组件在 crane-system 命名空间下创建 Analytics CR 对象,默认覆盖集群中的 Kubernetes 原生工作负载(Deployment、StatefulSet),会分析工作负载最长 14 天的监控数据,12 小时更新一次推荐值。
然后根据 Analytics 生成集群内每个工作负载的 Recommendation CR 对象,用于存储推荐的数据。
Recommendation CR 如果产生了推荐数据,就会把推荐数据写入到对应工作负载的 Annotation 里。




注意事项

环境要求

Kubernetes 版本:1.10+

节点要求

容器服务控制台中一键更新 Workload Request 功能会将工作负载迁移至 原生节点,若您的集群原生节点上资源不足,会导致 Pod 发生 Pending。

被控资源要求

支持 Deployment、StatefulSet。
不支持 Job、CronJob,不支持不是由 Workload 管理的 Pod。

推荐阈值

推荐最小值:单个容器推荐的 CPU 最小值是0.125核,即125m;内存的最小值是125Mi。

使用说明

安装组件

2. 在左侧选择 TKE Insight > Node Map
说明:
您也可以在 TKE Insight > Workload Map 中进行安装。
3. 在 Node Map 页面中,鼠标悬浮到页面下方某一个 Node 上,单击详情
4. 在该 Node 的详情页的右上角,打开“Request 推荐” 开关,进行调度器的参数配置。


注意:
该功能是集群级别的全局开关,开启后,会自动分析工作负载历史的监控数据,推荐合适的 Request 数值。
开启后非立即生效,为准确计算推荐值,需要分析该 Workload 的历史资源使用数据。
不同的 Workload 的计算时间长度可能不一致,集群中不同的 Workload 之间互相可能会有影响。
开启该功能后,对至少运行一天的 Workload 产生推荐数据。
对于开启功能后新建的 Workload,一般情况下,也需要一天的时间才会产生 Workload 的推荐数据。
建议工作负载稳定运行一段时间之后,再使用推荐值更新 Workload。

使用组件

2. 在左侧选择 TKE Insight > Workload Map
说明:
Workload Map 主要通过可视化的页面展示工作负载的各项状态和指标,帮助用户了解当前工作负载的配置量和实际使用情况,辅助用户分析工作负载可能存在的问题。更多可参考文档 Workload Map
3. 在 Workload Map 页面,鼠标悬浮到页面下方某一个 Workload 上,单击推荐


4. 在弹窗中,单击确认,即可使用推荐的 Request 数值更新原始 Workload 里面的数值。
说明:
容器服务控制台中一键更新 Workload Request 功能会将工作负载迁移至 原生节点,若您的集群原生节点上资源不足,会导致 Pod 发生 Pending。

后台获取推荐数值

Request 智能推荐组件会将每个工作负载的推荐值保存在该工作负载的 YAML 里,您可以通过标准的 Kubernetes API 获取每个工作负载的推荐值,然后集成到业务的发布系统中。如下所示查看工作负载下每个容器的 Request 推荐量:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
analysis.crane.io/resource-recommendation: |
containers:
# 若一个 Pod 里有多个容器,每个容器都有 CPU 和 Memory 的 Request 的推荐值
- containerName: nginx
target:
cpu: 125m
memory: 125Mi #若这里缺少单位,显示的是字符串"58243235",省略的单位是byte
注意:
组件本身不会推荐 Limit,在控制台使用 Request 推荐值更新 Workload 时,会维持该 Workload Request 和 Limit 的比值以保证 QoS 不会发生变化。您如果在后台获取到 Request 推荐值,可以作为参考更新原始 Workload 的资源配置量。

组件权限说明

权限说明

该组件权限是当前功能实现的最小权限依赖。

权限场景

功能
涉及对象
涉及操作权限
记录 pod 的 oom 记录
pod
get/list/watch
根据 node 查找空闲节点并进行推荐
node
get/list/watch
需要更新 workload 的 annotations 记录推荐相关的信息
workload
get/list/watch
需要将异常信息以事件进行记录
event
create/patch/update
监听推荐相关资源的变更,进行资源推荐
analysis.crane.io
所有权限

权限定义

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: craned
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- nodes
verbs:
- get
- list
- watch
- apiGroups:
- analysis.crane.io
resources:
- "*"
verbs:
- "*"
- apiGroups:
- apps
resources:
- daemonsets
- deployments
- deployments/scale
- statefulsets
- statefulsets/scale
verbs:
- get
- list
- watch
- apiGroups:
- apps
resources:
- daemonsets/status
- deployments/status
- deployments/scale
- statefulsets/status
- statefulsets/scale
verbs:
- update
- apiGroups:
- autoscaling
resources:
- horizontalpodautoscalers
verbs:
- '*'
- apiGroups:
- autoscaling.crane.io
resources:
- '*'
verbs:
- '*'
- apiGroups:
- ""
resources:
- events
verbs:
- create
- patch
- update
- apiGroups:
- prediction.crane.io
resources:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: craned
namespace: crane-system
rules:
- apiGroups:
- ""
resources:
- configmaps
- secrets
verbs:
- create
- apiGroups:
- ""
resourceNames:
- craned
resources:
- configmaps
verbs:
- get
- patch
- update
- apiGroups:
- ""
resourceNames:
- clusters-secret-store
resources:
- secrets
verbs:
- get
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- get
- patch
- update
- create