Skip to content

Commit

Permalink
support autoscaler api
Browse files Browse the repository at this point in the history
  • Loading branch information
John-Lin committed Oct 1, 2018
1 parent 9ecd044 commit d45d703
Show file tree
Hide file tree
Showing 10 changed files with 674 additions and 17 deletions.
53 changes: 52 additions & 1 deletion API.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,6 @@
- [Monitor Controllers](#monitor-controllers)
- [Monitor Certain Controller](#monitor-certain-controller)


## User

### Signup
Expand Down Expand Up @@ -1078,6 +1077,58 @@ Response Data:
}
```

### Update Autoscaler

`ResourceName` in json can only be "cpu" or "memory".
`ScaleTargetRefName` is the target kubernetes deployment name

Enable autoscaler

**PUT /v1/deployments/autoscale?enable=true**

Example:

```
curl -X PUT http://localhost:7890/v1/deployments/autoscale?enable=true
```

Request Data:

```json
{
"Namespace": "default",
"ScaleTargetRefName": "testDeploymentName",
"ResourceName": "cpu",
"MinReplicas": 1,
"MaxReplicas": 5,
"TargetAverageUtilization": 30
}
```

Disable autoscaler

**PUT /v1/deployments/autoscale?enable=false**

Example:

```
curl -X PUT http://localhost:7890/v1/deployments/autoscale?enable=false
```

Request Data:

```json
{
"Namespace": "default",
"ScaleTargetRefName": "testDeploymentName",
"ResourceName": "cpu",
"MinReplicas": 0,
"MaxReplicas": 0,
"TargetAverageUtilization": 0
}
```


## Service

### Create Service
Expand Down
38 changes: 37 additions & 1 deletion src/deployment/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import (
"github.com/linkernetworks/vortex/src/entity"
"github.com/linkernetworks/vortex/src/serviceprovider"
"github.com/linkernetworks/vortex/src/utils"
appsv1 "k8s.io/api/apps/v1"

appsv1 "k8s.io/api/apps/v1"
v2beta1 "k8s.io/api/autoscaling/v2beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

Expand Down Expand Up @@ -410,3 +411,38 @@ func CreateDeployment(sp *serviceprovider.Container, deploy *entity.Deployment)
func DeleteDeployment(sp *serviceprovider.Container, deploy *entity.Deployment) error {
return sp.KubeCtl.DeleteDeployment(deploy.Name, deploy.Namespace)
}

// CreateAutoscaler will create a autoscaler
func CreateAutoscaler(sp *serviceprovider.Container, autoscalerInfo entity.AutoscalerInfo) error {
autoscaler := v2beta1.HorizontalPodAutoscaler{
ObjectMeta: metav1.ObjectMeta{
// use deployment name to name autoscaler's name
Name: autoscalerInfo.ScaleTargetRefName,
Namespace: autoscalerInfo.Namespace,
},
Spec: v2beta1.HorizontalPodAutoscalerSpec{
ScaleTargetRef: v2beta1.CrossVersionObjectReference{
Kind: "Deployment",
Name: autoscalerInfo.ScaleTargetRefName,
},
MinReplicas: &autoscalerInfo.MinReplicas,
MaxReplicas: autoscalerInfo.MaxReplicas,
Metrics: []v2beta1.MetricSpec{
{
Type: v2beta1.ResourceMetricSourceType,
Resource: &v2beta1.ResourceMetricSource{
Name: autoscalerInfo.ResourceName,
TargetAverageUtilization: &autoscalerInfo.TargetAverageUtilization,
},
},
},
},
}
_, err := sp.KubeCtl.CreateAutoscaler(&autoscaler, autoscalerInfo.Namespace)
return err
}

// DeleteAutoscaler will delete a autoscaler
func DeleteAutoscaler(sp *serviceprovider.Container, autoscalerInfo entity.AutoscalerInfo) error {
return sp.KubeCtl.DeleteAutoscaler(autoscalerInfo.ScaleTargetRefName, autoscalerInfo.Namespace)
}
47 changes: 47 additions & 0 deletions src/deployment/deployment_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ import (
"github.com/linkernetworks/vortex/src/serviceprovider"
"github.com/moby/moby/pkg/namesgenerator"
"github.com/stretchr/testify/suite"

corev1 "k8s.io/api/core/v1"

"gopkg.in/mgo.v2/bson"
)

Expand Down Expand Up @@ -475,3 +478,47 @@ func (suite *DeploymentTestSuite) TestCreateDeploymentWithNetworkTypes() {
})
}
}

func (suite *DeploymentTestSuite) TestCreateDeploymentWithAutoscaler() {
containers := []entity.Container{
{
Name: namesgenerator.GetRandomName(0),
Image: "busybox",
Command: []string{"sleep", "3600"},
},
}

testDeploymentName := namesgenerator.GetRandomName(0)
deploy := &entity.Deployment{
ID: bson.NewObjectId(),
Namespace: "default",
Name: testDeploymentName,
Containers: containers,
NetworkType: entity.DeploymentClusterNetwork,
EnvVars: map[string]string{
"MY_IP": "1.2.3.4",
},
}

autoscaler := entity.AutoscalerInfo{
Name: "test-autoscaler",
Namespace: "default",
ScaleTargetRefName: testDeploymentName,
ResourceName: corev1.ResourceCPU,
MinReplicas: 1,
MaxReplicas: 5,
TargetAverageUtilization: 30,
}

err := CreateDeployment(suite.sp, deploy)
suite.NoError(err)

err = CreateAutoscaler(suite.sp, autoscaler)
suite.NoError(err)

err = DeleteAutoscaler(suite.sp, autoscaler)
suite.NoError(err)

err = DeleteDeployment(suite.sp, deploy)
suite.NoError(err)
}
45 changes: 30 additions & 15 deletions src/entity/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"time"

"gopkg.in/mgo.v2/bson"
corev1 "k8s.io/api/core/v1"
)

const (
Expand Down Expand Up @@ -58,25 +59,39 @@ type DeploymentConfig struct {

// Deployment is the structure for deployment info
type Deployment struct {
ID bson.ObjectId `bson:"_id,omitempty" json:"id" validate:"-"`
OwnerID bson.ObjectId `bson:"ownerID,omitempty" json:"ownerID" validate:"-"`
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Namespace string `bson:"namespace" json:"namespace" validate:"required"`
Labels map[string]string `bson:"labels,omitempty" json:"labels" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
EnvVars map[string]string `bson:"envVars,omitempty" json:"envVars" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
Containers []Container `bson:"containers" json:"containers" validate:"required,dive,required"`
Volumes []DeploymentVolume `bson:"volumes,omitempty" json:"volumes" validate:"required,dive,required"`
ConfigMaps []DeploymentConfig `bson:"configMaps,omitempty" json:"configMaps" validate:"required,dive,required"`
Networks []DeploymentNetwork `bson:"networks,omitempty" json:"networks" validate:"required,dive,required"`
Capability bool `bson:"capability" json:"capability" validate:"-"`
NetworkType string `bson:"networkType" json:"networkType" validate:"required,eq=host|eq=cluster|eq=custom"`
NodeAffinity []string `bson:"nodeAffinity" json:"nodeAffinity" validate:"required"`
CreatedBy User `json:"createdBy" validate:"-"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty" validate:"-"`
ID bson.ObjectId `bson:"_id,omitempty" json:"id" validate:"-"`
OwnerID bson.ObjectId `bson:"ownerID,omitempty" json:"ownerID" validate:"-"`
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Namespace string `bson:"namespace" json:"namespace" validate:"required"`
Labels map[string]string `bson:"labels,omitempty" json:"labels" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
EnvVars map[string]string `bson:"envVars,omitempty" json:"envVars" validate:"required,dive,keys,printascii,endkeys,required,printascii"`
Containers []Container `bson:"containers" json:"containers" validate:"required,dive,required"`
Volumes []DeploymentVolume `bson:"volumes,omitempty" json:"volumes" validate:"required,dive,required"`
ConfigMaps []DeploymentConfig `bson:"configMaps,omitempty" json:"configMaps" validate:"required,dive,required"`
Networks []DeploymentNetwork `bson:"networks,omitempty" json:"networks" validate:"required,dive,required"`
Capability bool `bson:"capability" json:"capability" validate:"-"`
NetworkType string `bson:"networkType" json:"networkType" validate:"required,eq=host|eq=cluster|eq=custom"`
NodeAffinity []string `bson:"nodeAffinity" json:"nodeAffinity" validate:"required"`
IsAutoscaler bool `bson:"isAutoscaler" json:"isAutoscaler" validate:"-"`
AutoscalerInfo AutoscalerInfo `bson:"autoscalerInfo" json:"autoscalerInfo" validate:"-"`
CreatedBy User `json:"createdBy" validate:"-"`
CreatedAt *time.Time `bson:"createdAt,omitempty" json:"createdAt,omitempty" validate:"-"`

Replicas int32 `bson:"replicas" json:"replicas" validate:"required"`
}

// AutoscalerInfo is the structure for deploying a autoscaler with a deployment
type AutoscalerInfo struct {
Name string `bson:"name" json:"name" validate:"required,k8sname"`
Namespace string `bson:"namespace" json:"namespace" validate:"required"`
// ScaleTargetRef is deployment name
ScaleTargetRefName string `bson:"scaleTargetRefName" json:"scaleTargetRefName" validate:"required,k8sname"`
ResourceName corev1.ResourceName `bson:"resourceName" json:"resourceName" validate:"required,eq=cpu|eq=memory"`
MinReplicas int32 `bson:"minReplicas" json:"minReplicas" validate:"required,numeric"`
MaxReplicas int32 `bson:"maxReplicas" json:"maxReplicas" validate:"required,numeric"`
TargetAverageUtilization int32 `bson:"targetAverageUtilization" json:"targetAverageUtilization" validate:"required,numeric"`
}

// GetCollection - get model mongo collection name.
func (m Deployment) GetCollection() string {
return DeploymentCollectionName
Expand Down
22 changes: 22 additions & 0 deletions src/kubernetes/autoscaler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package kubernetes

import (
v1beta2 "k8s.io/api/autoscaling/v2beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

// CreateAutoscaler will create a autoscaler
func (kc *KubeCtl) CreateAutoscaler(autoscaler *v1beta2.HorizontalPodAutoscaler, namespace string) (*v1beta2.HorizontalPodAutoscaler, error) {
return kc.Clientset.AutoscalingV2beta1().HorizontalPodAutoscalers(namespace).Create(autoscaler)
}

// GetAutoscaler will get a autoscaler
func (kc *KubeCtl) GetAutoscaler(name string, namespace string) (*v1beta2.HorizontalPodAutoscaler, error) {
return kc.Clientset.AutoscalingV2beta1().HorizontalPodAutoscalers(namespace).Get(name, metav1.GetOptions{})
}

// DeleteAutoscaler will delete a autoscaler
func (kc *KubeCtl) DeleteAutoscaler(name string, namespace string) error {
propagation := metav1.DeletePropagationForeground
return kc.Clientset.AutoscalingV2beta1().HorizontalPodAutoscalers(namespace).Delete(name, &metav1.DeleteOptions{PropagationPolicy: &propagation})
}
Loading

0 comments on commit d45d703

Please sign in to comment.