2 分钟阅读
推荐框架是指自动分析集群的各种资源的运行情况并给出优化建议。
Crane 的推荐模块定期的检测发现集群资源配置的问题,并给出优化建议。智能推荐提供了多种 Recommender 来实现面向不同资源的优化推荐。 如果你想了解 Crane 如何做智能推荐的,或者你想要尝试实现一个自定义的 Recommender,或者修改一个已有的 Recommender 的推荐规则,这篇文章将帮助你了解智能推荐。
以下是智能推荐的典型用例:
下面是一个 RecommendationRule 示例: workload-rule.yaml。
apiVersion: analysis.crane.io/v1alpha1
kind: RecommendationRule
metadata:
name: workloads-rule
spec:
runInterval: 24h # 每24h运行一次
resourceSelectors: # 资源的信息
- kind: Deployment
apiVersion: apps/v1
- kind: StatefulSet
apiVersion: apps/v1
namespaceSelector:
any: true # 扫描所有namespace
recommenders: # 使用 Workload 的副本和资源推荐器
- name: Replicas
- name: Resource
在该示例中:
runInterval
格式为时间间隔,比如: 1h,1m,设置为空表示只运行一次。resourceSelectors
数组设置,每个 resourceSelector
通过 kind,apiVersion,name 选择 k8s 中的资源,当不指定 name 时表示在 namespaceSelector
基础上的所有资源namespaceSelector
定义了待分析资源的 namespace,any: true
表示选择所有 namespacerecommenders
定义了待分析的资源需要通过哪些 Recommender 进行分析。目前支持的类型:recommendersrecommenders
需要可以匹配,比如 Resource 推荐默认只支持 Deployments 和 StatefulSets,每种 Recommender 支持哪些资源类型请参考 recommender 的文档kubectl apply -f workload-rules.yaml
这个例子会对所有 namespace 中的 Deployments 和 StatefulSets 做资源推荐和副本数推荐。
kubectl get recommend workloads-rule-replicas-7djlk -o yaml
apiVersion: analysis.crane.io/v1alpha1
kind: Recommendation
metadata:
annotations:
analysis.crane.io/last-start-time: "2023-07-24 11:43:58"
analysis.crane.io/message: 'Failed to run recommendation flow in recommender Replicas:
Replicas CalculatePodTemplateRequests cpu failed: missing request for cpu'
analysis.crane.io/run-number: "59"
creationTimestamp: "2023-06-01T11:37:16Z"
Recommendation
可通过以下 label 筛选 Recommendation
,比如 kubectl get recommend -l analysis.crane.io/recommendation-rule-name=workloads-rule
通常, Recommendation
的 namespace 等于推荐资源的 namespace。闲置节点推荐的 Recommendation
除外,它们在 Crane 的 root namespace 中,默认是 crane-system。
对于资源推荐和副本数推荐建议,用户可以 PATCH status.recommendedInfo 到 workload 更新资源配置,例如:
patchData=`kubectl get recommend workloads-rule-replicas-rckvb -n default -o jsonpath='{.status.recommendedInfo}'`;kubectl patch Deployment php-apache -n default --patch "${patchData}"
对于闲置节点推荐,由于节点的下线在不同平台上的步骤不同,用户可以根据自身需求进行节点的下线或者缩容。
目前 Crane 支持了以下 Recommender:
Recommender 框架定义了一套工作流程,Recommender 按流程顺序执行,流程分为四个阶段:Filter,Prepare,Recommend,Observe,Recommender 通过实现这四个阶段完成推荐功能。
开发或者扩展 Recommender 请参考:如何开发 Recommender
RecommendationConfiguration 定义了 recommender 的配置。部署时会在 crane root namespace创建一个 ConfigMap:recommendation-configuration,数据包括了一个 yaml 格式的 RecommendationConfiguration.
下面是一个 RecommendationConfiguration 示例。
apiVersion: v1
kind: ConfigMap
metadata:
name: recommendation-configuration
namespace: crane-system
data:
config.yaml: |-
apiVersion: analysis.crane.io/v1alpha1
kind: RecommendationConfiguration
recommenders:
- name: Replicas
acceptedResources: # 接受的资源类型
- kind: Deployment
apiVersion: apps/v1
- kind: StatefulSet
apiVersion: apps/v1
config: # 设置 recommender 的参数
workload-min-replicas: "1"
- name: Resource
acceptedResources: # 接受的资源类型
- kind: Deployment
apiVersion: apps/v1
- kind: StatefulSet
apiVersion: apps/v1
用户可以修改 ConfigMap 内容并重新发布 Crane,触发新的配置生效。
应用在监控系统(比如 Prometheus)中的历史数据越久,推荐结果就越准确,建议生产上超过两周时间。对新建应用的预测往往不准。