diff --git a/charts/nginx-ingress/templates/controller-hpa.yaml b/charts/nginx-ingress/templates/controller-hpa.yaml index 971aca90d3..7982cdbe5b 100644 --- a/charts/nginx-ingress/templates/controller-hpa.yaml +++ b/charts/nginx-ingress/templates/controller-hpa.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.controller.autoscaling.enabled (eq .Values.controller.kind "deployment") (.Capabilities.APIVersions.Has "autoscaling/v2") -}} +{{- if and .Values.controller.autoscaling.enabled .Values.controller.autoscaling.create (eq .Values.controller.kind "deployment") (.Capabilities.APIVersions.Has "autoscaling/v2") -}} apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: diff --git a/charts/nginx-ingress/values.schema.json b/charts/nginx-ingress/values.schema.json index 82b3cad0e2..03ac475150 100644 --- a/charts/nginx-ingress/values.schema.json +++ b/charts/nginx-ingress/values.schema.json @@ -2093,6 +2093,7 @@ "terminationGracePeriodSeconds": 30, "autoscaling": { "enabled": false, + "create": true, "annotations": {}, "minReplicas": 1, "maxReplicas": 3, @@ -2733,6 +2734,7 @@ "terminationGracePeriodSeconds": 30, "autoscaling": { "enabled": false, + "create": true, "annotations": {}, "minReplicas": 1, "maxReplicas": 3, diff --git a/charts/nginx-ingress/values.yaml b/charts/nginx-ingress/values.yaml index 95d6f7b508..9ee9454c5d 100644 --- a/charts/nginx-ingress/values.yaml +++ b/charts/nginx-ingress/values.yaml @@ -243,6 +243,8 @@ controller: autoscaling: ## Enables HorizontalPodAutoscaling. enabled: false + ## Create the HorizontalPodAutoscaler resource. This can be set to false to manage the HPA externally. + create: true ## The annotations of the Ingress Controller HorizontalPodAutoscaler. annotations: {} ## Minimum number of replicas for the HPA. diff --git a/charts/tests/__snapshots__/helmunit_test.snap b/charts/tests/__snapshots__/helmunit_test.snap index 4a6ebaecd3..9ea1b34bbc 100755 --- a/charts/tests/__snapshots__/helmunit_test.snap +++ b/charts/tests/__snapshots__/helmunit_test.snap @@ -4368,6 +4368,925 @@ metadata: app.kubernetes.io/managed-by: Helm --- +[TestHelmNICTemplate/deployment-hpa - 1] +/-/-/-/ +# Source: nginx-ingress/templates/controller-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: deployment-hpa-nginx-ingress + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +/-/-/-/ +# Source: nginx-ingress/templates/controller-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: deployment-hpa-nginx-ingress + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +data: + {} +/-/-/-/ +# Source: nginx-ingress/templates/controller-leader-election-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: deployment-hpa-nginx-ingress-leader-election + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +/-/-/-/ +# Source: nginx-ingress/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +rules: +- apiGroups: + - "" + resources: + - configmaps + - namespaces + - pods + - secrets + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - list +- apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - list + - watch +- apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - list + - watch +- apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - nodes + verbs: + - list +- apiGroups: + - "apps" + resources: + - replicasets + - daemonsets + - statefulsets + verbs: + - get +- apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list +- apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update +- apiGroups: + - k8s.nginx.org + resources: + - virtualservers + - virtualserverroutes + - globalconfigurations + - transportservers + - policies + verbs: + - list + - watch + - get +- apiGroups: + - k8s.nginx.org + resources: + - virtualservers/status + - virtualserverroutes/status + - policies/status + - transportservers/status + verbs: + - update +/-/-/-/ +# Source: nginx-ingress/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +subjects: +- kind: ServiceAccount + name: deployment-hpa-nginx-ingress + namespace: default +roleRef: + kind: ClusterRole + name: deployment-hpa-nginx-ingress + apiGroup: rbac.authorization.k8s.io +/-/-/-/ +# Source: nginx-ingress/templates/controller-role.yaml +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm + namespace: default +rules: +- apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - services + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get +- apiGroups: + - "" + resources: + - pods + verbs: + - update +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - list +- apiGroups: + - coordination.k8s.io + resources: + - leases + resourceNames: + - deployment-hpa-nginx-ingress-leader-election + verbs: + - get + - update +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create +/-/-/-/ +# Source: nginx-ingress/templates/controller-rolebinding.yaml +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: deployment-hpa-nginx-ingress +subjects: +- kind: ServiceAccount + name: deployment-hpa-nginx-ingress + namespace: default +/-/-/-/ +# Source: nginx-ingress/templates/controller-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: deployment-hpa-nginx-ingress-controller + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + externalTrafficPolicy: Local + type: LoadBalancer + ports: + - port: 80 + targetPort: 80 + protocol: TCP + name: http + nodePort: + - port: 443 + targetPort: 443 + protocol: TCP + name: https + nodePort: + selector: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa +/-/-/-/ +# Source: nginx-ingress/templates/controller-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: deployment-hpa-nginx-ingress-controller + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + template: + metadata: + labels: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9113" + prometheus.io/scheme: "http" + spec: + volumes: [] + serviceAccountName: deployment-hpa-nginx-ingress + automountServiceAccountToken: true + securityContext: + seccompProfile: + type: RuntimeDefault + terminationGracePeriodSeconds: 30 + hostNetwork: false + dnsPolicy: ClusterFirst + containers: + - image: nginx/nginx-ingress:5.3.0 + name: nginx-ingress + imagePullPolicy: "IfNotPresent" + ports: + - name: http + containerPort: 80 + protocol: TCP + - name: https + containerPort: 443 + protocol: TCP + - name: prometheus + containerPort: 9113 + - name: readiness-port + containerPort: 8081 + readinessProbe: + httpGet: + path: /nginx-ready + port: readiness-port + periodSeconds: 1 + initialDelaySeconds: 0 + resources: + requests: + cpu: 100m + memory: 128Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + runAsUser: 101 #nginx + runAsNonRoot: true + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + volumeMounts: [] + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + args: + + - -nginx-plus=false + - -nginx-reload-timeout=60000 + - -enable-app-protect=false + - -enable-app-protect-dos=false + - -nginx-configmaps=$(POD_NAMESPACE)/deployment-hpa-nginx-ingress + - -ingress-class=nginx + - -health-status=false + - -health-status-uri=/nginx-health + - -nginx-debug=false + - -log-level=info + - -log-format=glog + - -nginx-status=true + - -nginx-status-port=8080 + - -nginx-status-allow-cidrs=127.0.0.1 + - -report-ingress-status + - -external-service=deployment-hpa-nginx-ingress-controller + - -enable-leader-election=true + - -leader-election-lock-name=deployment-hpa-nginx-ingress-leader-election + - -enable-prometheus-metrics=true + - -prometheus-metrics-listen-port=9113 + - -prometheus-tls-secret= + - -enable-service-insight=false + - -service-insight-listen-port=9114 + - -service-insight-tls-secret= + - -enable-custom-resources=true + - -enable-snippets=false + - -disable-ipv6=false + - -enable-tls-passthrough=false + - -enable-cert-manager=false + - -enable-oidc=false + - -enable-external-dns=false + - -default-http-listener-port=80 + - -default-https-listener-port=443 + - -ready-status=true + - -ready-status-port=8081 + - -enable-latency-metrics=false + - -ssl-dynamic-reload=true + - -enable-telemetry-reporting=true + - -weight-changes-dynamic-reload=false +/-/-/-/ +# Source: nginx-ingress/templates/controller-hpa.yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: deployment-hpa-nginx-ingress-controller + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: deployment-hpa-nginx-ingress-controller + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: memory + target: + type: Utilization + averageUtilization: 50 + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 +/-/-/-/ +# Source: nginx-ingress/templates/controller-ingress-class.yaml +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + name: nginx + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + controller: nginx.org/ingress-controller +/-/-/-/ +# Source: nginx-ingress/templates/controller-configmap.yaml +/-/-/-/ +/-/-/-/ +# Source: nginx-ingress/templates/controller-lease.yaml +apiVersion: coordination.k8s.io/v1 +kind: Lease +metadata: + name: deployment-hpa-nginx-ingress-leader-election + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +--- + +[TestHelmNICTemplate/deployment-hpa-no-create - 1] +/-/-/-/ +# Source: nginx-ingress/templates/controller-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: deployment-hpa-no-create-nginx-ingress + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +/-/-/-/ +# Source: nginx-ingress/templates/controller-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: deployment-hpa-no-create-nginx-ingress + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +data: + {} +/-/-/-/ +# Source: nginx-ingress/templates/controller-leader-election-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: deployment-hpa-no-create-nginx-ingress-leader-election + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +/-/-/-/ +# Source: nginx-ingress/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-no-create-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +rules: +- apiGroups: + - "" + resources: + - configmaps + - namespaces + - pods + - secrets + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - list +- apiGroups: + - "" + resources: + - services + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - list + - watch +- apiGroups: + - discovery.k8s.io + resources: + - endpointslices + verbs: + - get + - list + - watch +- apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - nodes + verbs: + - list +- apiGroups: + - "apps" + resources: + - replicasets + - daemonsets + - statefulsets + verbs: + - get +- apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list +- apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update +- apiGroups: + - k8s.nginx.org + resources: + - virtualservers + - virtualserverroutes + - globalconfigurations + - transportservers + - policies + verbs: + - list + - watch + - get +- apiGroups: + - k8s.nginx.org + resources: + - virtualservers/status + - virtualserverroutes/status + - policies/status + - transportservers/status + verbs: + - update +/-/-/-/ +# Source: nginx-ingress/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-no-create-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +subjects: +- kind: ServiceAccount + name: deployment-hpa-no-create-nginx-ingress + namespace: default +roleRef: + kind: ClusterRole + name: deployment-hpa-no-create-nginx-ingress + apiGroup: rbac.authorization.k8s.io +/-/-/-/ +# Source: nginx-ingress/templates/controller-role.yaml +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-no-create-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm + namespace: default +rules: +- apiGroups: + - "" + resources: + - configmaps + - pods + - secrets + - services + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - namespaces + verbs: + - get +- apiGroups: + - "" + resources: + - pods + verbs: + - update +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - list +- apiGroups: + - coordination.k8s.io + resources: + - leases + resourceNames: + - deployment-hpa-no-create-nginx-ingress-leader-election + verbs: + - get + - update +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - create +/-/-/-/ +# Source: nginx-ingress/templates/controller-rolebinding.yaml +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: deployment-hpa-no-create-nginx-ingress + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: deployment-hpa-no-create-nginx-ingress +subjects: +- kind: ServiceAccount + name: deployment-hpa-no-create-nginx-ingress + namespace: default +/-/-/-/ +# Source: nginx-ingress/templates/controller-service.yaml +apiVersion: v1 +kind: Service +metadata: + name: deployment-hpa-no-create-nginx-ingress-controller + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + externalTrafficPolicy: Local + type: LoadBalancer + ports: + - port: 80 + targetPort: 80 + protocol: TCP + name: http + nodePort: + - port: 443 + targetPort: 443 + protocol: TCP + name: https + nodePort: + selector: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create +/-/-/-/ +# Source: nginx-ingress/templates/controller-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: deployment-hpa-no-create-nginx-ingress-controller + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + selector: + matchLabels: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + template: + metadata: + labels: + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9113" + prometheus.io/scheme: "http" + spec: + volumes: [] + serviceAccountName: deployment-hpa-no-create-nginx-ingress + automountServiceAccountToken: true + securityContext: + seccompProfile: + type: RuntimeDefault + terminationGracePeriodSeconds: 30 + hostNetwork: false + dnsPolicy: ClusterFirst + containers: + - image: nginx/nginx-ingress:5.3.0 + name: nginx-ingress + imagePullPolicy: "IfNotPresent" + ports: + - name: http + containerPort: 80 + protocol: TCP + - name: https + containerPort: 443 + protocol: TCP + - name: prometheus + containerPort: 9113 + - name: readiness-port + containerPort: 8081 + readinessProbe: + httpGet: + path: /nginx-ready + port: readiness-port + periodSeconds: 1 + initialDelaySeconds: 0 + resources: + requests: + cpu: 100m + memory: 128Mi + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: false + runAsUser: 101 #nginx + runAsNonRoot: true + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + volumeMounts: [] + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + args: + + - -nginx-plus=false + - -nginx-reload-timeout=60000 + - -enable-app-protect=false + - -enable-app-protect-dos=false + - -nginx-configmaps=$(POD_NAMESPACE)/deployment-hpa-no-create-nginx-ingress + - -ingress-class=nginx + - -health-status=false + - -health-status-uri=/nginx-health + - -nginx-debug=false + - -log-level=info + - -log-format=glog + - -nginx-status=true + - -nginx-status-port=8080 + - -nginx-status-allow-cidrs=127.0.0.1 + - -report-ingress-status + - -external-service=deployment-hpa-no-create-nginx-ingress-controller + - -enable-leader-election=true + - -leader-election-lock-name=deployment-hpa-no-create-nginx-ingress-leader-election + - -enable-prometheus-metrics=true + - -prometheus-metrics-listen-port=9113 + - -prometheus-tls-secret= + - -enable-service-insight=false + - -service-insight-listen-port=9114 + - -service-insight-tls-secret= + - -enable-custom-resources=true + - -enable-snippets=false + - -disable-ipv6=false + - -enable-tls-passthrough=false + - -enable-cert-manager=false + - -enable-oidc=false + - -enable-external-dns=false + - -default-http-listener-port=80 + - -default-https-listener-port=443 + - -ready-status=true + - -ready-status-port=8081 + - -enable-latency-metrics=false + - -ssl-dynamic-reload=true + - -enable-telemetry-reporting=true + - -weight-changes-dynamic-reload=false +/-/-/-/ +# Source: nginx-ingress/templates/controller-ingress-class.yaml +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + name: nginx + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +spec: + controller: nginx.org/ingress-controller +/-/-/-/ +# Source: nginx-ingress/templates/controller-configmap.yaml +/-/-/-/ +/-/-/-/ +# Source: nginx-ingress/templates/controller-lease.yaml +apiVersion: coordination.k8s.io/v1 +kind: Lease +metadata: + name: deployment-hpa-no-create-nginx-ingress-leader-election + namespace: default + labels: + helm.sh/chart: nginx-ingress-2.4.0 + app.kubernetes.io/name: nginx-ingress + app.kubernetes.io/instance: deployment-hpa-no-create + app.kubernetes.io/version: "5.3.0" + app.kubernetes.io/managed-by: Helm +--- + [TestHelmNICTemplate/globalConfig - 1] /-/-/-/ # Source: nginx-ingress/templates/controller-serviceaccount.yaml diff --git a/charts/tests/helmunit_test.go b/charts/tests/helmunit_test.go index dd459e7820..370df6175f 100644 --- a/charts/tests/helmunit_test.go +++ b/charts/tests/helmunit_test.go @@ -36,6 +36,16 @@ func TestHelmNICTemplate(t *testing.T) { releaseName: "default", namespace: "default", }, + "deployment-hpa": { + valuesFile: "testdata/deployment-hpa.yaml", + releaseName: "deployment-hpa", + namespace: "default", + }, + "deployment-hpa-no-create": { + valuesFile: "testdata/deployment-hpa-no-create.yaml", + releaseName: "deployment-hpa-no-create", + namespace: "default", + }, "daemonset": { valuesFile: "testdata/daemonset.yaml", releaseName: "daemonset", diff --git a/charts/tests/testdata/deployment-hpa-no-create.yaml b/charts/tests/testdata/deployment-hpa-no-create.yaml new file mode 100644 index 0000000000..2736853b5d --- /dev/null +++ b/charts/tests/testdata/deployment-hpa-no-create.yaml @@ -0,0 +1,5 @@ +controller: + kind: deployment + autoscaling: + enabled: true + create: false diff --git a/charts/tests/testdata/deployment-hpa.yaml b/charts/tests/testdata/deployment-hpa.yaml new file mode 100644 index 0000000000..5a10f04403 --- /dev/null +++ b/charts/tests/testdata/deployment-hpa.yaml @@ -0,0 +1,4 @@ +controller: + kind: deployment + autoscaling: + enabled: true diff --git a/examples/shared-examples/autoscaling-keda/README.md b/examples/shared-examples/autoscaling-keda/README.md new file mode 100644 index 0000000000..5da5fc7067 --- /dev/null +++ b/examples/shared-examples/autoscaling-keda/README.md @@ -0,0 +1,28 @@ +# Enable Keda scale to 0 in off hours + +This example is based on the Keda [example](https://keda.sh/docs/2.18/scalers/cron/#scale-to-0-during-off-hours). + +## 1. Deploy the Ingress Controller + +1. Follow the [installation](https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/) + instructions to deploy the Ingress Controller. + +## 2. Deploy Keda + +1. Follow the [installation](https://keda.sh/docs/2.18/deploy/) instructions to suit your deployment preference. + +## 3. Apply the Keda ScaledObject + +Adjust the settings to suit your requirements. See the [ScaledObject](https://keda.sh/docs/2.18/reference/scaledobject-spec/) reference for more details + +1. Apply `scaled-object.yaml` + +```console +kubectl apply -f scaled-object.yaml +``` + +## 4. Configure deployment replicas + +1. Remove the `spec.replicas` from your deployment to allow Keda to autoscale your pods. + +2. Once the end time has expired, 5 minutes from then the NGINX Ingress Controller pods should scale to 0. diff --git a/examples/shared-examples/autoscaling-keda/scaled-object.yaml b/examples/shared-examples/autoscaling-keda/scaled-object.yaml new file mode 100644 index 0000000000..3cc874c48f --- /dev/null +++ b/examples/shared-examples/autoscaling-keda/scaled-object.yaml @@ -0,0 +1,22 @@ +apiVersion: keda.sh/v1alpha1 +kind: ScaledObject +metadata: + name: cron-scaledobject + namespace: nginx-ingress +spec: + scaleTargetRef: + name: nginx-ingress + minReplicaCount: 0 + maxReplicaCount: 4 + cooldownPeriod: 300 + triggers: + - type: cron + metadata: + timezone: Europe/London + start: 0 09 * * * + end: 30 17 * * * + desiredReplicas: "1" + - type: cpu + metricType: Utilization + metadata: + value: "80"