简介
组件介绍
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+
节点要求
被控资源要求
支持 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 推荐” 开关,进行调度器的参数配置。
注意:
该功能是集群级别的全局开关,开启后,会自动分析工作负载历史的监控数据,推荐合适的 Request 数值。
开启后非立即生效,为准确计算推荐值,需要分析该 Workload 的历史资源使用数据。
不同的 Workload 的计算时间长度可能不一致,集群中不同的 Workload 之间互相可能会有影响。
开启该功能后,对至少运行一天的 Workload 产生推荐数据。
对于开启功能后新建的 Workload,一般情况下,也需要一天的时间才会产生 Workload 的推荐数据。
建议工作负载稳定运行一段时间之后,再使用推荐值更新 Workload。
使用组件
1. 登录 容器服务控制台。
2. 在左侧选择 TKE Insight > Workload Map。
说明:
Workload Map 主要通过可视化的页面展示工作负载的各项状态和指标,帮助用户了解当前工作负载的配置量和实际使用情况,辅助用户分析工作负载可能存在的问题。更多可参考文档 Workload Map。
3. 在 Workload Map 页面,鼠标悬浮到页面下方某一个 Workload 上,单击推荐。
4. 在弹窗中,单击确认,即可使用推荐的 Request 数值更新原始 Workload 里面的数值。
说明:
后台获取推荐数值
Request 智能推荐组件会将每个工作负载的推荐值保存在该工作负载的 YAML 里,您可以通过标准的 Kubernetes API 获取每个工作负载的推荐值,然后集成到业务的发布系统中。如下所示查看工作负载下每个容器的 Request 推荐量:
apiVersion: apps/v1kind: Deploymentmetadata:annotations:analysis.crane.io/resource-recommendation: |containers:# 若一个 Pod 里有多个容器,每个容器都有 CPU 和 Memory 的 Request 的推荐值- containerName: nginxtarget:cpu: 125mmemory: 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- nodesverbs:- get- list- watch- apiGroups:- analysis.crane.ioresources:- "*"verbs:- "*"- apiGroups:- appsresources:- daemonsets- deployments- deployments/scale- statefulsets- statefulsets/scaleverbs:- get- list- watch- apiGroups:- appsresources:- daemonsets/status- deployments/status- deployments/scale- statefulsets/status- statefulsets/scaleverbs:- update- apiGroups:- autoscalingresources:- horizontalpodautoscalersverbs:- '*'- apiGroups:- autoscaling.crane.ioresources:- '*'verbs:- '*'- apiGroups:- ""resources:- eventsverbs:- create- patch- update- apiGroups:- prediction.crane.ioresources:- '*'verbs:- '*'---apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: cranednamespace: crane-systemrules:- apiGroups:- ""resources:- configmaps- secretsverbs:- create- apiGroups:- ""resourceNames:- cranedresources:- configmapsverbs:- get- patch- update- apiGroups:- ""resourceNames:- clusters-secret-storeresources:- secretsverbs:- get- apiGroups:- coordination.k8s.ioresources:- leasesverbs:- get- patch- update- create