-
Notifications
You must be signed in to change notification settings - Fork 130
Add control and data plane HPA #3492
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
base: main
Are you sure you want to change the base?
Changes from all commits
3d2b56c
178326a
8d6e67a
d264650
c53d713
bacd371
3298ffe
a3cc731
62bfa27
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
package v1alpha2 | ||
|
||
import ( | ||
autoscalingv2 "k8s.io/api/autoscaling/v2" | ||
corev1 "k8s.io/api/core/v1" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
|
||
|
@@ -388,6 +389,11 @@ type DeploymentSpec struct { | |
// +optional | ||
Replicas *int32 `json:"replicas,omitempty"` | ||
|
||
// Autoscaling defines the configuration for Horizontal Pod Autoscaling. | ||
// | ||
// +optional | ||
Autoscaling HPASpec `json:"autoscaling"` | ||
|
||
// Pod defines Pod-specific fields. | ||
// | ||
// +optional | ||
|
@@ -412,6 +418,56 @@ type DaemonSetSpec struct { | |
Container ContainerSpec `json:"container"` | ||
} | ||
|
||
// +kubebuilder:validation:XValidation:message="at least one metric must be specified when autoscaling is enabled",rule="!self.enabled || (has(self.targetCPUUtilizationPercentage) || has(self.targetMemoryUtilizationPercentage) || (has(self.autoscalingTemplate) && size(self.autoscalingTemplate) > 0))" | ||
// +kubebuilder:validation:XValidation:message="minReplicas must be less than or equal to maxReplicas",rule="self.minReplicas <= self.maxReplicas" | ||
// +kubebuilder:validation:XValidation:message="CPU utilization must be between 1 and 100",rule="!has(self.targetCPUUtilizationPercentage) || (self.targetCPUUtilizationPercentage >= 1 && self.targetCPUUtilizationPercentage <= 100)" | ||
// +kubebuilder:validation:XValidation:message="memory utilization must be between 1 and 100",rule="!has(self.targetMemoryUtilizationPercentage) || (self.targetMemoryUtilizationPercentage >= 1 && self.targetMemoryUtilizationPercentage <= 100)" | ||
// | ||
// HPASpec is the configuration for the Horizontal Pod Autoscaling. | ||
// | ||
//nolint:lll | ||
type HPASpec struct { | ||
sjberman marked this conversation as resolved.
Show resolved
Hide resolved
|
||
// Behavior configures the scaling behavior of the target | ||
// in both Up and Down directions (scaleUp and scaleDown fields respectively). | ||
// If not set, the default HPAScalingRules for scale up and scale down are used. | ||
// | ||
// +optional | ||
Behavior *autoscalingv2.HorizontalPodAutoscalerBehavior `json:"behavior,omitempty"` | ||
|
||
// AutoscalingTemplate configures the additional scaling option. | ||
// | ||
// +optional | ||
AutoscalingTemplate *[]autoscalingv2.MetricSpec `json:"autoscalingTemplate,omitempty"` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I wonder if we just name this field There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It depends on our decision. I’m just referring to this concept from the Nginx Ingress Helm charts. https://github.com/kubernetes/ingress-nginx/blob/main/charts/ingress-nginx/templates/controller-hpa.yaml There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I would say we keep it generic and not define anything specific at this time. |
||
|
||
// Target cpu utilization percentage of HPA. | ||
// | ||
// +optional | ||
TargetCPUUtilizationPercentage *int32 `json:"targetCPUUtilizationPercentage,omitempty"` | ||
|
||
// Target memory utilization percentage of HPA. | ||
// | ||
// +optional | ||
TargetMemoryUtilizationPercentage *int32 `json:"targetMemoryUtilizationPercentage,omitempty"` | ||
|
||
// Annotation for Horizontal Pod Autoscaler | ||
// Annotations is an unstructured key value map stored with a resource that may be | ||
// set by external tools to store and retrieve arbitrary metadata. They are not | ||
// queryable and should be preserved when modifying objects. | ||
// More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations | ||
// | ||
// +optional | ||
ciarams87 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
HPAAnnotations map[string]string `json:"hpaAnnotations,omitempty"` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Are there generally HPA-specific annotations that people use? Or is meant to be just generic annotations like any other resource? I ask because the Gateway API pattern to set annotations on provisioned objects is through the Gateway There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is intended to be a generic annotation. It depends on a Horizontal Pod Autoscaler (HPA), not a Gateway resource. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In that case, let's remove it from here. The design by the Gateway API is that all resources provisioned by our control plane (including the data plane HPA now) have their annotations and labels defined in the Gateway resource in the |
||
|
||
// Minimum number of replicas. | ||
MinReplicas int32 `json:"minReplicas"` | ||
|
||
// Maximum number of replicas. | ||
MaxReplicas int32 `json:"maxReplicas"` | ||
Comment on lines
+461
to
+465
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does k8s have defaults for these values or are they required? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Default value of minReplica is 1 But, We should set MaxReplicas value. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If a default value exists, then we should mark fields as optional and they can be pointers. |
||
|
||
// Enable or disable Horizontal Pod Autoscaler | ||
Enabled bool `json:"enabled"` | ||
} | ||
|
||
// PodSpec defines Pod-specific fields. | ||
type PodSpec struct { | ||
// TerminationGracePeriodSeconds is the optional duration in seconds the pod needs to terminate gracefully. | ||
|
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
{{- if and (eq .Values.nginxGateway.kind "deployment") .Values.nginxGateway.autoscaling.enabled (.Capabilities.APIVersions.Has "autoscaling/v2") -}} | ||
apiVersion: autoscaling/v2 | ||
kind: HorizontalPodAutoscaler | ||
metadata: | ||
{{- with .Values.nginxGateway.autoscaling.annotations }} | ||
annotations: {{ toYaml . | nindent 4 }} | ||
{{- end }} | ||
labels: | ||
{{- include "nginx-gateway.labels" . | nindent 4 }} | ||
{{- with .Values.nginxGateway.labels }} | ||
{{- toYaml . | nindent 4 }} | ||
{{- end }} | ||
name: {{ include "nginx-gateway.fullname" . }} | ||
namespace: {{ .Release.Namespace }} | ||
spec: | ||
scaleTargetRef: | ||
apiVersion: apps/v1 | ||
kind: Deployment | ||
name: {{ include "nginx-gateway.fullname" . }} | ||
minReplicas: {{ .Values.nginxGateway.autoscaling.minReplicas }} | ||
maxReplicas: {{ .Values.nginxGateway.autoscaling.maxReplicas }} | ||
metrics: | ||
{{- with .Values.nginxGateway.autoscaling.targetMemoryUtilizationPercentage }} | ||
- type: Resource | ||
resource: | ||
name: memory | ||
target: | ||
type: Utilization | ||
averageUtilization: {{ . }} | ||
{{- end }} | ||
{{- with .Values.nginxGateway.autoscaling.targetCPUUtilizationPercentage }} | ||
- type: Resource | ||
resource: | ||
name: cpu | ||
target: | ||
type: Utilization | ||
averageUtilization: {{ . }} | ||
{{- end }} | ||
{{- with .Values.autoscalingTemplate }} | ||
{{- toYaml . | nindent 2 }} | ||
{{- end }} | ||
{{- with .Values.nginxGateway.autoscaling.behavior }} | ||
behavior: | ||
{{- toYaml . | nindent 4 }} | ||
{{- end }} | ||
{{- end }} |
Uh oh!
There was an error while loading. Please reload this page.