Skip to content

Commit

Permalink
Merge pull request #819 from qmhu/new-plugin-docs
Browse files Browse the repository at this point in the history
docs: Update docs for new plugins
  • Loading branch information
qmhu committed Jun 14, 2023
2 parents ed391fd + 39fde76 commit 8ee602d
Show file tree
Hide file tree
Showing 21 changed files with 489 additions and 61 deletions.
2 changes: 1 addition & 1 deletion deploy/craned/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ data:
acceptedResources:
- kind: Node
apiVersion: v1
- name: Volumes
- name: Volume
acceptedResources:
- kind: PersistentVolume
apiVersion: v1
Expand Down
18 changes: 18 additions & 0 deletions examples/analytics/preinstall-rule.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,21 @@ spec:
any: true # 扫描所有namespace
recommenders:
- name: Service

---

apiVersion: analysis.crane.io/v1alpha1
kind: RecommendationRule
metadata:
name: persistentvolumes-rule
labels:
analysis.crane.io/recommendation-rule-preinstall: "true"
spec:
runInterval: 24h # 每24h运行一次
resourceSelectors: # 资源的信息
- kind: PersistentVolume
apiVersion: v1
namespaceSelector:
any: true # 扫描所有namespace
recommenders:
- name: Volume
2 changes: 1 addition & 1 deletion examples/analytics/recommendation-configuration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ recommenders:
apiVersion: apps/v1
- kind: StatefulSet
apiVersion: apps/v1
- name: Volumes
- name: Volume
acceptedResources:
- kind: PersistentVolume
apiVersion: v1
Expand Down
1 change: 1 addition & 0 deletions pkg/recommendation/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
_ "github.com/gocrane/crane/pkg/recommendation/recommender/replicas"
_ "github.com/gocrane/crane/pkg/recommendation/recommender/resource"
_ "github.com/gocrane/crane/pkg/recommendation/recommender/service"
_ "github.com/gocrane/crane/pkg/recommendation/recommender/volume"
)

type RecommenderManager interface {
Expand Down
4 changes: 2 additions & 2 deletions pkg/recommendation/recommender/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ const (
// IdleNodeRecommender name
IdleNodeRecommender string = "IdleNode"

// VolumesRecommender name
VolumesRecommender string = "Volumes"
// VolumeRecommender name
VolumeRecommender string = "Volume"

// ServiceRecommender name
ServiceRecommender string = "Service"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package volumes
package volume

import (
corev1 "k8s.io/api/core/v1"
Expand All @@ -8,7 +8,7 @@ import (
)

// Filter out k8s resources that are not supported by the recommender.
func (vr *VolumesRecommender) Filter(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) Filter(ctx *framework.RecommendationContext) error {
var err error

// filter resource that not match objectIdentity
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package volumes
package volume

import (
"github.com/gocrane/crane/pkg/recommendation/framework"
)

// Observe enhance the observability.
func (vr *VolumesRecommender) Observe(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) Observe(ctx *framework.RecommendationContext) error {
return nil
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
package volumes
package volume

import (
"github.com/gocrane/crane/pkg/recommendation/framework"
)

// CheckDataProviders in PrePrepare phase, will create data source provider via your recommendation config.
func (vr *VolumesRecommender) CheckDataProviders(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) CheckDataProviders(ctx *framework.RecommendationContext) error {
if err := vr.BaseRecommender.CheckDataProviders(ctx); err != nil {
return err
}

return nil
}

func (vr *VolumesRecommender) CollectData(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) CollectData(ctx *framework.RecommendationContext) error {
return nil
}

func (vr *VolumesRecommender) PostProcessing(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) PostProcessing(ctx *framework.RecommendationContext) error {
return nil
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package volumes
package volume

import (
"fmt"
Expand All @@ -8,11 +8,11 @@ import (
"github.com/gocrane/crane/pkg/recommendation/framework"
)

func (vr *VolumesRecommender) PreRecommend(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) PreRecommend(ctx *framework.RecommendationContext) error {
return nil
}

func (vr *VolumesRecommender) Recommend(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) Recommend(ctx *framework.RecommendationContext) error {
// Check if each volume is being used by any pods
isOrphanVolume := true
var pv corev1.PersistentVolume
Expand All @@ -38,6 +38,6 @@ func (vr *VolumesRecommender) Recommend(ctx *framework.RecommendationContext) er
}

// Policy add some logic for result of recommend phase.
func (vr *VolumesRecommender) Policy(ctx *framework.RecommendationContext) error {
func (vr *VolumeRecommender) Policy(ctx *framework.RecommendationContext) error {
return nil
}
32 changes: 32 additions & 0 deletions pkg/recommendation/recommender/volume/registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package volume

import (
analysisv1alph1 "github.com/gocrane/api/analysis/v1alpha1"

"github.com/gocrane/crane/pkg/recommendation/config"
"github.com/gocrane/crane/pkg/recommendation/recommender"
"github.com/gocrane/crane/pkg/recommendation/recommender/apis"
"github.com/gocrane/crane/pkg/recommendation/recommender/base"
)

var _ recommender.Recommender = &VolumeRecommender{}

type VolumeRecommender struct {
base.BaseRecommender
}

func init() {
recommender.RegisterRecommenderProvider(recommender.VolumeRecommender, NewVolumeRecommender)
}

func (vr *VolumeRecommender) Name() string {
return recommender.VolumeRecommender
}

// NewVolumeRecommender create a new Volumes recommender.
func NewVolumeRecommender(recommender apis.Recommender, recommendationRule analysisv1alph1.RecommendationRule) (recommender.Recommender, error) {
recommender = config.MergeRecommenderConfigFromRule(recommender, recommendationRule)
return &VolumeRecommender{
*base.NewBaseRecommender(recommender),
}, nil
}
31 changes: 0 additions & 31 deletions pkg/recommendation/recommender/volumes/registry.go

This file was deleted.

25 changes: 25 additions & 0 deletions pkg/server/handler/clusters/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,25 @@ spec:
- name: Service
`

const RecommendationRulePVsName = "persistentvolumes-rule"
const RecommendationRulePVsYAML = `
apiVersion: analysis.crane.io/v1alpha1
kind: RecommendationRule
metadata:
name: persistentvolumes-rule
labels:
analysis.crane.io/recommendation-rule-preinstall: "true"
spec:
runInterval: 24h # 每24h运行一次
resourceSelectors: # 资源的信息
- kind: PersistentVolume
apiVersion: v1
namespaceSelector:
any: true # 扫描所有namespace
recommenders:
- name: Volume
`

type AddClustersRequest struct {
Clusters []*store.Cluster `json:"clusters"`
}
Expand Down Expand Up @@ -195,6 +214,12 @@ func (ch *ClusterHandler) AddClusters(c *gin.Context) {
ginwrapper.WriteResponse(c, err, nil)
return
}

err = ch.upsertRecommendationRule(RecommendationRulePVsName, RecommendationRulePVsYAML)
if err != nil {
ginwrapper.WriteResponse(c, err, nil)
return
}
} else if err != nil {
ginwrapper.WriteResponse(c, err, nil)
return
Expand Down
Binary file added site/.DS_Store
Binary file not shown.
73 changes: 73 additions & 0 deletions site/content/en/docs/Tutorials/Recommendation/pv-recommendation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
title: "PV Recommendation"
description: "Introduce for PV Recommendation"
weight: 17
---

PV 推荐通过扫描集群中 PV 的运行状况,帮助用户找到闲置的 Kubernetes PV。

## 动机

通常在 Kubernetes 中我们会使用 PV + Workload 来自动创建和管理存储卷并将存储卷挂载到应用上,在日常的运营中难免会出现空闲或者空跑的存储卷,浪费了大量成本, PV 推荐尝试帮助用户找到这部分 PV 来实现成本优化。

## 推荐示例

```yaml
apiVersion: analysis.crane.io/v1alpha1
kind: Recommendation
metadata:
annotations:
analysis.crane.io/last-start-time: "2023-06-14 08:55:25"
analysis.crane.io/message: Success
analysis.crane.io/run-number: "653"
labels:
analysis.crane.io/recommendation-rule-name: persistentvolumes-rule
analysis.crane.io/recommendation-rule-recommender: Volume
analysis.crane.io/recommendation-rule-uid: 39d30abe-4c7f-4e65-b961-b00ec7776b45
analysis.crane.io/recommendation-target-kind: PersistentVolume
analysis.crane.io/recommendation-target-name: pvc-6ce24277-24e9-4fcf-8e8a-f9bdb5694134
analysis.crane.io/recommendation-target-namespace: ""
analysis.crane.io/recommendation-target-version: v1
name: persistentvolumes-rule-volume-5r9zn
namespace: crane-system
ownerReferences:
- apiVersion: analysis.crane.io/v1alpha1
blockOwnerDeletion: false
controller: false
kind: RecommendationRule
name: persistentvolumes-rule
uid: 39d30abe-4c7f-4e65-b961-b00ec7776b45
spec:
adoptionType: StatusAndAnnotation
completionStrategy:
completionStrategyType: Once
targetRef:
apiVersion: v1
kind: PersistentVolume
name: pvc-6ce24277-24e9-4fcf-8e8a-f9bdb5694134
type: Volume
status:
action: Delete
description: It is an Orphan Volumes
lastUpdateTime: "2023-06-14T08:55:25Z"
```

在该示例中:

- 推荐的 TargetRef 指向了 PV: pvc-6ce24277-24e9-4fcf-8e8a-f9bdb5694134
- 推荐类型为 PV 推荐
- action 是 Delete,这里只是给出建议

## 实现原理

PV 推荐按以下步骤完成一次推荐过程:

1. 扫描集群中所有 PV,找到 PV 对应的 Pod 列表
2. 如果 PV 没有对应的 PVC,则判断为闲置 PV
3. 如果没有 Pod 关联这个 PV 和 PVC,则判断为闲置 PVC

## 参数配置

目前 PV 推荐没有参数配置。

如何更新推荐的配置请参考:[**推荐框架**](/zh-cn/docs/tutorials/recommendation/recommendation-framework)
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ Currently, Crane support these Recommenders:
- [**Replicas Recommendation**](/docs/tutorials/recommendation/replicas-recommendation): Use the HPA algorithm to analyze the actual usage of applications and recommend more appropriate replicas configurations.
- [**HPA Recommendation**](/docs/tutorials/recommendation/hpa-recommendation): Scan the Workload in a cluster and recommend HPA configurations for Workload that are suitable for horizontal autoscaling
- [**IdleNode Recommendation**](/docs/tutorials/recommendation/idlenode-recommendation): Find the idle nodes in cluster
- [**Service Recommendation**](/zh-cn/docs/tutorials/recommendation/service-recommendation): Find the idle load balancer service in cluster
- [**PV Recommendation**](/zh-cn/docs/tutorials/recommendation/pv-recommendation): Find the idle persist volume in cluster

### Recommender Framework

Expand Down
Loading

0 comments on commit 8ee602d

Please sign in to comment.