容器服务 Request 智能推荐

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。

九、安装组件

1. 登录 容器服务控制台。

2. 在左侧选择 TKE Insight > Node Map。

注意:说明:

注意:你也可以在 TKE Insight > Workload Map 中进行安装。

3. 在 Node Map 页面中,鼠标悬浮到页面下方某一个 Node 上,单击详情。

4. 在该 Node 的详情页的右上角,打开“Request 推荐” 开关,进行调度器的参数配置。


十、使用组件

1. 登录 容器服务控制台。

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/v1kind: Deploymentmetadata: 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/v1kind: ClusterRolemetadata: name: cranedrules:- 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/v1kind: Rolemetadata: name: craned namespace: crane-systemrules: – 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

赞 (0)
上一篇 4天前
下一篇 4天前