blob: 3320f1734a03c41cfbf50394cf3f639fabc03619 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package v1alpha1
import (
autoscalingv2 "k8s.io/api/autoscaling/v2"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
vpav1 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1"
)
// +kubebuilder:object:root=true
// AutoScalerList contains a list of AutoScaler
type AutoScalerList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []AutoScaler `json:"items"`
}
// +kubebuilder:printcolumn:JSONPath=".metadata.creationTimestamp",name=Age,type=date
// +kubebuilder:object:root=true
// +kubebuilder:subresource:status
// AutoScaler defines a autoscaler for ShardingSphere given
type AutoScaler struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec AutoScalerSpec `json:"spec,omitempty"`
Status AutoScalerStatus `json:"status,omitempty"`
}
// AutoScalerSpec defines a list of scaling policies
type AutoScalerSpec struct {
// PolicyGroup declares a set of scaling policies, including horizontal and vertical scaling
// Allow ComputeNode to enable HPA and VPA at the same time, without guaranteeing the result
// Haven't verified the configuration of HPA and VPA of StorageNode yet
PolicyGroup []ScalingPolicy `json:"policyGroup,omitempty" yaml:"policyGroup,omiempty"`
}
// ScalingPolicy defines a policy for scaling
type ScalingPolicy struct {
// TargetSelector is used to select the auto-scaling target
// Support native CrossVersionObjectReference and Selector
// The first version plans to support CrossVersionObjectReference first
TargetSelector *ObjectRefSelector `json:"targetSelector,omitempty" yaml:"targetSelector,omitempty"`
// Provider is the provider of the scaling mechanism, and the optional values are:
// - Empty: default value, which means provided by ShardingSphere Operator
// - KubernetesHPA: Indicates the use of Kubernetes native HPA
// - KubernetesVPA: Indicates the use of Kubernetes community VPA
// - Other: Indicates a controller using a third-party controller
// +optional
Provider string `json:"provider,omitempty" yaml:"provider,omitempty"`
// HorizontalScaling contains the necessary parameters for HPA scaling
// Does not contain StorageNode related configuration
// +optional
Horizontal *HorizontalScaling `json:"horizontal,omitempty" yaml:"horizontal,omitempty"`
// VerticalScaling contains the necessary parameters for VPA scaling
// Does not contain StorageNode related configuration
// +optional
Vertical *VerticalScaling `json:"vertical,omitempey" yaml:"vertical,omitempty"`
}
// ObjectRefSelector defines a selector for objects
type ObjectRefSelector struct {
// +optional
ObjectRef autoscalingv2.CrossVersionObjectReference `json:"objectRef,omitempty" yaml:"objectRef,omitempty"`
// +optional
Selector *metav1.LabelSelector `json:"selector,omitempty" yaml:"selector,omitempty"`
}
// The following configuration items are basically the same as HPA configuration,
// please refer to the corresponding documentation for descriptiontype
type HorizontalScaling struct {
// maxReplicas is the upper limit for the number of replicas to which the autoscaler can scale up.
// It cannot be less that minReplicas.
// +optional
MaxReplicas int32 `json:"maxReplicas,omitempty" yaml:"maxReplicas,omitempty"`
// minReplicas is the lower limit for the number of replicas to which the autoscaler
// can scale down. It defaults to 1 pod. minReplicas is allowed to be 0 if the
// alpha feature gate HPAScaleToZero is enabled and at least one Object or External
// metric is configured. Scaling is active as long as at least one metric value is
// available.
// +optional
MinReplicas int32 `json:"minReplicas,omitempty" yaml:"minReplicas,omitempty"`
// scaleUp is scaling policy for scaling Up.
// If not set, the default value is the higher of:
// * increase no more than 4 pods per 60 seconds
// * double the number of pods per 60 seconds
// No stabilization is used.
// +optional
ScaleUpRules *autoscalingv2.HPAScalingRules `json:"scaleUpRules,omitempty" yaml:"scaleUpRules,omitempty"`
// scaleDown is scaling policy for scaling Down.
// If not set, the default value is to allow to scale down to minReplicas pods, with a
// 300 second stabilization window (i.e., the highest recommendation for
// the last 300sec is used).
// +optional
ScaleDownRules *autoscalingv2.HPAScalingRules `json:"scaleDownRules,omitempty" yaml:"scaleDownRules,omitempty"`
// metrics contains the specifications for which to use to calculate the
// desired replica count (the maximum replica count across all metrics will
// be used). The desired replica count is calculated multiplying the
// ratio between the target value and the current value by the current
// number of pods. Ergo, metrics used must decrease as the pod count is
// increased, and vice-versa. See the individual metric source types for
// more information about how each type of metric must respond.
// If not set, the default metric will be set to 80% average CPU utilization.
// +optional
Metrics []autoscalingv2.MetricSpec `json:"metrics,omitempty" yaml:"metrics,omitempty"`
}
// The following configuration items are basically the same as the VPA configuration,
// please refer to the corresponding documentation for instructions
type VerticalScaling struct {
// Describes the rules on how changes are applied to the pods.
// If not specified, all fields in the `PodUpdatePolicy` are set to their
// default values.
// +optional
UpdatePolicy *vpav1.PodUpdatePolicy `json:"updatePolicy,omitempty" yaml:"updatePolicy,omitempty"`
// Controls how the autoscaler computes recommended resources.
// The resource policy may be used to set constraints on the recommendations
// for individual containers. If not specified, the autoscaler computes recommended
// resources for all containers in the pod, without additional constraints.
// +optional
ResourcePolicy *vpav1.PodResourcePolicy `json:"resourcePolicy,omitempty" yaml:"resourcePolicy,omitempty"`
// Recommender responsible for generating recommendation for this object.
// List should be empty (then the default recommender will generate the
// recommendation) or contain exactly one recommender.
// +optional
Recommenders []vpav1.VerticalPodAutoscalerRecommenderSelector `json:"recommenders,omitempty" yaml:"recommenders,omitempty"`
}
// AutoScalerStatus defines the status of a autoscaler
type AutoScalerStatus struct {
// +optional
Conditions []AutoScalerCondition `json:"conditions,omitempty" yaml:"conditions,omitempty"`
}
// AutoScalerCondition defiens the condition of a autoscaler
type AutoScalerCondition struct {
Type AutoScalerConditionType `json:"type" protobuf:"bytes,1,name=type"`
Status v1.ConditionStatus `json:"status" protobuf:"bytes,2,name=status"`
LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,3,opt,name=lastTransitionTime"`
Reason string `json:"reason,omitempty" protobuf:"bytes,4,opt,name=reason"`
Message string `json:"message,omitempty" protobuf:"bytes,5,opt,name=message"`
}
type AutoScalerConditionType string
const (
ScalingReady AutoScalerConditionType = "ScalingReady"
)
func init() {
SchemeBuilder.Register(&AutoScaler{}, &AutoScalerList{})
}