如何开发 Recommender

介绍 Recommender 框架以及如何进行开发和扩展

Recommendation Framework 提供了一套可扩展的 Recommender 框架并支持了内置的 Recommender,用户可以实现一个自定义的 Recommender,或者修改一个已有的 Recommender。

Recommender Interface

  1. type Recommender interface {
  2. Name() string
  3. framework.Filter
  4. framework.PrePrepare
  5. framework.Prepare
  6. framework.PostPrepare
  7. framework.PreRecommend
  8. framework.Recommend
  9. framework.PostRecommend
  10. framework.Observe
  11. }
  12. // Phase: Filter
  13. // Filter interface
  14. type Filter interface {
  15. // The Filter will filter resource can`t be recommended via target recommender.
  16. Filter(ctx *RecommendationContext) error
  17. }
  18. // Phase: Prepare
  19. // PrePrepare interface
  20. type PrePrepare interface {
  21. CheckDataProviders(ctx *RecommendationContext) error
  22. }
  23. // Prepare interface
  24. type Prepare interface {
  25. CollectData(ctx *RecommendationContext) error
  26. }
  27. type PostPrepare interface {
  28. PostProcessing(ctx *RecommendationContext) error
  29. }
  30. // PreRecommend interface
  31. type PreRecommend interface {
  32. PreRecommend(ctx *RecommendationContext) error
  33. }
  34. // Phase: Recommend
  35. // Recommend interface
  36. type Recommend interface {
  37. Recommend(ctx *RecommendationContext) error
  38. }
  39. // PostRecommend interface
  40. type PostRecommend interface {
  41. Policy(ctx *RecommendationContext) error
  42. }
  43. // Phase: Observe
  44. // Observe interface
  45. type Observe interface {
  46. Observe(ctx *RecommendationContext) error
  47. }

Recommender 接口定义了一次推荐需要实现的四个阶段和八个扩展点。这些扩展点会在推荐过程中按顺序被调用。这些扩展点中的的一些可以改变推荐决策,而另一些仅用来提供信息。

架构

如何开发 Recommender - 图1

阶段

整个推荐过程分成了四个阶段:Filter,Prepare,Recommend,Observe。阶段的输入是需要分析的 Kubernetes 资源,输出是推荐的优化建议。 下面开始介绍每个阶段的输入、输出和能力。

RecommendationContext 保存了一次推荐过程中的上下文,包括推荐目标,RecommendationConfiguration 等,用户可以按需增加更多的内容。

Filter

Filter 阶段用于预处理推荐数据。通常,在预处理时需判断推荐目标是否和 Recommender 匹配,比如,Resource Recommender 只支持处理 Workload(Deployment,StatefulSet)。除此之外,还可以判断推荐目标状态是否适合推荐,比如是否删除中,是否刚创建等。当返回 error 会终止此次推荐。BaseRecommender 实现了基本的预处理功能,用户可以调用它继承相关功能。

Prepare

Prepare 阶段用于数据准备,请求外部监控系统并将时序数据保存在上下文中。PrePrepare 扩展点用于检测监控系统的链接情况。Prepare 扩展点用于查询时序数据。PostPrepare 扩展点用于对时序数据的数据处理,比如:应用冷启动的异常数据,部分数据的缺失,数据聚合,异常数据清理等。

Recommend

Recommend 阶段用于基于时序数据和资源配置进行优化建议。优化建议的类型取决于推荐的类型。比如,如果是资源推荐,那么输出就是 kubernetes workload 的资源配置。Recommend 扩展点用于采用 Crane 的算法模块对数据进行分析计算,PostRecommend 阶段对分析结果进行最后处理。用户可以自定义 Recommend 阶段实现自定义的推荐结果。

Observe

Observe 阶段用于推荐结果的可观测。比如,在资源推荐时,将优化建议的信息通过 Metric 保存到监控系统,再通过 Dashboard 观测优化建议带来的收益。