Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: Update docs for new plugins #819

Merged
merged 3 commits into from
Jun 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading