-
Notifications
You must be signed in to change notification settings - Fork 129
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
744fe00
e351ae3
59510a1
853188a
81f5d6a
f686a2d
1e1a296
1ad0f63
be4952c
444740c
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" | ||
apiextv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
|
@@ -431,6 +432,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 | ||
|
@@ -460,6 +466,49 @@ type DaemonSetSpec struct { | |
Patches []Patch `json:"patches,omitempty"` | ||
} | ||
|
||
// +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)" | ||
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. Same comment |
||
// | ||
// HPASpec is the configuration for the Horizontal Pod Autoscaling. | ||
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. nit: put the struct comment above the |
||
// | ||
//nolint:lll | ||
type HPASpec struct { | ||
ciarams87 marked this conversation as resolved.
Show resolved
Hide resolved
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"` | ||
sjberman marked this conversation as resolved.
Show resolved
Hide resolved
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 actually doesn't need to be a pointer type since it's a slice. |
||
|
||
// Target cpu utilization percentage of HPA. | ||
// | ||
// +optional | ||
TargetCPUUtilizationPercentage *int32 `json:"targetCPUUtilizationPercentage,omitempty"` | ||
|
||
// Target memory utilization percentage of HPA. | ||
// | ||
// +optional | ||
TargetMemoryUtilizationPercentage *int32 `json:"targetMemoryUtilizationPercentage,omitempty"` | ||
|
||
// Minimum number of replicas. | ||
// | ||
// +optional | ||
ciarams87 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
MinReplicas *int32 `json:"minReplicas,omitempty"` | ||
|
||
// Maximum number of replicas. | ||
MaxReplicas int32 `json:"maxReplicas"` | ||
|
||
// 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 }} | ||
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. since this is an optional field, it needs a conditional so it doesn't render if it doesn't exist |
||
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 }} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,7 +12,29 @@ spec: | |
kubernetes: | ||
{{- if eq .Values.nginx.kind "deployment" }} | ||
deployment: | ||
{{- if .Values.nginx.replicas }} | ||
replicas: {{ .Values.nginx.replicas }} | ||
{{- end }} | ||
{{- if .Values.nginx.autoscaling.enabled }} | ||
autoscaling: | ||
enabled: {{ .Values.nginx.autoscaling.enabled }} | ||
minReplicas: {{ .Values.nginx.autoscaling.minReplicas }} | ||
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. since this is an optional field, it needs a conditional so it doesn't render if it doesn't exist |
||
maxReplicas: {{ .Values.nginx.autoscaling.maxReplicas }} | ||
{{- if .Values.nginx.autoscaling.targetCPUUtilizationPercentage }} | ||
targetCPUUtilizationPercentage: {{ .Values.nginx.autoscaling.targetCPUUtilizationPercentage }} | ||
{{- end }} | ||
{{- if .Values.nginx.autoscaling.targetMemoryUtilizationPercentage }} | ||
targetMemoryUtilizationPercentage: {{ .Values.nginx.autoscaling.targetMemoryUtilizationPercentage }} | ||
{{- end }} | ||
{{- if .Values.nginx.autoscaling.behavior }} | ||
behavior: | ||
{{- toYaml .Values.nginx.autoscaling.behavior | nindent 10 }} | ||
{{- end }} | ||
{{- if .Values.nginx.autoscalingTemplate }} | ||
autoscalingTemplate: | ||
{{- toYaml .Values.nginx.autoscalingTemplate | nindent 8 }} | ||
{{- end }} | ||
{{- end }} | ||
{{- if .Values.nginx.pod }} | ||
pod: | ||
{{- toYaml .Values.nginx.pod | nindent 8 }} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't need to use CEL validation. You can just set minimum and maximum directly on the field. See other int values as examples in here.