From adcd4b392cfdb4386bc27796511bb0bf066c0d22 Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Wed, 27 Sep 2023 17:53:34 +0300 Subject: [PATCH 01/41] feat(keda): :sparkles: Allow providing own cert-manager issuer in TLS certificate Signed-off-by: Dmytro Kovalenko --- keda/templates/cert-manager/keda-issuer.yaml | 4 +- .../cert-manager/keda-tls-certificate.yaml | 16 +++++- keda/templates/cert-manager/self-ca.yaml | 4 +- keda/templates/cert-manager/self-issuer.yaml | 4 +- keda/values.yaml | 54 +++++++++++++------ 5 files changed, 58 insertions(+), 24 deletions(-) diff --git a/keda/templates/cert-manager/keda-issuer.yaml b/keda/templates/cert-manager/keda-issuer.yaml index 3840f276..bba6ef55 100644 --- a/keda/templates/cert-manager/keda-issuer.yaml +++ b/keda/templates/cert-manager/keda-issuer.yaml @@ -1,4 +1,4 @@ -{{- if .Values.certificates.certManager.enabled }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateIssuer }} apiVersion: cert-manager.io/v1 kind: Issuer metadata: @@ -11,4 +11,4 @@ metadata: spec: ca: secretName: {{ .Values.certificates.certManager.caSecretName }} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/keda/templates/cert-manager/keda-tls-certificate.yaml b/keda/templates/cert-manager/keda-tls-certificate.yaml index 8b4e210f..9f4d8ee3 100644 --- a/keda/templates/cert-manager/keda-tls-certificate.yaml +++ b/keda/templates/cert-manager/keda-tls-certificate.yaml @@ -25,10 +25,22 @@ spec: privateKey: algorithm: RSA size: 2048 - duration: 8760h0m0s # 1 year - renewBefore: 5840h0m0s # 8 months + duration: {{ .Values.certificates.certManager.duration }} + renewBefore: {{ .Values.certificates.certManager.renewBefore }} issuerRef: + {{- if .Values.certificates.certManager.generateIssuer }} name: {{ .Values.operator.name }}-issuer kind: Issuer group: cert-manager.io + {{- else }} + {{- if .Values.certificates.certManager.issuer.name }} + name: {{ .Values.certificates.certManager.issuer.name }} + {{- end }} + {{- if .Values.certificates.certManager.issuer.kind }} + kind: {{ .Values.certificates.certManager.issuer.kind }} + {{- end }} + {{- if .Values.certificates.certManager.issuer.group }} + group: {{ .Values.certificates.certManager.issuer.group }} + {{- end }} + {{- end }} {{- end }} diff --git a/keda/templates/cert-manager/self-ca.yaml b/keda/templates/cert-manager/self-ca.yaml index 7bde59bc..ab02b1d3 100644 --- a/keda/templates/cert-manager/self-ca.yaml +++ b/keda/templates/cert-manager/self-ca.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.generateIssuer }} apiVersion: cert-manager.io/v1 kind: Certificate metadata: @@ -19,4 +19,4 @@ spec: name: {{ .Values.operator.name }}-selfsigned-issuer kind: Issuer group: cert-manager.io -{{- end }} \ No newline at end of file +{{- end }} diff --git a/keda/templates/cert-manager/self-issuer.yaml b/keda/templates/cert-manager/self-issuer.yaml index b2ce2a55..3d8f4c25 100644 --- a/keda/templates/cert-manager/self-issuer.yaml +++ b/keda/templates/cert-manager/self-issuer.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.generateIssuer }} apiVersion: cert-manager.io/v1 kind: Issuer metadata: @@ -10,4 +10,4 @@ metadata: namespace: {{ .Release.Namespace }} spec: selfSigned: {} -{{- end }} \ No newline at end of file +{{- end }} diff --git a/keda/values.yaml b/keda/values.yaml index 45f866cb..6b7d0925 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -45,7 +45,8 @@ operator: # Learn more in [our documentation](https://keda.sh/docs/latest/operate/cluster/#high-availability). replicaCount: 1 # -- [Affinity] for pod scheduling for KEDA operator. Takes precedence over the `affinity` field - affinity: {} + affinity: + {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -84,7 +85,8 @@ metricsServer: # -- Enable metric server to use host network useHostNetwork: false # -- [Affinity] for pod scheduling for Metrics API Server. Takes precedence over the `affinity` field - affinity: {} + affinity: + {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -139,7 +141,8 @@ webhooks: # -- Capability to configure the number of replicas for KEDA admission webhooks replicaCount: 1 # -- [Affinity] for pod scheduling for KEDA admission webhooks. Takes precedence over the `affinity` field - affinity: {} + affinity: + {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -155,21 +158,24 @@ webhooks: upgradeStrategy: # -- Capability to configure [Deployment upgrade strategy] for operator - operator: {} + operator: + {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 # maxSurge: 1 # -- Capability to configure [Deployment upgrade strategy] for Metrics Api Server - metricsApiServer: {} + metricsApiServer: + {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 # maxSurge: 1 # -- Capability to configure [Deployment upgrade strategy] for Admission webhooks - webhooks: {} + webhooks: + {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 @@ -177,17 +183,20 @@ upgradeStrategy: podDisruptionBudget: # -- Capability to configure [Pod Disruption Budget] - operator: {} + operator: + {} # minAvailable: 1 # maxUnavailable: 1 # -- Capability to configure [Pod Disruption Budget] - metricServer: {} + metricServer: + {} # minAvailable: 1 # maxUnavailable: 1 # -- Capability to configure [Pod Disruption Budget] - webhooks: {} + webhooks: + {} # minAvailable: 1 # maxUnavailable: 1 @@ -325,7 +334,7 @@ securityContext: operator: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -335,7 +344,7 @@ securityContext: metricServer: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -345,7 +354,7 @@ securityContext: webhooks: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -432,7 +441,8 @@ topologySpreadConstraints: webhooks: [] # -- [Affinity] for pod scheduling for both KEDA operator and Metrics API Server -affinity: {} +affinity: + {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -650,15 +660,26 @@ certificates: certManager: # -- Enables Cert-manager for certificate management enabled: false + # -- Certificate duration + duration: 8760h0m0s # 1 year + # -- Certificate renewal time before expiration + renewBefore: 5840h0m0s # 8 months # -- Generates a self-signed CA with Cert-manager. # If generateCA is false, the secret with the CA # has to be annotated with `cert-manager.io/allow-direct-injection: "true"` generateCA: true + # -- Generates an Issuer resource with Cert-manager + generateIssuer: true + # issuer: + # name: foo-org-ca + # kind: ClusterIssuer + # group: cert-manager.io # -- Secret name where the CA is stored (generatedby cert-manager or user given) caSecretName: "kedaorg-ca" # -- Add labels/annotations to secrets created by Certificate resources # [docs](https://cert-manager.io/docs/usage/certificate/#creating-certificate-resources) - secretTemplate: {} + secretTemplate: + {} # annotations: # my-secret-annotation-1: "foo" # my-secret-annotation-2: "bar" @@ -676,7 +697,8 @@ permissions: secret: false # -- Array of extra K8s manifests to deploy -extraObjects: [] +extraObjects: + [] # - apiVersion: keda.sh/v1alpha1 # kind: ClusterTriggerAuthentication # metadata: @@ -687,4 +709,4 @@ extraObjects: [] # provider: aws-eks # -- Capability to turn on/off ASCII art in Helm installation notes -asciiArt: true \ No newline at end of file +asciiArt: true From 9c50ff0b61e611c3c405cbb930f1d49222db5e49 Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Wed, 27 Sep 2023 18:33:20 +0300 Subject: [PATCH 02/41] docs(keda): :memo: Generate Helm docs Signed-off-by: Dmytro Kovalenko --- keda/README.md | 4 ++++ keda/values.yaml | 11 +++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/keda/README.md b/keda/README.md index 3e85ca0a..bbdfea72 100644 --- a/keda/README.md +++ b/keda/README.md @@ -64,8 +64,12 @@ their default values. | `asciiArt` | bool | `true` | Capability to turn on/off ASCII art in Helm installation notes | | `certificates.autoGenerated` | bool | `true` | Enables the self generation for KEDA TLS certificates inside KEDA operator | | `certificates.certManager.caSecretName` | string | `"kedaorg-ca"` | Secret name where the CA is stored (generatedby cert-manager or user given) | +| `certificates.certManager.duration` | string | `"8760h0m0s"` | Certificate duration | | `certificates.certManager.enabled` | bool | `false` | Enables Cert-manager for certificate management | | `certificates.certManager.generateCA` | bool | `true` | Generates a self-signed CA with Cert-manager. If generateCA is false, the secret with the CA has to be annotated with `cert-manager.io/allow-direct-injection: "true"` | +| `certificates.certManager.generateIssuer` | bool | `true` | Generates an Issuer resource with Cert-manager | +| `certificates.certManager.issuer` | object | `{}` | Reference to custom Issuer. If generateIssuer is false, the issuer reference below has to be provided | +| `certificates.certManager.renewBefore` | string | `"5840h0m0s"` | Certificate renewal time before expiration | | `certificates.certManager.secretTemplate` | object | `{}` | Add labels/annotations to secrets created by Certificate resources [docs](https://cert-manager.io/docs/usage/certificate/#creating-certificate-resources) | | `certificates.mountPath` | string | `"/certs"` | Path where KEDA TLS certificates are mounted | | `certificates.secretName` | string | `"kedaorg-certs"` | Secret name to be mounted with KEDA TLS certificates | diff --git a/keda/values.yaml b/keda/values.yaml index 6b7d0925..4cea1e7f 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -670,10 +670,13 @@ certificates: generateCA: true # -- Generates an Issuer resource with Cert-manager generateIssuer: true - # issuer: - # name: foo-org-ca - # kind: ClusterIssuer - # group: cert-manager.io + # -- Reference to custom Issuer. + # If generateIssuer is false, the issuer reference below has to be provided + issuer: + {} + # name: foo-org-ca + # kind: ClusterIssuer + # group: cert-manager.io # -- Secret name where the CA is stored (generatedby cert-manager or user given) caSecretName: "kedaorg-ca" # -- Add labels/annotations to secrets created by Certificate resources From e2b31ba2935bb11f9871f99382c3476286dc4fb9 Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Wed, 27 Sep 2023 19:59:27 +0300 Subject: [PATCH 03/41] fix(keda): :bug: Inject CA from cert-manager Certificate when providing own Issuer Signed-off-by: Dmytro Kovalenko --- keda/templates/metrics-server/apiservice.yaml | 2 ++ keda/templates/webhooks/validatingconfiguration.yaml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/keda/templates/metrics-server/apiservice.yaml b/keda/templates/metrics-server/apiservice.yaml index 0568f08a..9fd00da0 100644 --- a/keda/templates/metrics-server/apiservice.yaml +++ b/keda/templates/metrics-server/apiservice.yaml @@ -6,6 +6,8 @@ metadata: {{- if .Values.certificates.certManager.enabled }} {{- if .Values.certificates.certManager.generateCA }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca + {{- else if not .Values.certificates.certManager.generateIssuer }} + cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- else }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} {{- end }} diff --git a/keda/templates/webhooks/validatingconfiguration.yaml b/keda/templates/webhooks/validatingconfiguration.yaml index 5e2cde6b..ccf81bcd 100644 --- a/keda/templates/webhooks/validatingconfiguration.yaml +++ b/keda/templates/webhooks/validatingconfiguration.yaml @@ -7,6 +7,8 @@ metadata: {{- if .Values.certificates.certManager.enabled }} {{- if .Values.certificates.certManager.generateCA }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca + {{- else if not .Values.certificates.certManager.generateIssuer }} + cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- else }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} {{- end }} From 7e1598c65244c0291dbc812f0df0244b7e2ab36e Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Mon, 2 Oct 2023 17:10:04 +0300 Subject: [PATCH 04/41] refactor(keda): :recycle: Refactor values format Signed-off-by: Dmytro Kovalenko --- keda/README.md | 33 ++++++++++--------- keda/templates/cert-manager/keda-issuer.yaml | 2 +- .../cert-manager/keda-tls-certificate.yaml | 2 +- keda/templates/cert-manager/self-ca.yaml | 2 +- keda/templates/cert-manager/self-issuer.yaml | 2 +- keda/templates/metrics-server/apiservice.yaml | 2 +- .../webhooks/validatingconfiguration.yaml | 2 +- keda/values.yaml | 15 +++++---- 8 files changed, 32 insertions(+), 28 deletions(-) diff --git a/keda/README.md b/keda/README.md index bbdfea72..2cc234e1 100644 --- a/keda/README.md +++ b/keda/README.md @@ -35,8 +35,8 @@ As part of that, it will install all the required Custom Resource Definitions (C To install the chart with the release name `keda`: ```console -$ kubectl create namespace keda -$ helm install keda kedacore/keda --namespace keda --version 2.12.0 +kubectl create namespace keda +helm install keda kedacore/keda --namespace keda --version 2.12.0 ``` ## Uninstalling the Chart @@ -67,8 +67,11 @@ their default values. | `certificates.certManager.duration` | string | `"8760h0m0s"` | Certificate duration | | `certificates.certManager.enabled` | bool | `false` | Enables Cert-manager for certificate management | | `certificates.certManager.generateCA` | bool | `true` | Generates a self-signed CA with Cert-manager. If generateCA is false, the secret with the CA has to be annotated with `cert-manager.io/allow-direct-injection: "true"` | -| `certificates.certManager.generateIssuer` | bool | `true` | Generates an Issuer resource with Cert-manager | -| `certificates.certManager.issuer` | object | `{}` | Reference to custom Issuer. If generateIssuer is false, the issuer reference below has to be provided | +| `certificates.certManager.issuer` | object | `{"generate":true,"group":"cert-manager.io","kind":"ClusterIssuer","name":"foo-org-ca"}` | Reference to custom Issuer. If issuer.generate is false, then issuer.group, issuer.kind and issuer.name are required | +| `certificates.certManager.issuer.generate` | bool | `true` | Generates an Issuer resource with Cert-manager | +| `certificates.certManager.issuer.group` | string | `"cert-manager.io"` | Custom Issuer group. Required when generate: false | +| `certificates.certManager.issuer.kind` | string | `"ClusterIssuer"` | Custom Issuer kind. Required when generate: false | +| `certificates.certManager.issuer.name` | string | `"foo-org-ca"` | Custom Issuer name. Required when generate: false | | `certificates.certManager.renewBefore` | string | `"5840h0m0s"` | Certificate renewal time before expiration | | `certificates.certManager.secretTemplate` | object | `{}` | Add labels/annotations to secrets created by Certificate resources [docs](https://cert-manager.io/docs/usage/certificate/#creating-certificate-resources) | | `certificates.mountPath` | string | `"/certs"` | Path where KEDA TLS certificates are mounted | @@ -92,16 +95,16 @@ their default values. | `podIdentity.aws.irsa.stsRegionalEndpoints` | string | `"true"` | Sets the use of an STS regional endpoint instead of global. Recommended to use regional endpoint in almost all cases. This will be set as an annotation on the KEDA service account. | | `podIdentity.aws.irsa.tokenExpiration` | int | `86400` | Set to the value of the service account token expiration duration. This will be set as an annotation on the KEDA service account. | | `podIdentity.azureWorkload.clientId` | string | `""` | Id of Azure Active Directory Client to use for authentication with Azure Workload Identity. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | -| `podIdentity.azureWorkload.enabled` | bool | `false` | Set to true to enable Azure Workload Identity usage. See https://keda.sh/docs/concepts/authentication/#azure-workload-identity This will be set as a label on the KEDA service account. | +| `podIdentity.azureWorkload.enabled` | bool | `false` | Set to true to enable Azure Workload Identity usage. See This will be set as a label on the KEDA service account. | | `podIdentity.azureWorkload.tenantId` | string | `""` | Id Azure Active Directory Tenant to use for authentication with for Azure Workload Identity. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | | `podIdentity.azureWorkload.tokenExpiration` | int | `3600` | Duration in seconds to automatically expire tokens for the service account. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | -| `podIdentity.gcp.enabled` | bool | `false` | Set to true to enable GCP Workload Identity. See https://keda.sh/docs/2.10/authentication-providers/gcp-workload-identity/ This will be set as a annotation on the KEDA service account. | +| `podIdentity.gcp.enabled` | bool | `false` | Set to true to enable GCP Workload Identity. See This will be set as a annotation on the KEDA service account. | | `podIdentity.gcp.gcpIAMServiceAccount` | string | `""` | GCP IAM Service Account Email which you would like to use for workload identity. | -| `podSecurityContext` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] for all pods | +| `podSecurityContext` | object | [See below](#keda-is-secure-by-default) | [Pod security context] for all pods | | `priorityClassName` | string | `""` | priorityClassName for all KEDA components | | `rbac.aggregateToDefaultRoles` | bool | `false` | Specifies whether RBAC for CRDs should be [aggregated](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles) to default roles (view, edit, admin) | | `rbac.create` | bool | `true` | Specifies whether RBAC should be used | -| `securityContext` | object | [See below](#KEDA-is-secure-by-default) | [Security context] for all containers | +| `securityContext` | object | [See below](#keda-is-secure-by-default) | [Security context] for all containers | | `serviceAccount.annotations` | object | `{}` | Annotations to add to the service account | | `serviceAccount.automountServiceAccountToken` | bool | `true` | Specifies whether a service account should automount API-Credentials | | `serviceAccount.create` | bool | `true` | Specifies whether a service account should be created | @@ -129,9 +132,9 @@ their default values. | `podAnnotations.keda` | object | `{}` | Pod annotations for KEDA operator | | `podDisruptionBudget.operator` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.keda` | object | `{}` | Pod labels for KEDA operator | -| `podSecurityContext.operator` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA operator pod | +| `podSecurityContext.operator` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA operator pod | | `resources.operator` | object | `{"limits":{"cpu":1,"memory":"1000Mi"},"requests":{"cpu":"100m","memory":"100Mi"}}` | Manage [resource request & limits] of KEDA operator pod | -| `securityContext.operator` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the operator container | +| `securityContext.operator` | object | [See below](#keda-is-secure-by-default) | [Security context] of the operator container | | `topologySpreadConstraints.operator` | list | `[]` | [Pod Topology Constraints] of KEDA operator pod | | `upgradeStrategy.operator` | object | `{}` | Capability to configure [Deployment upgrade strategy] for operator | | `volumes.keda.extraVolumeMounts` | list | `[]` | Extra volume mounts for KEDA deployment | @@ -156,9 +159,9 @@ their default values. | `podAnnotations.metricsAdapter` | object | `{}` | Pod annotations for KEDA Metrics Adapter | | `podDisruptionBudget.metricServer` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.metricsAdapter` | object | `{}` | Pod labels for KEDA Metrics Adapter | -| `podSecurityContext.metricServer` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA metrics apiserver pod | +| `podSecurityContext.metricServer` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA metrics apiserver pod | | `resources.metricServer` | object | `{"limits":{"cpu":1,"memory":"1000Mi"},"requests":{"cpu":"100m","memory":"100Mi"}}` | Manage [resource request & limits] of KEDA metrics apiserver pod | -| `securityContext.metricServer` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the metricServer container | +| `securityContext.metricServer` | object | [See below](#keda-is-secure-by-default) | [Security context] of the metricServer container | | `service.annotations` | object | `{}` | Annotations to add the KEDA Metric Server service | | `service.portHttps` | int | `443` | HTTPS port for KEDA Metric Server service | | `service.portHttpsTarget` | int | `6443` | HTTPS port for KEDA Metric Server container | @@ -247,7 +250,7 @@ their default values. | `podAnnotations.webhooks` | object | `{}` | Pod annotations for KEDA Admission webhooks | | `podDisruptionBudget.webhooks` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.webhooks` | object | `{}` | Pod labels for KEDA Admission webhooks | -| `podSecurityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA admission webhooks | +| `podSecurityContext.webhooks` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA admission webhooks | | `prometheus.webhooks.enabled` | bool | `false` | Enable KEDA admission webhooks prometheus metrics expose | | `prometheus.webhooks.port` | int | `8080` | Port used for exposing KEDA admission webhooks prometheus metrics | | `prometheus.webhooks.prometheusRules.additionalLabels` | object | `{}` | Additional labels to add for KEDA admission webhooks using prometheusRules crd (prometheus operator) | @@ -266,7 +269,7 @@ their default values. | `prometheus.webhooks.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.webhooks.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | | `resources.webhooks` | object | `{"limits":{"cpu":"50m","memory":"100Mi"},"requests":{"cpu":"10m","memory":"10Mi"}}` | Manage [resource request & limits] of KEDA admission webhooks pod | -| `securityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the admission webhooks container | +| `securityContext.webhooks` | object | [See below](#keda-is-secure-by-default) | [Security context] of the admission webhooks container | | `topologySpreadConstraints.webhooks` | list | `[]` | [Pod Topology Constraints] of KEDA admission webhooks pod | | `upgradeStrategy.webhooks` | object | `{}` | Capability to configure [Deployment upgrade strategy] for Admission webhooks | | `volumes.webhooks.extraVolumeMounts` | list | `[]` | Extra volume mounts for admission webhooks deployment | @@ -303,6 +306,7 @@ helm install keda kedacore/keda --namespace keda -f values.yaml ## KEDA is secure by default Our default configuration strives to be as secure as possible. Because of that, KEDA will run as non-root and be secure-by-default: + ```yaml securityContext: operator: @@ -345,7 +349,6 @@ Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/ [Affinity]: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/ [Deployment upgrade strategy]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy -[GCP Workload Identity]: https://keda.sh/docs/2.10/authentication-providers/gcp-workload-identity/ [Pod Disruption Budget]: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ [Pod security context]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ [Security context]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container diff --git a/keda/templates/cert-manager/keda-issuer.yaml b/keda/templates/cert-manager/keda-issuer.yaml index bba6ef55..1f3d28d4 100644 --- a/keda/templates/cert-manager/keda-issuer.yaml +++ b/keda/templates/cert-manager/keda-issuer.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateIssuer }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.issuer.generate }} apiVersion: cert-manager.io/v1 kind: Issuer metadata: diff --git a/keda/templates/cert-manager/keda-tls-certificate.yaml b/keda/templates/cert-manager/keda-tls-certificate.yaml index 9f4d8ee3..8b74bc11 100644 --- a/keda/templates/cert-manager/keda-tls-certificate.yaml +++ b/keda/templates/cert-manager/keda-tls-certificate.yaml @@ -28,7 +28,7 @@ spec: duration: {{ .Values.certificates.certManager.duration }} renewBefore: {{ .Values.certificates.certManager.renewBefore }} issuerRef: - {{- if .Values.certificates.certManager.generateIssuer }} + {{- if .Values.certificates.certManager.issuer.generate }} name: {{ .Values.operator.name }}-issuer kind: Issuer group: cert-manager.io diff --git a/keda/templates/cert-manager/self-ca.yaml b/keda/templates/cert-manager/self-ca.yaml index ab02b1d3..77176c46 100644 --- a/keda/templates/cert-manager/self-ca.yaml +++ b/keda/templates/cert-manager/self-ca.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.generateIssuer }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.issuer.generate }} apiVersion: cert-manager.io/v1 kind: Certificate metadata: diff --git a/keda/templates/cert-manager/self-issuer.yaml b/keda/templates/cert-manager/self-issuer.yaml index 3d8f4c25..55a8b5c1 100644 --- a/keda/templates/cert-manager/self-issuer.yaml +++ b/keda/templates/cert-manager/self-issuer.yaml @@ -1,4 +1,4 @@ -{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.generateIssuer }} +{{- if and .Values.certificates.certManager.enabled .Values.certificates.certManager.generateCA .Values.certificates.certManager.issuer.generate }} apiVersion: cert-manager.io/v1 kind: Issuer metadata: diff --git a/keda/templates/metrics-server/apiservice.yaml b/keda/templates/metrics-server/apiservice.yaml index 9fd00da0..76c2e20a 100644 --- a/keda/templates/metrics-server/apiservice.yaml +++ b/keda/templates/metrics-server/apiservice.yaml @@ -6,7 +6,7 @@ metadata: {{- if .Values.certificates.certManager.enabled }} {{- if .Values.certificates.certManager.generateCA }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca - {{- else if not .Values.certificates.certManager.generateIssuer }} + {{- else if not .Values.certificates.certManager.issuer.generate }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- else }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} diff --git a/keda/templates/webhooks/validatingconfiguration.yaml b/keda/templates/webhooks/validatingconfiguration.yaml index ccf81bcd..8144094e 100644 --- a/keda/templates/webhooks/validatingconfiguration.yaml +++ b/keda/templates/webhooks/validatingconfiguration.yaml @@ -7,7 +7,7 @@ metadata: {{- if .Values.certificates.certManager.enabled }} {{- if .Values.certificates.certManager.generateCA }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca - {{- else if not .Values.certificates.certManager.generateIssuer }} + {{- else if not .Values.certificates.certManager.issuer.generate }} cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- else }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} diff --git a/keda/values.yaml b/keda/values.yaml index 4cea1e7f..a1369ad0 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -668,15 +668,16 @@ certificates: # If generateCA is false, the secret with the CA # has to be annotated with `cert-manager.io/allow-direct-injection: "true"` generateCA: true - # -- Generates an Issuer resource with Cert-manager - generateIssuer: true # -- Reference to custom Issuer. - # If generateIssuer is false, the issuer reference below has to be provided issuer: - {} - # name: foo-org-ca - # kind: ClusterIssuer - # group: cert-manager.io + # -- Generates an Issuer resource with Cert-manager + generate: true + # -- Custom Issuer name. Required when generate: false + name: foo-org-ca + # -- Custom Issuer kind. Required when generate: false + kind: ClusterIssuer + # -- Custom Issuer group. Required when generate: false + group: cert-manager.io # -- Secret name where the CA is stored (generatedby cert-manager or user given) caSecretName: "kedaorg-ca" # -- Add labels/annotations to secrets created by Certificate resources From 4ac1cee3ca72c5b5731724e009f9215ceeb66cd0 Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Mon, 2 Oct 2023 17:26:24 +0300 Subject: [PATCH 05/41] revert(keda): :rewind: Revert unnecessary auto-formatting Signed-off-by: Dmytro Kovalenko --- keda/README.md | 26 +++++++++++++------------- keda/values.yaml | 42 +++++++++++++++--------------------------- 2 files changed, 28 insertions(+), 40 deletions(-) diff --git a/keda/README.md b/keda/README.md index 2cc234e1..1eb44781 100644 --- a/keda/README.md +++ b/keda/README.md @@ -35,8 +35,8 @@ As part of that, it will install all the required Custom Resource Definitions (C To install the chart with the release name `keda`: ```console -kubectl create namespace keda -helm install keda kedacore/keda --namespace keda --version 2.12.0 +$ kubectl create namespace keda +$ helm install keda kedacore/keda --namespace keda --version 2.12.0 ``` ## Uninstalling the Chart @@ -95,16 +95,16 @@ their default values. | `podIdentity.aws.irsa.stsRegionalEndpoints` | string | `"true"` | Sets the use of an STS regional endpoint instead of global. Recommended to use regional endpoint in almost all cases. This will be set as an annotation on the KEDA service account. | | `podIdentity.aws.irsa.tokenExpiration` | int | `86400` | Set to the value of the service account token expiration duration. This will be set as an annotation on the KEDA service account. | | `podIdentity.azureWorkload.clientId` | string | `""` | Id of Azure Active Directory Client to use for authentication with Azure Workload Identity. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | -| `podIdentity.azureWorkload.enabled` | bool | `false` | Set to true to enable Azure Workload Identity usage. See This will be set as a label on the KEDA service account. | +| `podIdentity.azureWorkload.enabled` | bool | `false` | Set to true to enable Azure Workload Identity usage. See https://keda.sh/docs/concepts/authentication/#azure-workload-identity This will be set as a label on the KEDA service account. | | `podIdentity.azureWorkload.tenantId` | string | `""` | Id Azure Active Directory Tenant to use for authentication with for Azure Workload Identity. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | | `podIdentity.azureWorkload.tokenExpiration` | int | `3600` | Duration in seconds to automatically expire tokens for the service account. ([docs](https://keda.sh/docs/concepts/authentication/#azure-workload-identity)) | -| `podIdentity.gcp.enabled` | bool | `false` | Set to true to enable GCP Workload Identity. See This will be set as a annotation on the KEDA service account. | +| `podIdentity.gcp.enabled` | bool | `false` | Set to true to enable GCP Workload Identity. See https://keda.sh/docs/2.10/authentication-providers/gcp-workload-identity/ This will be set as a annotation on the KEDA service account. | | `podIdentity.gcp.gcpIAMServiceAccount` | string | `""` | GCP IAM Service Account Email which you would like to use for workload identity. | -| `podSecurityContext` | object | [See below](#keda-is-secure-by-default) | [Pod security context] for all pods | +| `podSecurityContext` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] for all pods | | `priorityClassName` | string | `""` | priorityClassName for all KEDA components | | `rbac.aggregateToDefaultRoles` | bool | `false` | Specifies whether RBAC for CRDs should be [aggregated](https://kubernetes.io/docs/reference/access-authn-authz/rbac/#aggregated-clusterroles) to default roles (view, edit, admin) | | `rbac.create` | bool | `true` | Specifies whether RBAC should be used | -| `securityContext` | object | [See below](#keda-is-secure-by-default) | [Security context] for all containers | +| `securityContext` | object | [See below](#KEDA-is-secure-by-default) | [Security context] for all containers | | `serviceAccount.annotations` | object | `{}` | Annotations to add to the service account | | `serviceAccount.automountServiceAccountToken` | bool | `true` | Specifies whether a service account should automount API-Credentials | | `serviceAccount.create` | bool | `true` | Specifies whether a service account should be created | @@ -132,9 +132,9 @@ their default values. | `podAnnotations.keda` | object | `{}` | Pod annotations for KEDA operator | | `podDisruptionBudget.operator` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.keda` | object | `{}` | Pod labels for KEDA operator | -| `podSecurityContext.operator` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA operator pod | +| `podSecurityContext.operator` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA operator pod | | `resources.operator` | object | `{"limits":{"cpu":1,"memory":"1000Mi"},"requests":{"cpu":"100m","memory":"100Mi"}}` | Manage [resource request & limits] of KEDA operator pod | -| `securityContext.operator` | object | [See below](#keda-is-secure-by-default) | [Security context] of the operator container | +| `securityContext.operator` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the operator container | | `topologySpreadConstraints.operator` | list | `[]` | [Pod Topology Constraints] of KEDA operator pod | | `upgradeStrategy.operator` | object | `{}` | Capability to configure [Deployment upgrade strategy] for operator | | `volumes.keda.extraVolumeMounts` | list | `[]` | Extra volume mounts for KEDA deployment | @@ -159,9 +159,9 @@ their default values. | `podAnnotations.metricsAdapter` | object | `{}` | Pod annotations for KEDA Metrics Adapter | | `podDisruptionBudget.metricServer` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.metricsAdapter` | object | `{}` | Pod labels for KEDA Metrics Adapter | -| `podSecurityContext.metricServer` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA metrics apiserver pod | +| `podSecurityContext.metricServer` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA metrics apiserver pod | | `resources.metricServer` | object | `{"limits":{"cpu":1,"memory":"1000Mi"},"requests":{"cpu":"100m","memory":"100Mi"}}` | Manage [resource request & limits] of KEDA metrics apiserver pod | -| `securityContext.metricServer` | object | [See below](#keda-is-secure-by-default) | [Security context] of the metricServer container | +| `securityContext.metricServer` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the metricServer container | | `service.annotations` | object | `{}` | Annotations to add the KEDA Metric Server service | | `service.portHttps` | int | `443` | HTTPS port for KEDA Metric Server service | | `service.portHttpsTarget` | int | `6443` | HTTPS port for KEDA Metric Server container | @@ -250,7 +250,7 @@ their default values. | `podAnnotations.webhooks` | object | `{}` | Pod annotations for KEDA Admission webhooks | | `podDisruptionBudget.webhooks` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.webhooks` | object | `{}` | Pod labels for KEDA Admission webhooks | -| `podSecurityContext.webhooks` | object | [See below](#keda-is-secure-by-default) | [Pod security context] of the KEDA admission webhooks | +| `podSecurityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA admission webhooks | | `prometheus.webhooks.enabled` | bool | `false` | Enable KEDA admission webhooks prometheus metrics expose | | `prometheus.webhooks.port` | int | `8080` | Port used for exposing KEDA admission webhooks prometheus metrics | | `prometheus.webhooks.prometheusRules.additionalLabels` | object | `{}` | Additional labels to add for KEDA admission webhooks using prometheusRules crd (prometheus operator) | @@ -269,7 +269,7 @@ their default values. | `prometheus.webhooks.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.webhooks.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | | `resources.webhooks` | object | `{"limits":{"cpu":"50m","memory":"100Mi"},"requests":{"cpu":"10m","memory":"10Mi"}}` | Manage [resource request & limits] of KEDA admission webhooks pod | -| `securityContext.webhooks` | object | [See below](#keda-is-secure-by-default) | [Security context] of the admission webhooks container | +| `securityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the admission webhooks container | | `topologySpreadConstraints.webhooks` | list | `[]` | [Pod Topology Constraints] of KEDA admission webhooks pod | | `upgradeStrategy.webhooks` | object | `{}` | Capability to configure [Deployment upgrade strategy] for Admission webhooks | | `volumes.webhooks.extraVolumeMounts` | list | `[]` | Extra volume mounts for admission webhooks deployment | @@ -306,7 +306,6 @@ helm install keda kedacore/keda --namespace keda -f values.yaml ## KEDA is secure by default Our default configuration strives to be as secure as possible. Because of that, KEDA will run as non-root and be secure-by-default: - ```yaml securityContext: operator: @@ -349,6 +348,7 @@ Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/ [Affinity]: https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/ [Deployment upgrade strategy]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy +[GCP Workload Identity]: https://keda.sh/docs/2.10/authentication-providers/gcp-workload-identity/ [Pod Disruption Budget]: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ [Pod security context]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/ [Security context]: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container diff --git a/keda/values.yaml b/keda/values.yaml index a1369ad0..26fc3924 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -45,8 +45,7 @@ operator: # Learn more in [our documentation](https://keda.sh/docs/latest/operate/cluster/#high-availability). replicaCount: 1 # -- [Affinity] for pod scheduling for KEDA operator. Takes precedence over the `affinity` field - affinity: - {} + affinity: {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -85,8 +84,7 @@ metricsServer: # -- Enable metric server to use host network useHostNetwork: false # -- [Affinity] for pod scheduling for Metrics API Server. Takes precedence over the `affinity` field - affinity: - {} + affinity: {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -141,8 +139,7 @@ webhooks: # -- Capability to configure the number of replicas for KEDA admission webhooks replicaCount: 1 # -- [Affinity] for pod scheduling for KEDA admission webhooks. Takes precedence over the `affinity` field - affinity: - {} + affinity: {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -158,24 +155,21 @@ webhooks: upgradeStrategy: # -- Capability to configure [Deployment upgrade strategy] for operator - operator: - {} + operator: {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 # maxSurge: 1 # -- Capability to configure [Deployment upgrade strategy] for Metrics Api Server - metricsApiServer: - {} + metricsApiServer: {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 # maxSurge: 1 # -- Capability to configure [Deployment upgrade strategy] for Admission webhooks - webhooks: - {} + webhooks: {} # type: RollingUpdate # rollingUpdate: # maxUnavailable: 1 @@ -183,20 +177,17 @@ upgradeStrategy: podDisruptionBudget: # -- Capability to configure [Pod Disruption Budget] - operator: - {} + operator: {} # minAvailable: 1 # maxUnavailable: 1 # -- Capability to configure [Pod Disruption Budget] - metricServer: - {} + metricServer: {} # minAvailable: 1 # maxUnavailable: 1 # -- Capability to configure [Pod Disruption Budget] - webhooks: - {} + webhooks: {} # minAvailable: 1 # maxUnavailable: 1 @@ -334,7 +325,7 @@ securityContext: operator: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -344,7 +335,7 @@ securityContext: metricServer: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -354,7 +345,7 @@ securityContext: webhooks: capabilities: drop: - - ALL + - ALL allowPrivilegeEscalation: false readOnlyRootFilesystem: true seccompProfile: @@ -441,8 +432,7 @@ topologySpreadConstraints: webhooks: [] # -- [Affinity] for pod scheduling for both KEDA operator and Metrics API Server -affinity: - {} +affinity: {} # podAntiAffinity: # requiredDuringSchedulingIgnoredDuringExecution: # - labelSelector: @@ -682,8 +672,7 @@ certificates: caSecretName: "kedaorg-ca" # -- Add labels/annotations to secrets created by Certificate resources # [docs](https://cert-manager.io/docs/usage/certificate/#creating-certificate-resources) - secretTemplate: - {} + secretTemplate: {} # annotations: # my-secret-annotation-1: "foo" # my-secret-annotation-2: "bar" @@ -701,8 +690,7 @@ permissions: secret: false # -- Array of extra K8s manifests to deploy -extraObjects: - [] +extraObjects: [] # - apiVersion: keda.sh/v1alpha1 # kind: ClusterTriggerAuthentication # metadata: From 8460158279d667e2223664aac9f91746ca123bce Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Tue, 3 Oct 2023 13:20:58 +0200 Subject: [PATCH 06/41] chore: Improve the CI on PRs to be more efficient (#540) Signed-off-by: Jorge Turrado Signed-off-by: Jorge Turrado Signed-off-by: Dmytro Kovalenko --- .github/workflows/ci-core.yml | 11 +++++++---- .../ci-external-scaler-azure-cosmos-db.yml | 18 +++++------------- .github/workflows/ci-http-add-on.yml | 4 ++++ 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index d3d5d9a7..a61cb5f8 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -16,6 +16,10 @@ on: - '.github/workflows/ci-core.yml' - 'keda/**' +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: lint-helm-3-x: name: Lint Helm Chart @@ -38,7 +42,7 @@ jobs: fail-fast: false matrix: enableAzureWorkloadIdentity: [false, true] - kubernetesVersion: [v1.28, v1.27, v1.26, v1.25] + kubernetesVersion: [v1.28, v1.27, v1.26, v1.23] namespace: ["keda", "not-keda"] enableCertManager: [false, true] include: @@ -57,9 +61,8 @@ jobs: kindImage: kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72 - kubernetesVersion: v1.26 kindImage: kindest/node:v1.26.6@sha256:6e2d8b28a5b601defe327b98bd1c2d1930b49e5d8c512e1895099e4504007adb - - kubernetesVersion: v1.25 - kindImage: kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8 - + - kubernetesVersion: v1.23 + kindImage: kindest/node:v1.23.17@sha256:59c989ff8a517a93127d4a536e7014d28e235fb3529d9fba91b3951d461edfdb steps: - name: Check out code uses: actions/checkout@v2 diff --git a/.github/workflows/ci-external-scaler-azure-cosmos-db.yml b/.github/workflows/ci-external-scaler-azure-cosmos-db.yml index abfc7d07..e908149c 100644 --- a/.github/workflows/ci-external-scaler-azure-cosmos-db.yml +++ b/.github/workflows/ci-external-scaler-azure-cosmos-db.yml @@ -14,6 +14,10 @@ on: - .github/workflows/ci-external-scaler-azure-cosmos-db.yml - external-scaler-azure-cosmos-db/** +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: lint-helm-3-x: name: Lint Helm Chart @@ -35,26 +39,14 @@ jobs: strategy: fail-fast: false matrix: - kubernetesVersion: [v1.24, v1.23, v1.22, v1.21, v1.20, v1.19, v1.18, v1.17] + kubernetesVersion: [v1.24, v1.19] include: # Images are defined on every Kind release # See https://github.com/kubernetes-sigs/kind/releases - kubernetesVersion: v1.24 kindImage: kindest/node:v1.24.0@sha256:406fd86d48eaf4c04c7280cd1d2ca1d61e7d0d61ddef0125cb097bc7b82ed6a1 - - kubernetesVersion: v1.23 - kindImage: kindest/node:v1.23.6@sha256:1af0f1bee4c3c0fe9b07de5e5d3fafeb2eec7b4e1b268ae89fcab96ec67e8355 - - kubernetesVersion: v1.22 - kindImage: kindest/node:v1.22.9@sha256:6e57a6b0c493c7d7183a1151acff0bfa44bf37eb668826bf00da5637c55b6d5e - - kubernetesVersion: v1.21 - kindImage: kindest/node:v1.21.12@sha256:ae05d44cc636ee961068399ea5123ae421790f472c309900c151a44ee35c3e3e - - kubernetesVersion: v1.20 - kindImage: kindest/node:v1.20.15@sha256:a6ce604504db064c5e25921c6c0fffea64507109a1f2a512b1b562ac37d652f3 - kubernetesVersion: v1.19 kindImage: kindest/node:v1.19.16@sha256:dec41184d10deca01a08ea548197b77dc99eeacb56ff3e371af3193c86ca99f4 - - kubernetesVersion: v1.18 - kindImage: kindest/node:v1.18.20@sha256:38a8726ece5d7867fb0ede63d718d27ce2d41af519ce68be5ae7fcca563537ed - - kubernetesVersion: v1.17 - kindImage: kindest/node:v1.17.17@sha256:66f1d0d91a88b8a001811e2f1054af60eef3b669a9a74f9b6db871f2f1eeed00 steps: - name: Check out code uses: actions/checkout@v2 diff --git a/.github/workflows/ci-http-add-on.yml b/.github/workflows/ci-http-add-on.yml index be5a2d89..d0a9247e 100644 --- a/.github/workflows/ci-http-add-on.yml +++ b/.github/workflows/ci-http-add-on.yml @@ -15,6 +15,10 @@ on: - '.github/workflows/ci-http-add-on.yml' - 'http-add-on/**' +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + jobs: lint-helm-3-x: name: Lint Helm Chart From 09ebb19d891915b36da51b2d8badbd8191eccd72 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Wed, 4 Oct 2023 12:37:48 +0200 Subject: [PATCH 07/41] fix(http-add-on): Refactor the chart for next version (#523) Signed-off-by: Dmytro Kovalenko --- .github/workflows/ci-http-add-on.yml | 163 ++++++++++-------- http-add-on/README.md | 4 +- http-add-on/templates/_helpers.tpl | 7 +- .../deployment.yaml} | 29 +--- .../rbac.yml} | 9 +- .../scaledobject.yaml} | 4 +- .../templates/interceptor/service-admin.yaml | 15 ++ .../templates/interceptor/service-proxy.yaml | 15 ++ .../templates/interceptor/serviceaccount.yaml | 8 + .../deployment.yaml} | 46 ++--- .../{rbac-operator.yml => operator/rbac.yml} | 19 +- http-add-on/templates/operator/service.yaml | 16 ++ .../templates/operator/serviceaccount.yaml | 8 + .../templates/rbac-aggregateclusterroles.yaml | 14 +- .../deployment.yaml} | 33 +--- .../{rbac-scaler.yml => scaler/rbac.yml} | 9 +- http-add-on/templates/scaler/service.yaml | 19 ++ .../templates/scaler/serviceaccount.yaml | 8 + .../templates/serviceaccount-interceptor.yaml | 18 -- .../templates/serviceaccount-operator.yaml | 16 -- .../templates/serviceaccount-scaler.yaml | 18 -- .../templates/svc-interceptor-admin.yaml | 25 --- .../templates/svc-interceptor-proxy.yaml | 25 --- .../templates/svc-operator-metrics.yaml | 20 --- http-add-on/templates/svc-scaler.yaml | 28 --- http-add-on/values.yaml | 12 +- 26 files changed, 237 insertions(+), 351 deletions(-) rename http-add-on/templates/{deployment-interceptor.yaml => interceptor/deployment.yaml} (67%) rename http-add-on/templates/{rbac-interceptor.yml => interceptor/rbac.yml} (70%) rename http-add-on/templates/{scaledobject-interceptor.yaml => interceptor/scaledobject.yaml} (82%) create mode 100644 http-add-on/templates/interceptor/service-admin.yaml create mode 100644 http-add-on/templates/interceptor/service-proxy.yaml create mode 100644 http-add-on/templates/interceptor/serviceaccount.yaml rename http-add-on/templates/{deployment-operator.yaml => operator/deployment.yaml} (59%) rename http-add-on/templates/{rbac-operator.yml => operator/rbac.yml} (86%) create mode 100644 http-add-on/templates/operator/service.yaml create mode 100644 http-add-on/templates/operator/serviceaccount.yaml rename http-add-on/templates/{deployment-scaler.yaml => scaler/deployment.yaml} (56%) rename http-add-on/templates/{rbac-scaler.yml => scaler/rbac.yml} (72%) create mode 100644 http-add-on/templates/scaler/service.yaml create mode 100644 http-add-on/templates/scaler/serviceaccount.yaml delete mode 100644 http-add-on/templates/serviceaccount-interceptor.yaml delete mode 100644 http-add-on/templates/serviceaccount-operator.yaml delete mode 100644 http-add-on/templates/serviceaccount-scaler.yaml delete mode 100644 http-add-on/templates/svc-interceptor-admin.yaml delete mode 100644 http-add-on/templates/svc-interceptor-proxy.yaml delete mode 100644 http-add-on/templates/svc-operator-metrics.yaml delete mode 100644 http-add-on/templates/svc-scaler.yaml diff --git a/.github/workflows/ci-http-add-on.yml b/.github/workflows/ci-http-add-on.yml index d0a9247e..6fa77966 100644 --- a/.github/workflows/ci-http-add-on.yml +++ b/.github/workflows/ci-http-add-on.yml @@ -6,14 +6,14 @@ on: branches: - main paths: - - '.github/workflows/ci-http-add-on.yml' - - 'http-add-on/**' + - ".github/workflows/ci-http-add-on.yml" + - "http-add-on/**" pull_request: branches: - main paths: - - '.github/workflows/ci-http-add-on.yml' - - 'http-add-on/**' + - ".github/workflows/ci-http-add-on.yml" + - "http-add-on/**" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} @@ -24,14 +24,14 @@ jobs: name: Lint Helm Chart runs-on: ubuntu-latest steps: - - name: Check out code - uses: actions/checkout@v2 + - name: Check out code + uses: actions/checkout@v2 - - name: Helm install - uses: Azure/setup-helm@v3 + - name: Helm install + uses: Azure/setup-helm@v3 - - name: Lint 'http-add-on' Helm chart - run: helm lint http-add-on + - name: Lint 'http-add-on' Helm chart + run: helm lint http-add-on deploy-helm-3-x: name: Deploy to Kubernetes ${{ matrix.kubernetesVersion }} @@ -42,62 +42,89 @@ jobs: matrix: kubernetesVersion: [v1.28, v1.27, v1.26, v1.25] include: - - kubernetesVersion: v1.28 - kindImage: kindest/node:v1.28.0@sha256:b7a4cad12c197af3ba43202d3efe03246b3f0793f162afb40a33c923952d5b31 - - kubernetesVersion: v1.27 - kindImage: kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72 - - kubernetesVersion: v1.26 - kindImage: kindest/node:v1.26.6@sha256:6e2d8b28a5b601defe327b98bd1c2d1930b49e5d8c512e1895099e4504007adb - - kubernetesVersion: v1.25 - kindImage: kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8 + - kubernetesVersion: v1.28 + kindImage: kindest/node:v1.28.0@sha256:b7a4cad12c197af3ba43202d3efe03246b3f0793f162afb40a33c923952d5b31 + - kubernetesVersion: v1.27 + kindImage: kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72 + - kubernetesVersion: v1.26 + kindImage: kindest/node:v1.26.6@sha256:6e2d8b28a5b601defe327b98bd1c2d1930b49e5d8c512e1895099e4504007adb + - kubernetesVersion: v1.25 + kindImage: kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8 steps: - - name: Check out code - uses: actions/checkout@v2 - - - name: Helm install - uses: Azure/setup-helm@v3 - - - name: Create k8s ${{ matrix.kubernetesVersion }} Kind Cluster - uses: helm/kind-action@main - with: - node_image: ${{ matrix.kindImage }} - - - name: Show Kubernetes version - run: | - kubectl version - - - name: Show Kubernetes nodes - run: | - kubectl get nodes -o wide - - - name: Show Helm version - run: | - helm version - - - name: Create KEDA namespace - run: kubectl create ns keda - - - name: Install KEDA chart - run: helm install keda ./keda/ --namespace keda - - - name: Template Helm chart - run: helm template http-add-on ./http-add-on/ --namespace keda - - - name: Install Helm chart - run: helm install http-add-on ./http-add-on/ --namespace keda - - - name: Show Kubernetes resources - run: kubectl get all --namespace keda - if: always() - - - name: Get all HTTPScaledObjects - run: kubectl get httpscaledobjects - - - name: Get all CRDs - run: kubectl get crds - - - name: Get HTTPScaledObject CRD - run: kubectl get crds/httpscaledobjects.http.keda.sh - - - name: Describe HTTPScaledObject CRD - run: kubectl describe crds/httpscaledobjects.http.keda.sh + - name: Check out code + uses: actions/checkout@v2 + + - name: Helm install + uses: Azure/setup-helm@v3 + + - name: Create k8s ${{ matrix.kubernetesVersion }} Kind Cluster + uses: helm/kind-action@main + with: + node_image: ${{ matrix.kindImage }} + + - name: Show Kubernetes version + run: | + kubectl version + + - name: Show Kubernetes nodes + run: | + kubectl get nodes -o wide + + - name: Show Helm version + run: | + helm version + + - name: Create KEDA namespace + run: kubectl create ns keda + + - name: Install KEDA chart + run: helm install keda ./keda/ --namespace keda + + - name: Generate values + run: | + cat < test-values.yaml + additionalLabels: + random: value + images: + tag: canary + rbac: + aggregateToDefaultRoles: true + interceptor: + replicas: + min: 1 + EOF + + - name: Template Helm chart + run: helm template http-add-on ./http-add-on/ --namespace keda --values test-values.yaml + + - name: Install Helm chart + run: helm install http-add-on ./http-add-on/ --namespace keda --values test-values.yaml --wait + + - name: Show Kubernetes resources + run: kubectl get all --namespace keda + if: always() + + - name: Get all HTTPScaledObjects + run: kubectl get httpscaledobjects + + - name: Get all CRDs + run: kubectl get crds + + - name: Get HTTPScaledObject CRD + run: kubectl get crds/httpscaledobjects.http.keda.sh + + - name: Describe HTTPScaledObject CRD + run: kubectl describe crds/httpscaledobjects.http.keda.sh + + - name: Validate Interceptor ScaledObject + run: | + for N in {1..3} + do + READY=$(kubectl get so/keda-add-ons-http-interceptor -n keda -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}') + echo "ScaledObjet is ready: $READY" + if [[ "$READY" == "True" ]]; then + exit 0 + fi + sleep 15s + done + exit 1 diff --git a/http-add-on/README.md b/http-add-on/README.md index 82490c0d..be51daf2 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -84,7 +84,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| -| `additionalLabels` | string | `""` | Additional labels to be applied to installed resources. Note that not all resources will receive these labels. | +| `additionalLabels` | object | `{}` | Additional labels to be applied to installed resources. Note that not all resources will receive these labels. | | `crds.install` | bool | `true` | Whether to install the `HTTPScaledObject` [`CustomResourceDefinition`](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) | | `images.interceptor` | string | `"ghcr.io/kedacore/http-add-on-interceptor"` | Image name for the interceptor image component | | `images.kubeRbacProxy.name` | string | `"gcr.io/kubebuilder/kube-rbac-proxy"` | Image name for the Kube RBAC Proxy image component | @@ -98,8 +98,6 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| -| `operator.adminPort` | int | `9090` | The port for the operator's admin server to run on | -| `operator.adminService` | string | `"operator-admin"` | The name of the [`Service`](https://kubernetes.io/docs/concepts/services-networking/service/) for the operator's admin server | | `operator.affinity` | object | `{}` | Affinity for pod scheduling ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/)) | | `operator.imagePullSecrets` | list | `[]` | The image pull secrets for the operator component | | `operator.nodeSelector` | object | `{}` | Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) | diff --git a/http-add-on/templates/_helpers.tpl b/http-add-on/templates/_helpers.tpl index c0255e47..df9291d8 100644 --- a/http-add-on/templates/_helpers.tpl +++ b/http-add-on/templates/_helpers.tpl @@ -3,16 +3,15 @@ {{/* Create chart name and version as used by the chart label. */}} -{{- define "keda-addons-http.chart" -}} +{{- define "keda-http-add-on.chart" -}} {{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} {{- end -}} {{/* Generate basic labels */}} -{{- define "keda-addons-http.labels" }} -helm.sh/chart: {{ include "keda-addons-http.chart" . }} -app.kubernetes.io/component: controller-manager +{{- define "keda-http-add-on.labels" }} +helm.sh/chart: {{ include "keda-http-add-on.chart" . }} app.kubernetes.io/part-of: {{ .Chart.Name }} app.kubernetes.io/managed-by: {{ .Release.Service }} app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/http-add-on/templates/deployment-interceptor.yaml b/http-add-on/templates/interceptor/deployment.yaml similarity index 67% rename from http-add-on/templates/deployment-interceptor.yaml rename to http-add-on/templates/interceptor/deployment.yaml index d0a72a39..f8176391 100644 --- a/http-add-on/templates/deployment-interceptor.yaml +++ b/http-add-on/templates/interceptor/deployment.yaml @@ -2,42 +2,21 @@ apiVersion: apps/v1 kind: Deployment metadata: labels: - control-plane: interceptor - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} app.kubernetes.io/component: interceptor - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{ tpl .Values.additionalLabels . | indent 4}} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-interceptor namespace: {{ .Release.Namespace }} spec: replicas: {{ .Values.interceptor.replicas.min }} selector: matchLabels: - control-plane: interceptor - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} + app.kubernetes.io/component: interceptor + {{- include "keda-http-add-on.labels" . | indent 6 }} template: metadata: labels: - control-plane: interceptor - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} app.kubernetes.io/component: interceptor - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - {{ tpl .Values.additionalLabels . | indent 4}} + {{- include "keda-http-add-on.labels" . | indent 8 }} spec: imagePullSecrets: {{- toYaml .Values.interceptor.imagePullSecrets | nindent 8 }} diff --git a/http-add-on/templates/rbac-interceptor.yml b/http-add-on/templates/interceptor/rbac.yml similarity index 70% rename from http-add-on/templates/rbac-interceptor.yml rename to http-add-on/templates/interceptor/rbac.yml index 60111f45..4bf400ea 100644 --- a/http-add-on/templates/rbac-interceptor.yml +++ b/http-add-on/templates/interceptor/rbac.yml @@ -2,12 +2,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-interceptor rules: - apiGroups: @@ -36,7 +31,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-interceptor app.kubernetes.io/name: {{ .Chart.Name }}-interceptor - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-interceptor roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/http-add-on/templates/scaledobject-interceptor.yaml b/http-add-on/templates/interceptor/scaledobject.yaml similarity index 82% rename from http-add-on/templates/scaledobject-interceptor.yaml rename to http-add-on/templates/interceptor/scaledobject.yaml index bcdc7738..a8c420ac 100644 --- a/http-add-on/templates/scaledobject-interceptor.yaml +++ b/http-add-on/templates/interceptor/scaledobject.yaml @@ -4,6 +4,8 @@ kind: ScaledObject metadata: name: "{{ .Chart.Name }}-interceptor" namespace: {{ .Release.Namespace }} + labels: + {{- include "keda-http-add-on.labels" . | indent 4 }} spec: minReplicaCount: {{ .Values.interceptor.replicas.min }} maxReplicaCount: {{ .Values.interceptor.replicas.max }} @@ -14,5 +16,5 @@ spec: triggers: - type: external metadata: - scalerAddress: "{{ .Chart.Name }}-{{ .Values.scaler.service }}:{{ default 9091 .Values.scaler.grpcPort }}" + scalerAddress: "{{ .Chart.Name }}-{{ .Values.scaler.service }}.{{ .Release.Namespace }}:{{ default 9091 .Values.scaler.grpcPort }}" interceptorTargetPendingRequests: "{{ default 200 .Values.scaler.pendingRequestsInterceptor }}" diff --git a/http-add-on/templates/interceptor/service-admin.yaml b/http-add-on/templates/interceptor/service-admin.yaml new file mode 100644 index 00000000..87af6aeb --- /dev/null +++ b/http-add-on/templates/interceptor/service-admin.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: interceptor-admin + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: "{{ .Chart.Name }}-{{ .Values.interceptor.admin.service }}" + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: https + port: {{ default 9091 .Values.interceptor.admin.port }} + targetPort: inter-admin + selector: + app.kubernetes.io/component: interceptor diff --git a/http-add-on/templates/interceptor/service-proxy.yaml b/http-add-on/templates/interceptor/service-proxy.yaml new file mode 100644 index 00000000..7214c531 --- /dev/null +++ b/http-add-on/templates/interceptor/service-proxy.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: interceptor-proxy + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: "{{ .Chart.Name }}-{{ .Values.interceptor.proxy.service }}" + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: http + port: {{ default 9091 .Values.interceptor.proxy.port }} + targetPort: inter-proxy + selector: + app.kubernetes.io/component: interceptor diff --git a/http-add-on/templates/interceptor/serviceaccount.yaml b/http-add-on/templates/interceptor/serviceaccount.yaml new file mode 100644 index 00000000..5a059875 --- /dev/null +++ b/http-add-on/templates/interceptor/serviceaccount.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: interceptor + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: {{ .Chart.Name }}-interceptor + namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/deployment-operator.yaml b/http-add-on/templates/operator/deployment.yaml similarity index 59% rename from http-add-on/templates/deployment-operator.yaml rename to http-add-on/templates/operator/deployment.yaml index d8a2208b..60a21cda 100644 --- a/http-add-on/templates/deployment-operator.yaml +++ b/http-add-on/templates/operator/deployment.yaml @@ -2,32 +2,21 @@ apiVersion: apps/v1 kind: Deployment metadata: labels: - control-plane: controller-manager - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-controller-manager - app.kubernetes.io/name: {{ .Chart.Name }}-controller-manager - {{- include "keda-addons-http.labels" . | indent 4 }} + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-controller-manager namespace: {{ .Release.Namespace }} spec: replicas: 1 selector: matchLabels: - control-plane: controller-manager - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 6 }} template: metadata: labels: - control-plane: controller-manager - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-controller-manager - app.kubernetes.io/name: {{ .Chart.Name }}-controller-manager - {{- include "keda-addons-http.labels" . | indent 8 }} + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 8 }} spec: imagePullSecrets: {{- toYaml .Values.operator.imagePullSecrets | nindent 8 }} @@ -50,28 +39,31 @@ spec: - args: - --metrics-bind-address=127.0.0.1:8080 - --leader-elect - - --admin-port={{ .Values.operator.adminPort }} image: "{{ .Values.images.operator }}:{{ .Values.images.tag | default .Chart.AppVersion }}" imagePullPolicy: '{{ .Values.operator.pullPolicy | default "Always" }}' name: "{{ .Chart.Name }}-operator" env: - - name: KEDAHTTP_INTERCEPTOR_SERVICE - value: "{{.Chart.Name}}-{{ .Values.interceptor.admin.service }}" - name: KEDAHTTP_OPERATOR_EXTERNAL_SCALER_SERVICE value: "{{ .Chart.Name }}-{{ .Values.scaler.service }}" - name: KEDAHTTP_OPERATOR_EXTERNAL_SCALER_PORT value: "{{ default 9090 .Values.scaler.grpcPort }}" - - name: KEDAHTTP_INTERCEPTOR_ADMIN_PORT - value: "{{ .Values.interceptor.admin.port }}" - - name: KEDAHTTP_INTERCEPTOR_PROXY_PORT - value: "{{ .Values.interceptor.proxy.port }}" - name: KEDA_HTTP_OPERATOR_NAMESPACE value: "{{ .Release.Namespace }}" - name: KEDA_HTTP_OPERATOR_WATCH_NAMESPACE value: "{{ .Values.operator.watchNamespace }}" - ports: - - containerPort: {{ .Values.operator.adminPort }} - name: admin-http + ports: + - name: metrics + containerPort: 8080 + - name: probes + containerPort: 8081 + livenessProbe: + httpGet: + path: /healthz + port: probes + readinessProbe: + httpGet: + path: /readyz + port: probes resources: {{- toYaml .Values.operator.resources | nindent 10 }} terminationGracePeriodSeconds: 10 diff --git a/http-add-on/templates/rbac-operator.yml b/http-add-on/templates/operator/rbac.yml similarity index 86% rename from http-add-on/templates/rbac-operator.yml rename to http-add-on/templates/operator/rbac.yml index c52cfaff..d3e7ccb1 100644 --- a/http-add-on/templates/rbac-operator.yml +++ b/http-add-on/templates/operator/rbac.yml @@ -2,12 +2,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: labels: - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-role - app.kubernetes.io/name: {{ .Chart.Name }}-role - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-role namespace: {{ .Release.Namespace }} rules: @@ -40,7 +35,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-role app.kubernetes.io/name: {{ .Chart.Name }}-role - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-role rules: - apiGroups: @@ -91,7 +86,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-proxy-role app.kubernetes.io/name: {{ .Chart.Name }}-proxy-role - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-proxy-role rules: - apiGroups: ["authentication.k8s.io"] @@ -112,7 +107,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-metrics-reader app.kubernetes.io/name: {{ .Chart.Name }}-metrics-reader - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-metrics-reader rules: - nonResourceURLs: @@ -129,7 +124,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-role-binding app.kubernetes.io/name: {{ .Chart.Name }}-role-binding - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-role-rolebinding namespace: {{ .Release.Namespace }} roleRef: @@ -150,7 +145,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-rolebinding app.kubernetes.io/name: {{ .Chart.Name }}-rolebinding - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io @@ -170,7 +165,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-rolebinding app.kubernetes.io/name: {{ .Chart.Name }}-rolebinding - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-proxy-rolebinding roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/http-add-on/templates/operator/service.yaml b/http-add-on/templates/operator/service.yaml new file mode 100644 index 00000000..506a6541 --- /dev/null +++ b/http-add-on/templates/operator/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: {{ .Chart.Name }}-controller-manager-metrics-service + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: https + port: {{ default 8443 .Values.operator.port }} + targetPort: https + selector: + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/templates/operator/serviceaccount.yaml b/http-add-on/templates/operator/serviceaccount.yaml new file mode 100644 index 00000000..d70b754e --- /dev/null +++ b/http-add-on/templates/operator/serviceaccount.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: operator + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: {{ .Chart.Name }} + namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/rbac-aggregateclusterroles.yaml b/http-add-on/templates/rbac-aggregateclusterroles.yaml index a7503cdc..d366e8a3 100644 --- a/http-add-on/templates/rbac-aggregateclusterroles.yaml +++ b/http-add-on/templates/rbac-aggregateclusterroles.yaml @@ -5,12 +5,7 @@ kind: ClusterRole metadata: name: {{ .Chart.Name }}-edit labels: - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-edit - app.kubernetes.io/name: {{ .Chart.Name }}-edit - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rules: @@ -35,12 +30,7 @@ metadata: rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rbac.authorization.k8s.io/aggregate-to-view: "true" - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-view - app.kubernetes.io/name: {{ .Chart.Name }}-view - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} rules: - apiGroups: - http.keda.sh diff --git a/http-add-on/templates/deployment-scaler.yaml b/http-add-on/templates/scaler/deployment.yaml similarity index 56% rename from http-add-on/templates/deployment-scaler.yaml rename to http-add-on/templates/scaler/deployment.yaml index defffdc3..f19fbf77 100644 --- a/http-add-on/templates/deployment-scaler.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -2,42 +2,21 @@ apiVersion: apps/v1 kind: Deployment metadata: labels: - control-plane: external-scaler - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-external-scaler - app.kubernetes.io/name: {{ .Chart.Name }}-external-scaler - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: external-scaler - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{ tpl .Values.additionalLabels . | indent 4}} + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-external-scaler namespace: {{ .Release.Namespace }} spec: replicas: 1 selector: matchLabels: - control-plane: external-scaler - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 6 }} template: metadata: labels: - control-plane: external-scaler - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: "{{ .Chart.Name }}-external-scaler" - app.kubernetes.io/name: "{{ .Chart.Name }}-external-scaler" - app.kubernetes.io/version: "{{ .Values.images.tag | default .Chart.AppVersion }}" - app.kubernetes.io/component: external-scaler - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - {{ tpl .Values.additionalLabels . | indent 4}} + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 8 }} spec: imagePullSecrets: {{- toYaml .Values.scaler.imagePullSecrets | nindent 8 }} diff --git a/http-add-on/templates/rbac-scaler.yml b/http-add-on/templates/scaler/rbac.yml similarity index 72% rename from http-add-on/templates/rbac-scaler.yml rename to http-add-on/templates/scaler/rbac.yml index c936dc4c..c6e8e064 100644 --- a/http-add-on/templates/rbac-scaler.yml +++ b/http-add-on/templates/scaler/rbac.yml @@ -2,12 +2,7 @@ apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-external-scaler - app.kubernetes.io/name: {{ .Chart.Name }}-external-scaler - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-external-scaler rules: - apiGroups: @@ -44,7 +39,7 @@ metadata: app: {{ .Chart.Name }} name: {{ .Chart.Name }}-external-scaler app.kubernetes.io/name: {{ .Chart.Name }}-external-scaler - {{- include "keda-addons-http.labels" . | indent 4 }} + {{- include "keda-http-add-on.labels" . | indent 4 }} name: {{ .Chart.Name }}-external-scaler roleRef: apiGroup: rbac.authorization.k8s.io diff --git a/http-add-on/templates/scaler/service.yaml b/http-add-on/templates/scaler/service.yaml new file mode 100644 index 00000000..7dcf3afd --- /dev/null +++ b/http-add-on/templates/scaler/service.yaml @@ -0,0 +1,19 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: "{{ .Chart.Name }}-{{ .Values.scaler.service }}" + namespace: {{ .Release.Namespace }} +spec: + ports: + - name: grpc + port: {{ default 9090 .Values.scaler.grpcPort }} + targetPort: scaler-grpc + - name: health + port: {{ default 9091 .Values.scaler.healthPort }} + targetPort: scaler-health + selector: + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/templates/scaler/serviceaccount.yaml b/http-add-on/templates/scaler/serviceaccount.yaml new file mode 100644 index 00000000..9389d0a6 --- /dev/null +++ b/http-add-on/templates/scaler/serviceaccount.yaml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: scaler + {{- include "keda-http-add-on.labels" . | indent 4 }} + name: {{ .Chart.Name }}-external-scaler + namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/serviceaccount-interceptor.yaml b/http-add-on/templates/serviceaccount-interceptor.yaml deleted file mode 100644 index b07d2ebf..00000000 --- a/http-add-on/templates/serviceaccount-interceptor.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - control-plane: interceptor - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: interceptor - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - {{ tpl .Values.additionalLabels . | indent 4}} - name: {{ .Chart.Name }}-interceptor - namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/serviceaccount-operator.yaml b/http-add-on/templates/serviceaccount-operator.yaml deleted file mode 100644 index aa5933b9..00000000 --- a/http-add-on/templates/serviceaccount-operator.yaml +++ /dev/null @@ -1,16 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }} - app.kubernetes.io/name: {{ .Chart.Name }} - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - {{ tpl .Values.additionalLabels . | indent 4}} - name: {{ .Chart.Name }} - namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/serviceaccount-scaler.yaml b/http-add-on/templates/serviceaccount-scaler.yaml deleted file mode 100644 index 1693aa10..00000000 --- a/http-add-on/templates/serviceaccount-scaler.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - control-plane: external-scaler - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-external-scaler - app.kubernetes.io/name: {{ .Chart.Name }}-external-scaler - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: external-scaler - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - {{ tpl .Values.additionalLabels . | indent 4}} - name: {{ .Chart.Name }}-external-scaler - namespace: {{ .Release.Namespace }} diff --git a/http-add-on/templates/svc-interceptor-admin.yaml b/http-add-on/templates/svc-interceptor-admin.yaml deleted file mode 100644 index 0c3ebaa4..00000000 --- a/http-add-on/templates/svc-interceptor-admin.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: interceptor-admin - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: "{{ .Chart.Name }}-{{ .Values.interceptor.admin.service }}" - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor-admin - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: interceptor-admin - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{ tpl .Values.additionalLabels . | indent 4}} - name: "{{ .Chart.Name }}-{{ .Values.interceptor.admin.service }}" - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: https - port: {{ default 9091 .Values.interceptor.admin.port }} - targetPort: inter-admin - selector: - control-plane: interceptor diff --git a/http-add-on/templates/svc-interceptor-proxy.yaml b/http-add-on/templates/svc-interceptor-proxy.yaml deleted file mode 100644 index fbebfabd..00000000 --- a/http-add-on/templates/svc-interceptor-proxy.yaml +++ /dev/null @@ -1,25 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: interceptor-proxy - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: "{{ .Chart.Name }}-{{ .Values.interceptor.proxy.service }}" - app.kubernetes.io/name: {{ .Chart.Name }}-interceptor-proxy - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: interceptor-proxy - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{ tpl .Values.additionalLabels . | indent 4}} - name: "{{ .Chart.Name }}-{{ .Values.interceptor.proxy.service }}" - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: http - port: {{ default 9091 .Values.interceptor.proxy.port }} - targetPort: inter-proxy - selector: - control-plane: interceptor diff --git a/http-add-on/templates/svc-operator-metrics.yaml b/http-add-on/templates/svc-operator-metrics.yaml deleted file mode 100644 index 41ff278f..00000000 --- a/http-add-on/templates/svc-operator-metrics.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: controller-manager - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: {{ .Chart.Name }}-controller-manager-metrics-service - app.kubernetes.io/name: {{ .Chart.Name }}-controller-manager-metrics-service - {{- include "keda-addons-http.labels" . | indent 4 }} - name: {{ .Chart.Name }}-controller-manager-metrics-service - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: https - port: {{ default 8443 .Values.operator.port }} - targetPort: https - selector: - control-plane: controller-manager diff --git a/http-add-on/templates/svc-scaler.yaml b/http-add-on/templates/svc-scaler.yaml deleted file mode 100644 index 6813b5ad..00000000 --- a/http-add-on/templates/svc-scaler.yaml +++ /dev/null @@ -1,28 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - control-plane: external-scaler - httpscaledobjects.http.keda.sh/version: {{ .Values.images.tag | default .Chart.AppVersion }} - keda.sh/addon: {{ .Chart.Name }} - app: {{ .Chart.Name }} - name: "{{ .Chart.Name }}-{{ .Values.scaler.service }}" - app.kubernetes.io/name: {{ .Chart.Name }}-external-scaler-service - app.kubernetes.io/version: {{ .Values.images.tag | default .Chart.AppVersion }} - app.kubernetes.io/component: external-scaler - app.kubernetes.io/part-of: {{ .Chart.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{ tpl .Values.additionalLabels . | indent 4}} - name: "{{ .Chart.Name }}-{{ .Values.scaler.service }}" - namespace: {{ .Release.Namespace }} -spec: - ports: - - name: grpc - port: {{ default 9090 .Values.scaler.grpcPort }} - targetPort: scaler-grpc - - name: health - port: {{ default 9091 .Values.scaler.healthPort }} - targetPort: scaler-health - selector: - control-plane: external-scaler diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index f5c0aba5..23b586e8 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -1,5 +1,5 @@ # -- Additional labels to be applied to installed resources. Note that not all resources will receive these labels. -additionalLabels: "" +additionalLabels: {} crds: # -- Whether to install the `HTTPScaledObject` [`CustomResourceDefinition`](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) @@ -25,10 +25,6 @@ operator: memory: 20Mi # -- The port for the operator main server to run on port: 8443 - # -- The name of the [`Service`](https://kubernetes.io/docs/concepts/services-networking/service/) for the operator's admin server - adminService: operator-admin - # -- The port for the operator's admin server to run on - adminPort: 9090 # -- Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) nodeSelector: {} # -- Tolerations for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)) @@ -91,7 +87,7 @@ interceptor: max: 50 # -- The maximum time the interceptor should wait for an HTTP request to reach a backend before it is considered a failure waitTimeout: 20s - + # configuration for the ScaledObject resource for the # interceptor scaledObject: @@ -136,10 +132,10 @@ interceptor: # configuration for the images to use for each component images: # tag is the image tag to use for all images. - # for example, if the operator image is "myoperator" and + # for example, if the operator image is "myoperator" and # tag is "mytag", the operator image used will be # "myoperator:mytag". `latest` is used to indicate the latest - # stable release in the official images, `canary` is + # stable release in the official images, `canary` is # the build for the latest commit to the `main` branch, # and you can target any other commit with `sha-` # -- Image tag for the http add on. This tag is applied to the images listed in `images.operator`, `images.interceptor`, and `images.scaler`. Optional, given app version of Helm chart is used by default From 5a76c267af01ffd5715aa00995c26ef555a89461 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Thu, 5 Oct 2023 08:46:56 +0200 Subject: [PATCH 08/41] feat(add-on): Supporting streamInterval configuration (#541) Signed-off-by: Dmytro Kovalenko --- http-add-on/README.md | 1 + http-add-on/templates/scaler/deployment.yaml | 2 ++ http-add-on/values.yaml | 2 ++ 3 files changed, 5 insertions(+) diff --git a/http-add-on/README.md b/http-add-on/README.md index be51daf2..0c529aa3 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -124,6 +124,7 @@ their default values. | `scaler.resources.requests.cpu` | string | `"250m"` | | | `scaler.resources.requests.memory` | string | `"20Mi"` | | | `scaler.service` | string | `"external-scaler"` | The name of the Kubernetes `Service` for the scaler component | +| `scaler.streamInterval` | int | `200` | Interval in ms for communicating IsActive to KEDA | | `scaler.tolerations` | list | `[]` | Tolerations for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)) | ### Interceptor diff --git a/http-add-on/templates/scaler/deployment.yaml b/http-add-on/templates/scaler/deployment.yaml index f19fbf77..fd3412cd 100644 --- a/http-add-on/templates/scaler/deployment.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -44,6 +44,8 @@ spec: value: "{{ .Chart.Name }}-{{ .Values.interceptor.admin.service }}" - name: KEDA_HTTP_SCALER_TARGET_ADMIN_PORT value: "{{ default 9091 .Values.interceptor.admin.port }}" + - name: KEDA_HTTP_SCALER_STREAM_INTERVAL_MS + value: "{{ .Values.scaler.streamInterval }}" resources: {{- toYaml .Values.scaler.resources | nindent 10 }} terminationGracePeriodSeconds: 10 diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index 23b586e8..d5619daa 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -45,6 +45,8 @@ scaler: healthPort: 9091 # -- The number of "target requests" that the external scaler will report to KEDA for the interceptor's scaling metrics. See the [KEDA external scaler documentation](https://keda.sh/docs/2.4/concepts/external-scalers/) for details on target requests. pendingRequestsInterceptor: 200 + # -- Interval in ms for communicating IsActive to KEDA + streamInterval: 200 # -- Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) nodeSelector: {} # -- Tolerations for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)) From 18dadc967ef994a25f5b797b18abbc8e0afb8c63 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Thu, 5 Oct 2023 17:30:17 +0200 Subject: [PATCH 09/41] chore(add-on): Ship Release 0.6.0 (#543) Signed-off-by: Dmytro Kovalenko --- docs/index.yaml | 159 ++++++++++-------- docs/keda-add-ons-http-0.6.0.tgz | Bin 0 -> 11137 bytes http-add-on/Chart.yaml | 6 +- .../templates/interceptor/deployment.yaml | 3 +- .../templates/operator/deployment.yaml | 3 +- http-add-on/templates/scaler/deployment.yaml | 3 +- keda/Chart.yaml | 2 +- 7 files changed, 101 insertions(+), 75 deletions(-) create mode 100644 docs/keda-add-ons-http-0.6.0.tgz diff --git a/docs/index.yaml b/docs/index.yaml index f32ddda6..016cd34c 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2023-09-28T22:35:39.1112629+02:00" + created: "2023-10-05T15:23:31.28086+02:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -24,7 +24,7 @@ entries: keda: - apiVersion: v2 appVersion: 2.12.0 - created: "2023-09-28T22:35:39.3560683+02:00" + created: "2023-10-05T15:23:31.340082+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -47,7 +47,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2023-09-28T22:35:39.3560683+02:00" + created: "2023-10-05T15:23:31.336462+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -70,7 +70,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2023-09-28T22:35:39.3459109+02:00" + created: "2023-10-05T15:23:31.333625+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -93,7 +93,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2023-09-28T22:35:39.3359026+02:00" + created: "2023-10-05T15:23:31.331321+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -116,7 +116,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2023-09-28T22:35:39.3293015+02:00" + created: "2023-10-05T15:23:31.328662+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -139,7 +139,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-09-28T22:35:39.3167906+02:00" + created: "2023-10-05T15:23:31.32613+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -162,7 +162,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-09-28T22:35:39.3035227+02:00" + created: "2023-10-05T15:23:31.323816+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -185,7 +185,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2023-09-28T22:35:39.6260642+02:00" + created: "2023-10-05T15:23:31.381934+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -208,7 +208,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-09-28T22:35:39.6158142+02:00" + created: "2023-10-05T15:23:31.380124+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -231,7 +231,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-09-28T22:35:39.6048781+02:00" + created: "2023-10-05T15:23:31.378026+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -254,7 +254,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2023-09-28T22:35:39.5921223+02:00" + created: "2023-10-05T15:23:31.376134+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -277,7 +277,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2023-09-28T22:35:39.5825291+02:00" + created: "2023-10-05T15:23:31.373875+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -300,7 +300,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-09-28T22:35:39.5709888+02:00" + created: "2023-10-05T15:23:31.371829+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -323,7 +323,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-09-28T22:35:39.5588202+02:00" + created: "2023-10-05T15:23:31.369582+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -346,7 +346,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2023-09-28T22:35:39.5453081+02:00" + created: "2023-10-05T15:23:31.367778+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -369,7 +369,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-09-28T22:35:39.5338294+02:00" + created: "2023-10-05T15:23:31.365559+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -392,7 +392,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-09-28T22:35:39.5226481+02:00" + created: "2023-10-05T15:23:31.363775+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -415,7 +415,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-09-28T22:35:39.5084112+02:00" + created: "2023-10-05T15:23:31.361726+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -438,7 +438,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-09-28T22:35:39.5026882+02:00" + created: "2023-10-05T15:23:31.360259+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -461,7 +461,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2023-09-28T22:35:39.4958216+02:00" + created: "2023-10-05T15:23:31.358645+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -484,7 +484,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2023-09-28T22:35:39.4869345+02:00" + created: "2023-10-05T15:23:31.356856+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -506,7 +506,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-09-28T22:35:39.479109+02:00" + created: "2023-10-05T15:23:31.355457+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -528,7 +528,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-09-28T22:35:39.4703916+02:00" + created: "2023-10-05T15:23:31.354054+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -550,7 +550,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-09-28T22:35:39.4603761+02:00" + created: "2023-10-05T15:23:31.352636+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -572,7 +572,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-09-28T22:35:39.4537173+02:00" + created: "2023-10-05T15:23:31.351042+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -592,7 +592,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2023-09-28T22:35:39.4440649+02:00" + created: "2023-10-05T15:23:31.349697+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -612,7 +612,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-09-28T22:35:39.436253+02:00" + created: "2023-10-05T15:23:31.348221+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -632,7 +632,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-09-28T22:35:39.4270591+02:00" + created: "2023-10-05T15:23:31.346437+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -652,7 +652,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-09-28T22:35:39.3976367+02:00" + created: "2023-10-05T15:23:31.344928+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -672,7 +672,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-09-28T22:35:39.3857557+02:00" + created: "2023-10-05T15:23:31.343485+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -692,7 +692,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-09-28T22:35:39.3758098+02:00" + created: "2023-10-05T15:23:31.341673+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -712,7 +712,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-09-28T22:35:39.2910266+02:00" + created: "2023-10-05T15:23:31.321468+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -732,7 +732,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-09-28T22:35:39.2839698+02:00" + created: "2023-10-05T15:23:31.320043+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -752,7 +752,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-09-28T22:35:39.2765907+02:00" + created: "2023-10-05T15:23:31.318518+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -772,7 +772,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-09-28T22:35:39.2677903+02:00" + created: "2023-10-05T15:23:31.316855+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -792,7 +792,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2023-09-28T22:35:39.2524992+02:00" + created: "2023-10-05T15:23:31.315455+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -812,7 +812,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2023-09-28T22:35:39.2524992+02:00" + created: "2023-10-05T15:23:31.314117+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -832,7 +832,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2023-09-28T22:35:39.242479+02:00" + created: "2023-10-05T15:23:31.312271+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -852,7 +852,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2023-09-28T22:35:39.2374056+02:00" + created: "2023-10-05T15:23:31.310913+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -873,7 +873,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2023-09-28T22:35:39.2308683+02:00" + created: "2023-10-05T15:23:31.309603+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -893,7 +893,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-09-28T22:35:39.2235414+02:00" + created: "2023-10-05T15:23:31.307854+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -913,7 +913,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-09-28T22:35:39.2138482+02:00" + created: "2023-10-05T15:23:31.305605+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -933,7 +933,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-09-28T22:35:39.2049698+02:00" + created: "2023-10-05T15:23:31.303379+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -953,7 +953,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2023-09-28T22:35:39.188265+02:00" + created: "2023-10-05T15:23:31.301219+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -973,7 +973,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-09-28T22:35:39.188265+02:00" + created: "2023-10-05T15:23:31.299142+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -993,7 +993,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-09-28T22:35:39.1793522+02:00" + created: "2023-10-05T15:23:31.297472+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1009,7 +1009,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-09-28T22:35:39.1713271+02:00" + created: "2023-10-05T15:23:31.295409+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1025,7 +1025,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-09-28T22:35:39.1629877+02:00" + created: "2023-10-05T15:23:31.29363+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1041,7 +1041,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-09-28T22:35:39.1555761+02:00" + created: "2023-10-05T15:23:31.291594+02:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1057,7 +1057,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-09-28T22:35:39.1464238+02:00" + created: "2023-10-05T15:23:31.289579+02:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1073,7 +1073,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2023-09-28T22:35:39.1386608+02:00" + created: "2023-10-05T15:23:31.287751+02:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1089,7 +1089,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2023-09-28T22:35:39.1282865+02:00" + created: "2023-10-05T15:23:31.285094+02:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1105,7 +1105,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2023-09-28T22:35:39.1198831+02:00" + created: "2023-10-05T15:23:31.283203+02:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1120,9 +1120,32 @@ entries: - https://kedacore.github.io/charts/keda-1.0.0.tgz version: 1.0.0 keda-add-ons-http: + - apiVersion: v2 + appVersion: 0.6.0 + created: "2023-10-05T15:23:31.389125+02:00" + description: Event-based autoscaler for HTTP workloads on Kubernetes + digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 + home: https://github.com/kedacore/http-add-on + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zbynek@kedify.io + name: Zbynek Roubalik + name: keda-add-ons-http + sources: + - https://github.com/kedacore/http-add-on + type: application + urls: + - https://kedacore.github.io/charts/keda-add-ons-http-0.6.0.tgz + version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-09-28T22:35:39.7278299+02:00" + created: "2023-10-05T15:23:31.388599+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1145,7 +1168,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-09-28T22:35:39.7199601+02:00" + created: "2023-10-05T15:23:31.387859+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1168,7 +1191,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-09-28T22:35:39.712995+02:00" + created: "2023-10-05T15:23:31.386698+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1191,7 +1214,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-09-28T22:35:39.704484+02:00" + created: "2023-10-05T15:23:31.386178+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1214,7 +1237,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-09-28T22:35:39.6984844+02:00" + created: "2023-10-05T15:23:31.385617+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1237,7 +1260,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-09-28T22:35:39.6899816+02:00" + created: "2023-10-05T15:23:31.385115+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1260,7 +1283,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-09-28T22:35:39.6826113+02:00" + created: "2023-10-05T15:23:31.384672+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1285,7 +1308,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-09-28T22:35:39.6740125+02:00" + created: "2023-10-05T15:23:31.384209+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1309,7 +1332,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-09-28T22:35:39.6656157+02:00" + created: "2023-10-05T15:23:31.383774+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1333,7 +1356,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-09-28T22:35:39.6577169+02:00" + created: "2023-10-05T15:23:31.383311+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1357,7 +1380,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-09-28T22:35:39.6489074+02:00" + created: "2023-10-05T15:23:31.382865+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1381,7 +1404,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2023-09-28T22:35:39.6408065+02:00" + created: "2023-10-05T15:23:31.382456+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1405,7 +1428,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2023-09-28T22:35:39.6333966+02:00" + created: "2023-10-05T15:23:31.382202+02:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1427,4 +1450,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2023-09-28T22:35:39.1050226+02:00" +generated: "2023-10-05T15:23:31.280208+02:00" diff --git a/docs/keda-add-ons-http-0.6.0.tgz b/docs/keda-add-ons-http-0.6.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..81b4952c0aabb4d96a2c83210947609d6879c517 GIT binary patch literal 11137 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 Tdj5X^00960R#C)Q00IF3t-fLL literal 0 HcmV?d00001 diff --git a/http-add-on/Chart.yaml b/http-add-on/Chart.yaml index 96fc2fe7..8315e946 100644 --- a/http-add-on/Chart.yaml +++ b/http-add-on/Chart.yaml @@ -11,12 +11,12 @@ kubeVersion: ">=v1.23.0-0" # to the chart and its templates, including the app version. This is incremented at chart release time and does not need # to be included in any PRs to main. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.5.3 +version: 0.6.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 0.5.0 +appVersion: 0.6.0 home: https://github.com/kedacore/http-add-on sources: - https://github.com/kedacore/http-add-on @@ -28,4 +28,4 @@ maintainers: - name: Tom Kerkhove email: kerkhove.tom@gmail.com - name: Zbynek Roubalik - email: zroubali@redhat.com + email: zbynek@kedify.io diff --git a/http-add-on/templates/interceptor/deployment.yaml b/http-add-on/templates/interceptor/deployment.yaml index f8176391..c1a52311 100644 --- a/http-add-on/templates/interceptor/deployment.yaml +++ b/http-add-on/templates/interceptor/deployment.yaml @@ -61,8 +61,9 @@ spec: resources: {{- toYaml .Values.interceptor.resources | nindent 10 }} terminationGracePeriodSeconds: 10 - {{- with .Values.interceptor.nodeSelector }} nodeSelector: + kubernetes.io/os: linux + {{- with .Values.interceptor.nodeSelector }} {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.interceptor.affinity }} diff --git a/http-add-on/templates/operator/deployment.yaml b/http-add-on/templates/operator/deployment.yaml index 60a21cda..9a374592 100644 --- a/http-add-on/templates/operator/deployment.yaml +++ b/http-add-on/templates/operator/deployment.yaml @@ -67,8 +67,9 @@ spec: resources: {{- toYaml .Values.operator.resources | nindent 10 }} terminationGracePeriodSeconds: 10 - {{- with .Values.operator.nodeSelector }} nodeSelector: + kubernetes.io/os: linux + {{- with .Values.operator.nodeSelector }} {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.operator.affinity }} diff --git a/http-add-on/templates/scaler/deployment.yaml b/http-add-on/templates/scaler/deployment.yaml index fd3412cd..45289e80 100644 --- a/http-add-on/templates/scaler/deployment.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -49,8 +49,9 @@ spec: resources: {{- toYaml .Values.scaler.resources | nindent 10 }} terminationGracePeriodSeconds: 10 - {{- with .Values.scaler.nodeSelector }} nodeSelector: + kubernetes.io/os: linux + {{- with .Values.scaler.nodeSelector }} {{- toYaml . | nindent 8 }} {{- end }} {{- with .Values.scaler.affinity }} diff --git a/keda/Chart.yaml b/keda/Chart.yaml index abef7fd3..33134cef 100644 --- a/keda/Chart.yaml +++ b/keda/Chart.yaml @@ -26,4 +26,4 @@ maintainers: - name: Tom Kerkhove email: kerkhove.tom@gmail.com - name: Zbynek Roubalik - email: zroubali@redhat.com + email: zbynek@kedify.io From c31d3b1e8b6aea1a69ba5595855a6d19ca281585 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Thu, 5 Oct 2023 17:48:36 +0200 Subject: [PATCH 10/41] chore: update versions in README.md (#546) Signed-off-by: Dmytro Kovalenko --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c54574e4..234f11f7 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ $ helm repo add kedacore https://kedacore.github.io/charts $ helm search repo kedacore NAME CHART VERSION APP VERSION DESCRIPTION kedacore/external-scaler-azure-cosmos-db 0.1.0 0.1.0 Event-based autoscaler for Azure Cosmos DB chan... -kedacore/keda 2.11.2 2.11.2 Event-based autoscaler for workloads on Kubernetes -kedacore/keda-add-ons-http 0.5.3 0.5.0 Event-based autoscaler for HTTP workloads on Ku... +kedacore/keda 2.12.0 2.12.0 Event-based autoscaler for workloads on Kubernetes +kedacore/keda-add-ons-http 0.6.0 0.6.0 Event-based autoscaler for HTTP workloads on Ku... ``` ## Releases From 78cabda5c1af329a891c4e0719e4cb755c689b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFs=20Postula?= Date: Fri, 13 Oct 2023 15:34:25 +0200 Subject: [PATCH 11/41] feat: update crd to allow vault secret to handle write operation (#548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Loïs Postula Signed-off-by: Dmytro Kovalenko --- .../crd-clustertriggerauthentications.yaml | 20 +++++++++++++++++++ .../crds/crd-triggerauthentications.yaml | 20 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/keda/templates/crds/crd-clustertriggerauthentications.yaml b/keda/templates/crds/crd-clustertriggerauthentications.yaml index 6d783d0c..792a7d18 100644 --- a/keda/templates/crds/crd-clustertriggerauthentications.yaml +++ b/keda/templates/crds/crd-clustertriggerauthentications.yaml @@ -195,6 +195,26 @@ spec: type: string path: type: string + pkiData: + properties: + altNames: + type: string + commonName: + type: string + format: + type: string + ipSans: + type: string + otherSans: + type: string + ttl: + type: string + uriSans: + type: string + type: object + type: + description: VaultSecretType defines the type of vault secret + type: string required: - key - parameter diff --git a/keda/templates/crds/crd-triggerauthentications.yaml b/keda/templates/crds/crd-triggerauthentications.yaml index 3d56f1c5..4facbdba 100644 --- a/keda/templates/crds/crd-triggerauthentications.yaml +++ b/keda/templates/crds/crd-triggerauthentications.yaml @@ -194,6 +194,26 @@ spec: type: string path: type: string + pkiData: + properties: + altNames: + type: string + commonName: + type: string + format: + type: string + ipSans: + type: string + otherSans: + type: string + ttl: + type: string + uriSans: + type: string + type: object + type: + description: VaultSecretType defines the type of vault secret + type: string required: - key - parameter From e49b2e099e0f67be1e4a519cf0805273ff861dad Mon Sep 17 00:00:00 2001 From: Roy Gao <137811914+congzhegao@users.noreply.github.com> Date: Wed, 25 Oct 2023 02:54:39 -0400 Subject: [PATCH 12/41] Fix the svc name of webhook to avoid breaking istio (#551) Signed-off-by: Dmytro Kovalenko --- keda/templates/webhooks/service.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keda/templates/webhooks/service.yaml b/keda/templates/webhooks/service.yaml index d7b78419..fdb9cce8 100644 --- a/keda/templates/webhooks/service.yaml +++ b/keda/templates/webhooks/service.yaml @@ -27,7 +27,7 @@ metadata: namespace: {{ .Release.Namespace }} spec: ports: - - name: http + - name: https port: 443 protocol: TCP targetPort: {{ .Values.webhooks.port | default 9443 }} From b1c614bc0d98337f82287daf7962a3d69e814c80 Mon Sep 17 00:00:00 2001 From: Adarsh Verma <113962919+Adarsh-verma-14@users.noreply.github.com> Date: Thu, 26 Oct 2023 23:42:57 +0530 Subject: [PATCH 13/41] Show only logs with a severity level of ERROR or higher in the stderr (#506) Signed-off-by: Adarsh-verma-14 Signed-off-by: Dmytro Kovalenko --- keda/README.md | 1 + keda/templates/metrics-server/deployment.yaml | 1 + keda/values.yaml | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/keda/README.md b/keda/README.md index 1eb44781..7b08bae4 100644 --- a/keda/README.md +++ b/keda/README.md @@ -148,6 +148,7 @@ their default values. | `image.metricsApiServer.repository` | string | `"ghcr.io/kedacore/keda-metrics-apiserver"` | Image name of KEDA Metrics API Server | | `image.metricsApiServer.tag` | string | `""` | Image tag of KEDA Metrics API Server. Optional, given app version of Helm chart is used by default | | `logging.metricServer.level` | int | `0` | Logging level for Metrics Server. allowed values: `0` for info, `4` for debug, or an integer value greater than 0, specified as string | +| `logging.metricServer.stderrthreshold` | string | `"ERROR"` | Logging stderrthreshold for Metrics Server allowed values: 'DEBUG','INFO','WARN','ERROR','ALERT','EMERG' | | `metricsServer.affinity` | object | `{}` | [Affinity] for pod scheduling for Metrics API Server. Takes precedence over the `affinity` field | | `metricsServer.dnsPolicy` | string | `"ClusterFirst"` | Defined the DNS policy for the metric server | | `metricsServer.livenessProbe` | object | `{"failureThreshold":3,"initialDelaySeconds":5,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Liveness probes for Metrics API Server ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)) | diff --git a/keda/templates/metrics-server/deployment.yaml b/keda/templates/metrics-server/deployment.yaml index 3965e3ff..ed5cf934 100644 --- a/keda/templates/metrics-server/deployment.yaml +++ b/keda/templates/metrics-server/deployment.yaml @@ -122,6 +122,7 @@ spec: - --port={{ .Values.prometheus.metricServer.port }} - --secure-port={{ .Values.service.portHttpsTarget }} - --logtostderr=true + - --stderrthreshold={{ .Values.logging.metricServer.stderrthreshold }} - --metrics-service-address={{ .Values.operator.name }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:9666 - --client-ca-file={{ .Values.certificates.mountPath }}/ca.crt - --tls-cert-file={{ .Values.certificates.mountPath }}/tls.crt diff --git a/keda/values.yaml b/keda/values.yaml index 26fc3924..7a67bf7a 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -305,7 +305,9 @@ logging: # -- Logging level for Metrics Server. # allowed values: `0` for info, `4` for debug, or an integer value greater than 0, specified as string level: 0 - + # -- Logging stderrthreshold for Metrics Server + # allowed values: 'DEBUG','INFO','WARN','ERROR','ALERT','EMERG' + stderrthreshold: ERROR webhooks: # -- Logging level for KEDA Operator. # allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string From c1a2a9cfa22d2aaa70084aa09df11d898304cb0c Mon Sep 17 00:00:00 2001 From: yuval weber Date: Thu, 2 Nov 2023 13:15:51 +0200 Subject: [PATCH 14/41] Support profiling for keda components (#549) Signed-off-by: yuval weber Signed-off-by: unknown Co-authored-by: Tom Kerkhove Signed-off-by: Dmytro Kovalenko --- keda/README.md | 28 ++++++++----------- keda/README.md.gotmpl | 16 +++++++++-- keda/templates/manager/deployment.yaml | 3 ++ keda/templates/manager/service.yaml | 5 ++++ keda/templates/metrics-server/deployment.yaml | 3 ++ keda/templates/metrics-server/service.yaml | 6 ++++ keda/templates/webhooks/deployment.yaml | 3 ++ keda/templates/webhooks/service.yaml | 5 ++++ keda/values.yaml | 21 ++++++++++++++ 9 files changed, 70 insertions(+), 20 deletions(-) diff --git a/keda/README.md b/keda/README.md index 7b08bae4..ee705150 100644 --- a/keda/README.md +++ b/keda/README.md @@ -239,6 +239,17 @@ their default values. | `prometheus.webhooks.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.webhooks.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | +### Troubleshooting + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +| `profiling.metricsServer.enabled` | bool | `false` | Enable profiling for KEDA metrics server | +| `profiling.metricsServer.port` | int | `8083` | Expose profiling on a specific port | +| `profiling.operator.enabled` | bool | `false` | Enable profiling for KEDA operator | +| `profiling.operator.port` | int | `8082` | Expose profiling on a specific port | +| `profiling.webhooks.enabled` | bool | `false` | Enable profiling for KEDA admission webhook | +| `profiling.webhooks.port` | int | `8084` | Expose profiling on a specific port | + ### Admission Webhooks | Parameter | Type | Default | Description | @@ -252,23 +263,6 @@ their default values. | `podDisruptionBudget.webhooks` | object | `{}` | Capability to configure [Pod Disruption Budget] | | `podLabels.webhooks` | object | `{}` | Pod labels for KEDA Admission webhooks | | `podSecurityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] of the KEDA admission webhooks | -| `prometheus.webhooks.enabled` | bool | `false` | Enable KEDA admission webhooks prometheus metrics expose | -| `prometheus.webhooks.port` | int | `8080` | Port used for exposing KEDA admission webhooks prometheus metrics | -| `prometheus.webhooks.prometheusRules.additionalLabels` | object | `{}` | Additional labels to add for KEDA admission webhooks using prometheusRules crd (prometheus operator) | -| `prometheus.webhooks.prometheusRules.alerts` | list | `[]` | Additional alerts to add for KEDA admission webhooks using prometheusRules crd (prometheus operator) | -| `prometheus.webhooks.prometheusRules.enabled` | bool | `false` | Enables PrometheusRules creation for the Prometheus Operator | -| `prometheus.webhooks.prometheusRules.namespace` | string | `""` | Scraping namespace for KEDA admission webhooks using prometheusRules crd (prometheus operator) | -| `prometheus.webhooks.serviceMonitor.additionalLabels` | object | `{}` | Additional labels to add for metric server using ServiceMonitor crd (prometheus operator) | -| `prometheus.webhooks.serviceMonitor.enabled` | bool | `false` | Enables ServiceMonitor creation for the Prometheus webhooks | -| `prometheus.webhooks.serviceMonitor.interval` | string | `""` | Interval at which metrics should be scraped If not specified Prometheus’ global scrape interval is used. | -| `prometheus.webhooks.serviceMonitor.jobLabel` | string | `""` | jobLabel selects the label from the associated Kubernetes service which will be used as the job label for all metrics. [ServiceMonitor Spec] | -| `prometheus.webhooks.serviceMonitor.podTargetLabels` | list | `[]` | PodTargetLabels transfers labels on the Kubernetes `Pod` onto the created metrics | -| `prometheus.webhooks.serviceMonitor.port` | string | `"metrics"` | Name of the service port this endpoint refers to. Mutually exclusive with targetPort | -| `prometheus.webhooks.serviceMonitor.relabelings` | list | `[]` | List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | -| `prometheus.webhooks.serviceMonitor.relabellings` | list | `[]` | DEPRECATED. List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | -| `prometheus.webhooks.serviceMonitor.scrapeTimeout` | string | `""` | Timeout after which the scrape is ended If not specified, the Prometheus global scrape timeout is used unless it is less than Interval in which the latter is used | -| `prometheus.webhooks.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | -| `prometheus.webhooks.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | | `resources.webhooks` | object | `{"limits":{"cpu":"50m","memory":"100Mi"},"requests":{"cpu":"10m","memory":"10Mi"}}` | Manage [resource request & limits] of KEDA admission webhooks pod | | `securityContext.webhooks` | object | [See below](#KEDA-is-secure-by-default) | [Security context] of the admission webhooks container | | `topologySpreadConstraints.webhooks` | list | `[]` | [Pod Topology Constraints] of KEDA admission webhooks pod | diff --git a/keda/README.md.gotmpl b/keda/README.md.gotmpl index ba7073b2..973dedc2 100644 --- a/keda/README.md.gotmpl +++ b/keda/README.md.gotmpl @@ -69,7 +69,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| {{- range .Values }} - {{- if and (or (contains "operator" .Key) (contains "keda" .Key)) (not (or (contains "opentelemetry" .Key) (contains "prometheus" .Key))) }} + {{- if and (or (contains "operator" .Key) (contains "keda" .Key)) (not (or (contains "opentelemetry" .Key) (contains "prometheus" .Key) (contains "profiling" .Key))) }} | `{{ .Key }}` | {{ .Type }} | {{ if .Default }}{{ .Default }}{{ else }}{{ .AutoDefault }}{{ end }} | {{ if .Description }}{{ .Description }}{{ else }}{{ .AutoDescription }}{{ end }} | {{- end }} {{- end }} @@ -79,7 +79,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| {{- range .Values }} - {{- if and (or (contains "metricServer" .Key) (contains "metricsServer" .Key) (contains "metricsApiServer" .Key) (contains "metricsAdapter" .Key) (hasPrefix "service." .Key)) (not (or (contains "opentelemetry" .Key) (contains "prometheus" .Key)))}} + {{- if and (or (contains "metricServer" .Key) (contains "metricsServer" .Key) (contains "metricsApiServer" .Key) (contains "metricsAdapter" .Key) (hasPrefix "service." .Key)) (not (or (contains "opentelemetry" .Key) (contains "prometheus" .Key) (contains "profiling" .Key)))}} | `{{ .Key }}` | {{ .Type }} | {{ if .Default }}{{ .Default }}{{ else }}{{ .AutoDefault }}{{ end }} | {{ if .Description }}{{ .Description }}{{ else }}{{ .AutoDescription }}{{ end }} | {{- end }} {{- end }} @@ -94,12 +94,22 @@ their default values. {{- end }} {{- end }} +### Troubleshooting + +| Parameter | Type | Default | Description | +|-----------|------|---------|-------------| +{{- range .Values }} + {{- if (contains "profiling" .Key) }} +| `{{ .Key }}` | {{ .Type }} | {{ if .Default }}{{ .Default }}{{ else }}{{ .AutoDefault }}{{ end }} | {{ if .Description }}{{ .Description }}{{ else }}{{ .AutoDescription }}{{ end }} | + {{- end }} +{{- end }} + ### Admission Webhooks | Parameter | Type | Default | Description | |-----------|------|---------|-------------| {{- range .Values }} - {{- if contains "webhooks" .Key }} + {{- if and (contains "webhooks" .Key) (not (or (contains "opentelemetry" .Key) (contains "prometheus" .Key) (contains "profiling" .Key))) }} | `{{ .Key }}` | {{ .Type }} | {{ if .Default }}{{ .Default }}{{ else }}{{ .AutoDefault }}{{ end }} | {{ if .Description }}{{ .Description }}{{ else }}{{ .AutoDescription }}{{ end }} | {{- end }} {{- end }} diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index b993ae94..d4caec21 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -93,6 +93,9 @@ spec: {{- if .Values.opentelemetry.operator.enabled }} - "--enable-opentelemetry-metrics={{ .Values.opentelemetry.operator.enabled}}" {{- end }} + {{- if .Values.profiling.operator.enabled }} + - "--profiling-bind-address=:{{ .Values.profiling.operator.port }}" + {{- end }} {{- range $key, $value := .Values.extraArgs.keda }} - "--{{ $key }}={{ $value }}" {{- end }} diff --git a/keda/templates/manager/service.yaml b/keda/templates/manager/service.yaml index 599289ea..12c4e75f 100644 --- a/keda/templates/manager/service.yaml +++ b/keda/templates/manager/service.yaml @@ -34,5 +34,10 @@ spec: port: {{ .Values.prometheus.operator.port }} targetPort: {{ .Values.prometheus.operator.port }} {{- end }} + {{- if .Values.profiling.operator.enabled }} + - name: profiling + port: {{ .Values.profiling.operator.port }} + targetPort: {{ .Values.profiling.operator.port }} + {{- end }} selector: app: {{ .Values.operator.name }} diff --git a/keda/templates/metrics-server/deployment.yaml b/keda/templates/metrics-server/deployment.yaml index ed5cf934..a3f7a425 100644 --- a/keda/templates/metrics-server/deployment.yaml +++ b/keda/templates/metrics-server/deployment.yaml @@ -129,6 +129,9 @@ spec: - --tls-private-key-file={{ .Values.certificates.mountPath }}/tls.key - --cert-dir={{ .Values.certificates.mountPath }} - --v={{ .Values.logging.metricServer.level }} + {{- if .Values.profiling.metricsServer.enabled }} + - "--profiling-bind-address=:{{ .Values.profiling.metricsServer.port }}" + {{- end }} {{- range $key, $value := .Values.extraArgs.metricsAdapter }} - --{{ $key }}={{ $value }} {{- end }} diff --git a/keda/templates/metrics-server/service.yaml b/keda/templates/metrics-server/service.yaml index cf6f6966..9295d416 100644 --- a/keda/templates/metrics-server/service.yaml +++ b/keda/templates/metrics-server/service.yaml @@ -35,5 +35,11 @@ spec: port: {{ .Values.prometheus.metricServer.port }} targetPort: {{ .Values.prometheus.metricServer.port }} protocol: TCP + {{- if .Values.profiling.metricsServer.enabled }} + - name: profiling + port: {{ .Values.profiling.metricsServer.port }} + targetPort: {{ .Values.profiling.metricsServer.port }} + protocol: TCP + {{- end }} selector: app: {{ .Values.operator.name }}-metrics-apiserver diff --git a/keda/templates/webhooks/deployment.yaml b/keda/templates/webhooks/deployment.yaml index c47c6210..856eb00d 100644 --- a/keda/templates/webhooks/deployment.yaml +++ b/keda/templates/webhooks/deployment.yaml @@ -79,6 +79,9 @@ spec: - "--port={{ .Values.webhooks.port }}" {{- end }} - --metrics-bind-address=:{{ .Values.prometheus.webhooks.port }} + {{- if .Values.profiling.webhooks.enabled }} + - "--profiling-bind-address=:{{ .Values.profiling.webhooks.port }}" + {{- end }} {{- range $key, $value := .Values.extraArgs.webhooks }} - --{{ $key }}={{ $value }} {{- end }} diff --git a/keda/templates/webhooks/service.yaml b/keda/templates/webhooks/service.yaml index fdb9cce8..4d933d60 100644 --- a/keda/templates/webhooks/service.yaml +++ b/keda/templates/webhooks/service.yaml @@ -36,6 +36,11 @@ spec: port: {{ .Values.prometheus.webhooks.port }} targetPort: {{ .Values.prometheus.webhooks.port }} {{- end }} + {{- if .Values.profiling.webhooks.enabled }} + - name: profiling + port: {{ .Values.profiling.webhooks.port }} + targetPort: {{ .Values.profiling.webhooks.port }} + {{- end }} selector: app: {{ .Values.webhooks.name }} {{- end }} diff --git a/keda/values.yaml b/keda/values.yaml index 7a67bf7a..827539a9 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -461,6 +461,27 @@ http: # -- The minimum TLS version to use for all scalers that use raw HTTP clients (some scalers use SDKs to access target services. These have built-in HTTP clients, and this value does not necessarily apply to them) minTlsVersion: TLS12 +## This setting lets you enable profiling for all of the components of KEDA and in the specific port you choose +## This can be useful when trying to investigate errors like memory leaks or CPU or even look at goroutines to understand better +## This setting is disabled by default +profiling: + operator: + # -- Enable profiling for KEDA operator + enabled: false + # -- Expose profiling on a specific port + port: 8082 + metricsServer: + # -- Enable profiling for KEDA metrics server + enabled: false + # -- Expose profiling on a specific port + port: 8083 + webhooks: + # -- Enable profiling for KEDA admission webhook + enabled: false + # -- Expose profiling on a specific port + port: 8084 + + ## Extra KEDA Operator and Metrics Adapter container arguments extraArgs: # -- Additional KEDA Operator container arguments From 098c81786b5d44143f969ade126413634a245935 Mon Sep 17 00:00:00 2001 From: Radek Fojtik <68660951+radekfojtik@users.noreply.github.com> Date: Fri, 3 Nov 2023 06:23:30 +0100 Subject: [PATCH 15/41] Fix TriggerAuthentication - added configuration for validation webhook (#553) Signed-off-by: Dmytro Kovalenko --- .../webhooks/validatingconfiguration.yaml | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/keda/templates/webhooks/validatingconfiguration.yaml b/keda/templates/webhooks/validatingconfiguration.yaml index 8144094e..ae7947c7 100644 --- a/keda/templates/webhooks/validatingconfiguration.yaml +++ b/keda/templates/webhooks/validatingconfiguration.yaml @@ -46,4 +46,52 @@ webhooks: - scaledobjects sideEffects: None timeoutSeconds: 10 +- admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ .Values.webhooks.name }} + namespace: {{ .Release.Namespace }} + path: /validate-keda-sh-v1alpha1-triggerauthentication + failurePolicy: {{ .Values.webhooks.failurePolicy }} + matchPolicy: Equivalent + name: vstriggerauthentication.kb.io + namespaceSelector: {} + objectSelector: {} + rules: + - apiGroups: + - keda.sh + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - triggerauthentications + sideEffects: None + timeoutSeconds: 10 +- admissionReviewVersions: + - v1 + clientConfig: + service: + name: {{ .Values.webhooks.name }} + namespace: {{ .Release.Namespace }} + path: /validate-keda-sh-v1alpha1-clustertriggerauthentication + failurePolicy: {{ .Values.webhooks.failurePolicy }} + matchPolicy: Equivalent + name: vsclustertriggerauthentication.kb.io + namespaceSelector: {} + objectSelector: {} + rules: + - apiGroups: + - keda.sh + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - clustertriggerauthentications + sideEffects: None + timeoutSeconds: 10 {{- end }} From e256cb512977484514d1438c9e1496732cb8e646 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Fri, 3 Nov 2023 06:23:40 +0100 Subject: [PATCH 16/41] fix: Declare missing port in KEDA operator (#552) Signed-off-by: Dmytro Kovalenko --- keda/templates/manager/deployment.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index d4caec21..16207714 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -122,6 +122,9 @@ spec: - containerPort: 8080 name: http protocol: TCP + - containerPort: 9666 + name: metricsservice + protocol: TCP env: - name: WATCH_NAMESPACE value: {{ .Values.watchNamespace | quote }} From 622a09d3769383eeae9cafd5960e4973e58c5d7d Mon Sep 17 00:00:00 2001 From: Quentin Bisson Date: Sat, 18 Nov 2023 20:15:26 +0100 Subject: [PATCH 17/41] Allow image registry override for all keda components (#557) Signed-off-by: Dmytro Kovalenko --- keda/README.md | 4 ++++ keda/templates/manager/deployment.yaml | 5 +++++ keda/templates/metrics-server/deployment.yaml | 5 +++++ keda/templates/webhooks/deployment.yaml | 5 +++++ keda/values.yaml | 11 +++++++++++ 5 files changed, 30 insertions(+) diff --git a/keda/README.md b/keda/README.md index ee705150..200c9764 100644 --- a/keda/README.md +++ b/keda/README.md @@ -80,6 +80,7 @@ their default values. | `crds.install` | bool | `true` | Defines whether the KEDA CRDs have to be installed or not. | | `env` | list | `[]` | Additional environment variables that will be passed onto all KEDA components | | `extraObjects` | list | `[]` | Array of extra K8s manifests to deploy | +| `global.image.registry` | string | `nil` | Global image registry of KEDA components | | `grpcTLSCertsSecret` | string | `""` | Set this if you are using an external scaler and want to communicate over TLS (recommended). This variable holds the name of the secret that will be mounted to the /grpccerts path on the Pod | | `hashiCorpVaultTLS` | string | `""` | Set this if you are using HashiCorp Vault and want to communicate over TLS (recommended). This variable holds the name of the secret that will be mounted to the /vault path on the Pod | | `http.keepAlive.enabled` | bool | `true` | Enable HTTP connection keep alive | @@ -117,6 +118,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `extraArgs.keda` | object | `{}` | Additional KEDA Operator container arguments | +| `image.keda.registry` | string | `nil` | Image registry of KEDA operator | | `image.keda.repository` | string | `"ghcr.io/kedacore/keda"` | Image name of KEDA operator | | `image.keda.tag` | string | `""` | Image tag of KEDA operator. Optional, given app version of Helm chart is used by default | | `logging.operator.format` | string | `"console"` | Logging format for KEDA Operator. allowed values: `json` or `console` | @@ -145,6 +147,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| | `extraArgs.metricsAdapter` | object | `{}` | Additional Metrics Adapter container arguments | +| `image.metricsApiServer.registry` | string | `nil` | Image registry of KEDA Metrics API Server | | `image.metricsApiServer.repository` | string | `"ghcr.io/kedacore/keda-metrics-apiserver"` | Image name of KEDA Metrics API Server | | `image.metricsApiServer.tag` | string | `""` | Image tag of KEDA Metrics API Server. Optional, given app version of Helm chart is used by default | | `logging.metricServer.level` | int | `0` | Logging level for Metrics Server. allowed values: `0` for info, `4` for debug, or an integer value greater than 0, specified as string | @@ -254,6 +257,7 @@ their default values. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| +| `image.webhooks.registry` | string | `nil` | Image registry of KEDA admission-webhooks | | `image.webhooks.repository` | string | `"ghcr.io/kedacore/keda-admission-webhooks"` | Image name of KEDA admission-webhooks | | `image.webhooks.tag` | string | `""` | Image tag of KEDA admission-webhooks . Optional, given app version of Helm chart is used by default | | `logging.webhooks.format` | string | `"console"` | Logging format for KEDA Admission webhooks. allowed values: `json` or `console` | diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index 16207714..fbfd3040 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -71,7 +71,12 @@ spec: {{- else }} {{- toYaml .Values.securityContext | nindent 12 }} {{- end }} + {{- $registry := .Values.global.image.registry | default .Values.image.keda.registry | default "" }} + {{- if $registry }} + image: "{{ $registry }}/{{ .Values.image.keda.repository }}:{{ .Values.image.keda.tag | default .Chart.AppVersion }}" + {{- else }} image: "{{ .Values.image.keda.repository }}:{{ .Values.image.keda.tag | default .Chart.AppVersion }}" + {{- end }} command: - "/keda" args: diff --git a/keda/templates/metrics-server/deployment.yaml b/keda/templates/metrics-server/deployment.yaml index a3f7a425..d621e0b8 100644 --- a/keda/templates/metrics-server/deployment.yaml +++ b/keda/templates/metrics-server/deployment.yaml @@ -73,7 +73,12 @@ spec: {{- else }} {{- toYaml .Values.securityContext | nindent 12 }} {{- end }} + {{- $registry := .Values.global.image.registry | default .Values.image.metricsApiServer.registry | default "" }} + {{- if $registry }} + image: "{{ $registry }}/{{ .Values.image.metricsApiServer.repository }}:{{ .Values.image.metricsApiServer.tag | default .Chart.AppVersion }}" + {{- else }} image: "{{ .Values.image.metricsApiServer.repository }}:{{ .Values.image.metricsApiServer.tag | default .Chart.AppVersion }}" + {{- end }} imagePullPolicy: {{ .Values.image.pullPolicy }} livenessProbe: httpGet: diff --git a/keda/templates/webhooks/deployment.yaml b/keda/templates/webhooks/deployment.yaml index 856eb00d..314598bd 100644 --- a/keda/templates/webhooks/deployment.yaml +++ b/keda/templates/webhooks/deployment.yaml @@ -66,7 +66,12 @@ spec: {{- else }} {{- toYaml .Values.securityContext | nindent 12 }} {{- end }} + {{- $registry := .Values.global.image.registry | default .Values.image.webhooks.registry | default "" }} + {{- if $registry }} + image: "{{ $registry }}/{{ .Values.image.webhooks.repository }}:{{ .Values.image.webhooks.tag | default .Chart.AppVersion }}" + {{- else }} image: "{{ .Values.image.webhooks.repository }}:{{ .Values.image.webhooks.tag | default .Chart.AppVersion }}" + {{- end }} command: - /keda-admission-webhooks args: diff --git a/keda/values.yaml b/keda/values.yaml index 827539a9..947befcc 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -2,18 +2,29 @@ # This is a YAML-formatted file. # Declare variables to be passed into your templates. +global: + image: + # -- Global image registry of KEDA components + registry: null + image: keda: + # -- Image registry of KEDA operator + registry: null # -- Image name of KEDA operator repository: ghcr.io/kedacore/keda # -- Image tag of KEDA operator. Optional, given app version of Helm chart is used by default tag: "" metricsApiServer: + # -- Image registry of KEDA Metrics API Server + registry: null # -- Image name of KEDA Metrics API Server repository: ghcr.io/kedacore/keda-metrics-apiserver # -- Image tag of KEDA Metrics API Server. Optional, given app version of Helm chart is used by default tag: "" webhooks: + # -- Image registry of KEDA admission-webhooks + registry: null # -- Image name of KEDA admission-webhooks repository: ghcr.io/kedacore/keda-admission-webhooks # -- Image tag of KEDA admission-webhooks . Optional, given app version of Helm chart is used by default From bfad5704ba9c0d3040719a054bd5d63f1ef375ce Mon Sep 17 00:00:00 2001 From: Tom Kerkhove Date: Thu, 23 Nov 2023 10:05:01 +0100 Subject: [PATCH 18/41] docs: Clarify that contributors do not have to ship Helm chart (#573) Signed-off-by: Dmytro Kovalenko --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 849509a4..88d42794 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,6 +4,8 @@ Thanks for helping making KEDA better! ## Shipping a new version +> ⚠️ New Helm chart versions are only released in conjunction with KEDA Core or hotfixes, individual PRs do not have to perform these steps + You can easily release a new Helm chart version: 1. Update the version of the Helm chart in [Chart.yaml](keda/Chart.yaml). From 03210df79ff87ce25551da2540fc9bd6c4865c99 Mon Sep 17 00:00:00 2001 From: Adarsh Verma <113962919+Adarsh-verma-14@users.noreply.github.com> Date: Mon, 27 Nov 2023 15:47:50 +0530 Subject: [PATCH 19/41] add disable-compression arg for both operator and metrics-server (#554) Signed-off-by: Adarsh-verma-14 Signed-off-by: Dmytro Kovalenko --- keda/templates/manager/deployment.yaml | 1 + keda/templates/metrics-server/deployment.yaml | 1 + keda/values.yaml | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index fbfd3040..d818aaf1 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -81,6 +81,7 @@ spec: - "/keda" args: - "--leader-elect" + - "--disable-compression={{ .Values.operator.disableCompression}}" - "--zap-log-level={{ .Values.logging.operator.level }}" - "--zap-encoder={{ .Values.logging.operator.format }}" - "--zap-time-encoding={{ .Values.logging.operator.timeEncoding }}" diff --git a/keda/templates/metrics-server/deployment.yaml b/keda/templates/metrics-server/deployment.yaml index d621e0b8..16829cc6 100644 --- a/keda/templates/metrics-server/deployment.yaml +++ b/keda/templates/metrics-server/deployment.yaml @@ -128,6 +128,7 @@ spec: - --secure-port={{ .Values.service.portHttpsTarget }} - --logtostderr=true - --stderrthreshold={{ .Values.logging.metricServer.stderrthreshold }} + - --disable-compression={{ .Values.metricsServer.disableCompression}} - --metrics-service-address={{ .Values.operator.name }}.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:9666 - --client-ca-file={{ .Values.certificates.mountPath }}/ca.crt - --tls-cert-file={{ .Values.certificates.mountPath }}/tls.crt diff --git a/keda/values.yaml b/keda/values.yaml index 947befcc..6120b9ce 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -55,6 +55,9 @@ operator: # You can run multiple replicas, but they will not improve the performance of KEDA, it could only reduce downtime during a failover. # Learn more in [our documentation](https://keda.sh/docs/latest/operate/cluster/#high-availability). replicaCount: 1 + # --Disable response compression for k8s restAPI in client-go. + # Disabling compression simply means that turns off the process of making data smaller for K8s restAPI in client-go for faster transmission. + disableCompression: true # -- [Affinity] for pod scheduling for KEDA operator. Takes precedence over the `affinity` field affinity: {} # podAntiAffinity: @@ -89,6 +92,9 @@ metricsServer: # You can run multiple replicas, but they will not improve the performance of KEDA, it could only reduce downtime during a failover. # Learn more in [our documentation](https://keda.sh/docs/latest/operate/cluster/#high-availability). replicaCount: 1 + # --Disable response compression for k8s restAPI in client-go. + # Disabling compression simply means that turns off the process of making data smaller for K8s restAPI in client-go for faster transmission. + disableCompression: true # use ClusterFirstWithHostNet if `useHostNetwork: true` https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#pod-s-dns-policy # -- Defined the DNS policy for the metric server dnsPolicy: ClusterFirst From 2d630c5fdc6c2d9a4c2917f96840328a9a3545bc Mon Sep 17 00:00:00 2001 From: SpiritZhou Date: Tue, 28 Nov 2023 14:02:23 +0800 Subject: [PATCH 20/41] feat: Introduce CloudEventSources CRD and adding ClusterName parameter (#572) * Add CloudEventSources Crd and ClustetName Parameter Signed-off-by: SpiritZhou * Update Signed-off-by: SpiritZhou * Update Signed-off-by: SpiritZhou * Update keda/values.yaml Co-authored-by: Tom Kerkhove Signed-off-by: SpiritZhou * Fix Signed-off-by: SpiritZhou * Update Signed-off-by: SpiritZhou * Revert unnecessary update Signed-off-by: SpiritZhou --------- Signed-off-by: SpiritZhou Co-authored-by: Tom Kerkhove Signed-off-by: Dmytro Kovalenko --- .github/workflows/ci-core.yml | 6 ++ keda/README.md | 1 + .../templates/crds/crd-cloudeventsources.yaml | 96 +++++++++++++++++++ keda/templates/manager/clusterrole.yaml | 7 ++ keda/templates/manager/deployment.yaml | 1 + keda/values.yaml | 3 + 6 files changed, 114 insertions(+) create mode 100644 keda/templates/crds/crd-cloudeventsources.yaml diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index a61cb5f8..1ef65a51 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -197,6 +197,9 @@ jobs: - name: Verify scaledobjects.keda.sh CRD is installed run: kubectl get crd/scaledobjects.keda.sh -o wide + + - name: Verify cloudeventsources.eventing.keda.sh CRD is installed + run: kubectl get crd/cloudeventsources.eventing.keda.sh -o wide - name: Get all ScaledObjects run: kubectl get scaledobjects -o wide @@ -210,6 +213,9 @@ jobs: - name: Get all ClusterTriggerAuthentication run: kubectl get clustertriggerauth -o wide + - name: Get all CloudEventSource + run: kubectl get cloudeventsource -o wide + - name: Deploy Nginx with autoscaling run: kubectl apply -f ./samples/nginx-scaledobject.yml diff --git a/keda/README.md b/keda/README.md index 200c9764..758c39db 100644 --- a/keda/README.md +++ b/keda/README.md @@ -77,6 +77,7 @@ their default values. | `certificates.mountPath` | string | `"/certs"` | Path where KEDA TLS certificates are mounted | | `certificates.secretName` | string | `"kedaorg-certs"` | Secret name to be mounted with KEDA TLS certificates | | `clusterDomain` | string | `"cluster.local"` | Kubernetes cluster domain | +| `clusterName` | string | `"kubernetes-default"` | Kubernetes cluster name. Used in features such as emitting CloudEvents | | `crds.install` | bool | `true` | Defines whether the KEDA CRDs have to be installed or not. | | `env` | list | `[]` | Additional environment variables that will be passed onto all KEDA components | | `extraObjects` | list | `[]` | Array of extra K8s manifests to deploy | diff --git a/keda/templates/crds/crd-cloudeventsources.yaml b/keda/templates/crds/crd-cloudeventsources.yaml new file mode 100644 index 00000000..58b491c1 --- /dev/null +++ b/keda/templates/crds/crd-cloudeventsources.yaml @@ -0,0 +1,96 @@ +{{- if .Values.crds.install }} +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.13.0 + labels: + app.kubernetes.io/name: {{ .Values.operator.name }} + {{- include "keda.labels" . | indent 4 }} + name: cloudeventsources.eventing.keda.sh +spec: + group: eventing.keda.sh + names: + kind: CloudEventSource + listKind: CloudEventSourceList + plural: cloudeventsources + singular: cloudeventsource + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .status.conditions[?(@.type=="Active")].status + name: Active + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: CloudEventSource defines how a KEDA event will be sent to event + sink + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: CloudEventSourceSpec defines the spec of CloudEventSource + properties: + clusterName: + type: string + destination: + description: Destination defines the various ways to emit events + properties: + http: + properties: + uri: + type: string + required: + - uri + type: object + type: object + required: + - destination + type: object + status: + description: CloudEventSourceStatus defines the observed state of CloudEventSource + properties: + conditions: + description: Conditions an array representation to store multiple + Conditions + items: + description: Condition to store the condition state + properties: + message: + description: A human readable message indicating details about + the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition + type: string + required: + - status + - type + type: object + type: array + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} +{{- end -}} diff --git a/keda/templates/manager/clusterrole.yaml b/keda/templates/manager/clusterrole.yaml index 0242a03f..d5cff9d6 100644 --- a/keda/templates/manager/clusterrole.yaml +++ b/keda/templates/manager/clusterrole.yaml @@ -99,6 +99,13 @@ rules: - leases verbs: - '*' +- apiGroups: + - eventing.keda.sh + resources: + - cloudeventsources + - cloudeventsources/status + verbs: + - '*' - apiGroups: - keda.sh resources: diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index d818aaf1..de67906b 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -91,6 +91,7 @@ spec: - "--operator-service-name={{ .Values.operator.name }}" - "--metrics-server-service-name={{ .Values.operator.name }}-metrics-apiserver" - "--webhooks-service-name={{ .Values.webhooks.name }}" + - "--k8s-cluster-name={{ .Values.clusterName }}" - "--k8s-cluster-domain={{ .Values.clusterDomain }}" {{- if .Values.prometheus.operator.enabled }} - "--metrics-bind-address=:{{ .Values.prometheus.operator.port }}" diff --git a/keda/values.yaml b/keda/values.yaml index 6120b9ce..98500dd0 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -32,6 +32,9 @@ image: # -- Image pullPolicy for all KEDA components pullPolicy: Always +# -- Kubernetes cluster name. Used in features such as emitting CloudEvents +clusterName: kubernetes-default + # -- Kubernetes cluster domain clusterDomain: cluster.local From d8306daf7df047d7f56485408cfbd1341bd69b62 Mon Sep 17 00:00:00 2001 From: Zbynek Roubalik Date: Tue, 28 Nov 2023 09:54:25 +0100 Subject: [PATCH 21/41] store 2.12.1 package at `main` (#577) Signed-off-by: Zbynek Roubalik Signed-off-by: Dmytro Kovalenko --- docs/index.yaml | 182 +++++++++++++++++++++---------------------- docs/keda-2.12.1.tgz | Bin 0 -> 92517 bytes keda/Chart.yaml | 4 +- 3 files changed, 93 insertions(+), 93 deletions(-) create mode 100644 docs/keda-2.12.1.tgz diff --git a/docs/index.yaml b/docs/index.yaml index 016cd34c..fa526d9b 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2023-10-05T15:23:31.28086+02:00" + created: "2023-11-27T18:55:31.362105+01:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -22,9 +22,32 @@ entries: - https://kedacore.github.io/charts/external-scaler-azure-cosmos-db-0.1.0.tgz version: 0.1.0 keda: + - apiVersion: v2 + appVersion: 2.12.1 + created: "2023-11-27T18:55:31.435627+01:00" + description: Event-based autoscaler for workloads on Kubernetes + digest: ee87da063be94f3f65661656602775c38ab723374c9892ecc73c1cea269e64c0 + home: https://github.com/kedacore/keda + icon: https://raw.githubusercontent.com/kedacore/keda/main/images/keda-logo-500x500-white.png + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zroubali@redhat.com + name: Zbynek Roubalik + name: keda + sources: + - https://github.com/kedacore/keda + urls: + - https://kedacore.github.io/charts/keda-2.12.1.tgz + version: 2.12.1 - apiVersion: v2 appVersion: 2.12.0 - created: "2023-10-05T15:23:31.340082+02:00" + created: "2023-11-27T18:55:31.432758+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -47,7 +70,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2023-10-05T15:23:31.336462+02:00" + created: "2023-11-27T18:55:31.428389+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -70,7 +93,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2023-10-05T15:23:31.333625+02:00" + created: "2023-11-27T18:55:31.425693+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -93,7 +116,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2023-10-05T15:23:31.331321+02:00" + created: "2023-11-27T18:55:31.421954+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -116,7 +139,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2023-10-05T15:23:31.328662+02:00" + created: "2023-11-27T18:55:31.418432+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -139,7 +162,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-10-05T15:23:31.32613+02:00" + created: "2023-11-27T18:55:31.416006+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -162,7 +185,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-10-05T15:23:31.323816+02:00" + created: "2023-11-27T18:55:31.41325+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -185,7 +208,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2023-10-05T15:23:31.381934+02:00" + created: "2023-11-27T18:55:31.484734+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -208,7 +231,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-10-05T15:23:31.380124+02:00" + created: "2023-11-27T18:55:31.482114+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -231,7 +254,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-10-05T15:23:31.378026+02:00" + created: "2023-11-27T18:55:31.479982+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -254,7 +277,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2023-10-05T15:23:31.376134+02:00" + created: "2023-11-27T18:55:31.477193+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -277,7 +300,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2023-10-05T15:23:31.373875+02:00" + created: "2023-11-27T18:55:31.475097+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -300,7 +323,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-10-05T15:23:31.371829+02:00" + created: "2023-11-27T18:55:31.472275+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -323,7 +346,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-10-05T15:23:31.369582+02:00" + created: "2023-11-27T18:55:31.47028+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -346,7 +369,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2023-10-05T15:23:31.367778+02:00" + created: "2023-11-27T18:55:31.467552+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -369,7 +392,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-10-05T15:23:31.365559+02:00" + created: "2023-11-27T18:55:31.465502+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -392,7 +415,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-10-05T15:23:31.363775+02:00" + created: "2023-11-27T18:55:31.462843+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -415,7 +438,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-10-05T15:23:31.361726+02:00" + created: "2023-11-27T18:55:31.461145+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -438,7 +461,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-10-05T15:23:31.360259+02:00" + created: "2023-11-27T18:55:31.459474+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -461,7 +484,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2023-10-05T15:23:31.358645+02:00" + created: "2023-11-27T18:55:31.457015+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -484,7 +507,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2023-10-05T15:23:31.356856+02:00" + created: "2023-11-27T18:55:31.455305+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -506,7 +529,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-10-05T15:23:31.355457+02:00" + created: "2023-11-27T18:55:31.453242+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -528,7 +551,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-10-05T15:23:31.354054+02:00" + created: "2023-11-27T18:55:31.451586+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -550,7 +573,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-10-05T15:23:31.352636+02:00" + created: "2023-11-27T18:55:31.449989+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -572,7 +595,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-10-05T15:23:31.351042+02:00" + created: "2023-11-27T18:55:31.447944+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -592,7 +615,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2023-10-05T15:23:31.349697+02:00" + created: "2023-11-27T18:55:31.446375+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -612,7 +635,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-10-05T15:23:31.348221+02:00" + created: "2023-11-27T18:55:31.444706+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -632,7 +655,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-10-05T15:23:31.346437+02:00" + created: "2023-11-27T18:55:31.442677+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -652,7 +675,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-10-05T15:23:31.344928+02:00" + created: "2023-11-27T18:55:31.441043+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -672,7 +695,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-10-05T15:23:31.343485+02:00" + created: "2023-11-27T18:55:31.439377+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -692,7 +715,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-10-05T15:23:31.341673+02:00" + created: "2023-11-27T18:55:31.437212+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -712,7 +735,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-10-05T15:23:31.321468+02:00" + created: "2023-11-27T18:55:31.410783+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -732,7 +755,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-10-05T15:23:31.320043+02:00" + created: "2023-11-27T18:55:31.408763+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -752,7 +775,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-10-05T15:23:31.318518+02:00" + created: "2023-11-27T18:55:31.406993+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -772,7 +795,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-10-05T15:23:31.316855+02:00" + created: "2023-11-27T18:55:31.405409+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -792,7 +815,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2023-10-05T15:23:31.315455+02:00" + created: "2023-11-27T18:55:31.403448+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -812,7 +835,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2023-10-05T15:23:31.314117+02:00" + created: "2023-11-27T18:55:31.401956+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -832,7 +855,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2023-10-05T15:23:31.312271+02:00" + created: "2023-11-27T18:55:31.400458+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -852,7 +875,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2023-10-05T15:23:31.310913+02:00" + created: "2023-11-27T18:55:31.398925+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -873,7 +896,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2023-10-05T15:23:31.309603+02:00" + created: "2023-11-27T18:55:31.395932+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -893,7 +916,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-10-05T15:23:31.307854+02:00" + created: "2023-11-27T18:55:31.394349+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -913,7 +936,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-10-05T15:23:31.305605+02:00" + created: "2023-11-27T18:55:31.39181+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -933,7 +956,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-10-05T15:23:31.303379+02:00" + created: "2023-11-27T18:55:31.388934+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -953,7 +976,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2023-10-05T15:23:31.301219+02:00" + created: "2023-11-27T18:55:31.386435+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -973,7 +996,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-10-05T15:23:31.299142+02:00" + created: "2023-11-27T18:55:31.38451+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -993,7 +1016,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-10-05T15:23:31.297472+02:00" + created: "2023-11-27T18:55:31.38222+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1009,7 +1032,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-10-05T15:23:31.295409+02:00" + created: "2023-11-27T18:55:31.380315+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1025,7 +1048,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-10-05T15:23:31.29363+02:00" + created: "2023-11-27T18:55:31.377464+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1041,7 +1064,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-10-05T15:23:31.291594+02:00" + created: "2023-11-27T18:55:31.375538+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1057,7 +1080,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-10-05T15:23:31.289579+02:00" + created: "2023-11-27T18:55:31.371971+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1073,7 +1096,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2023-10-05T15:23:31.287751+02:00" + created: "2023-11-27T18:55:31.369804+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1089,7 +1112,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2023-10-05T15:23:31.285094+02:00" + created: "2023-11-27T18:55:31.367829+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1105,7 +1128,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2023-10-05T15:23:31.283203+02:00" + created: "2023-11-27T18:55:31.364383+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1120,32 +1143,9 @@ entries: - https://kedacore.github.io/charts/keda-1.0.0.tgz version: 1.0.0 keda-add-ons-http: - - apiVersion: v2 - appVersion: 0.6.0 - created: "2023-10-05T15:23:31.389125+02:00" - description: Event-based autoscaler for HTTP workloads on Kubernetes - digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 - home: https://github.com/kedacore/http-add-on - kubeVersion: '>=v1.23.0-0' - maintainers: - - email: ahmels@microsoft.com - name: Ahmed ElSayed - - email: jorge_turrado@hotmail.es - name: Jorge Turrado - - email: kerkhove.tom@gmail.com - name: Tom Kerkhove - - email: zbynek@kedify.io - name: Zbynek Roubalik - name: keda-add-ons-http - sources: - - https://github.com/kedacore/http-add-on - type: application - urls: - - https://kedacore.github.io/charts/keda-add-ons-http-0.6.0.tgz - version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-10-05T15:23:31.388599+02:00" + created: "2023-11-27T18:55:31.490795+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1168,7 +1168,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-10-05T15:23:31.387859+02:00" + created: "2023-11-27T18:55:31.490238+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1191,7 +1191,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-10-05T15:23:31.386698+02:00" + created: "2023-11-27T18:55:31.489696+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1214,7 +1214,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-10-05T15:23:31.386178+02:00" + created: "2023-11-27T18:55:31.489147+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1237,7 +1237,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-10-05T15:23:31.385617+02:00" + created: "2023-11-27T18:55:31.488603+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1260,7 +1260,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-10-05T15:23:31.385115+02:00" + created: "2023-11-27T18:55:31.488117+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1283,7 +1283,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-10-05T15:23:31.384672+02:00" + created: "2023-11-27T18:55:31.48766+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1308,7 +1308,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-10-05T15:23:31.384209+02:00" + created: "2023-11-27T18:55:31.487182+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1332,7 +1332,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-10-05T15:23:31.383774+02:00" + created: "2023-11-27T18:55:31.486703+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1356,7 +1356,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-10-05T15:23:31.383311+02:00" + created: "2023-11-27T18:55:31.486234+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1380,7 +1380,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-10-05T15:23:31.382865+02:00" + created: "2023-11-27T18:55:31.485733+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1404,7 +1404,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2023-10-05T15:23:31.382456+02:00" + created: "2023-11-27T18:55:31.485294+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1428,7 +1428,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2023-10-05T15:23:31.382202+02:00" + created: "2023-11-27T18:55:31.485036+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1450,4 +1450,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2023-10-05T15:23:31.280208+02:00" +generated: "2023-11-27T18:55:31.359315+01:00" diff --git a/docs/keda-2.12.1.tgz b/docs/keda-2.12.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..efa8721ecb24e350751232f3196a7892c7abafb5 GIT binary patch literal 92517 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%0DMt7&=lD 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 X-Lre1@$>%!00960%N2o*0Q?I8beasf literal 0 HcmV?d00001 diff --git a/keda/Chart.yaml b/keda/Chart.yaml index 33134cef..00c4e2ed 100644 --- a/keda/Chart.yaml +++ b/keda/Chart.yaml @@ -8,11 +8,11 @@ kubeVersion: ">=v1.23.0-0" # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 2.12.0 +version: 2.12.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 2.12.0 +appVersion: 2.12.1 home: https://github.com/kedacore/keda icon: https://raw.githubusercontent.com/kedacore/keda/main/images/keda-logo-500x500-white.png From 7836b43eb3e81f3be17ea21c5fdf0b51e2752052 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Thu, 30 Nov 2023 10:43:41 +0100 Subject: [PATCH 22/41] fix: restore http-add-on chart 0.6.0 indexing (#579) Signed-off-by: Dmytro Kovalenko --- docs/index.yaml | 161 +++++++++++++++++++++++++++--------------------- keda/README.md | 6 +- 2 files changed, 96 insertions(+), 71 deletions(-) diff --git a/docs/index.yaml b/docs/index.yaml index fa526d9b..b83a3f1b 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2023-11-27T18:55:31.362105+01:00" + created: "2023-11-30T09:12:28.68395+01:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -24,7 +24,7 @@ entries: keda: - apiVersion: v2 appVersion: 2.12.1 - created: "2023-11-27T18:55:31.435627+01:00" + created: "2023-11-30T09:12:28.740582+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ee87da063be94f3f65661656602775c38ab723374c9892ecc73c1cea269e64c0 home: https://github.com/kedacore/keda @@ -47,7 +47,7 @@ entries: version: 2.12.1 - apiVersion: v2 appVersion: 2.12.0 - created: "2023-11-27T18:55:31.432758+01:00" + created: "2023-11-30T09:12:28.737913+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -70,7 +70,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2023-11-27T18:55:31.428389+01:00" + created: "2023-11-30T09:12:28.735381+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -93,7 +93,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2023-11-27T18:55:31.425693+01:00" + created: "2023-11-30T09:12:28.732731+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -116,7 +116,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2023-11-27T18:55:31.421954+01:00" + created: "2023-11-30T09:12:28.730667+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -139,7 +139,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2023-11-27T18:55:31.418432+01:00" + created: "2023-11-30T09:12:28.728117+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -162,7 +162,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-11-27T18:55:31.416006+01:00" + created: "2023-11-30T09:12:28.726019+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -185,7 +185,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-11-27T18:55:31.41325+01:00" + created: "2023-11-30T09:12:28.72344+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -208,7 +208,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2023-11-27T18:55:31.484734+01:00" + created: "2023-11-30T09:12:28.780031+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -231,7 +231,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-11-27T18:55:31.482114+01:00" + created: "2023-11-30T09:12:28.777909+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -254,7 +254,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-11-27T18:55:31.479982+01:00" + created: "2023-11-30T09:12:28.776116+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -277,7 +277,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2023-11-27T18:55:31.477193+01:00" + created: "2023-11-30T09:12:28.773922+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -300,7 +300,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2023-11-27T18:55:31.475097+01:00" + created: "2023-11-30T09:12:28.772046+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -323,7 +323,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-11-27T18:55:31.472275+01:00" + created: "2023-11-30T09:12:28.769801+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -346,7 +346,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-11-27T18:55:31.47028+01:00" + created: "2023-11-30T09:12:28.76788+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -369,7 +369,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2023-11-27T18:55:31.467552+01:00" + created: "2023-11-30T09:12:28.766195+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -392,7 +392,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-11-27T18:55:31.465502+01:00" + created: "2023-11-30T09:12:28.764164+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -415,7 +415,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-11-27T18:55:31.462843+01:00" + created: "2023-11-30T09:12:28.762407+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -438,7 +438,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-11-27T18:55:31.461145+01:00" + created: "2023-11-30T09:12:28.760718+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -461,7 +461,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-11-27T18:55:31.459474+01:00" + created: "2023-11-30T09:12:28.759253+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -484,7 +484,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2023-11-27T18:55:31.457015+01:00" + created: "2023-11-30T09:12:28.757871+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -507,7 +507,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2023-11-27T18:55:31.455305+01:00" + created: "2023-11-30T09:12:28.75646+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -529,7 +529,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-11-27T18:55:31.453242+01:00" + created: "2023-11-30T09:12:28.754845+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -551,7 +551,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-11-27T18:55:31.451586+01:00" + created: "2023-11-30T09:12:28.753487+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -573,7 +573,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-11-27T18:55:31.449989+01:00" + created: "2023-11-30T09:12:28.752152+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -595,7 +595,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-11-27T18:55:31.447944+01:00" + created: "2023-11-30T09:12:28.750645+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -615,7 +615,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2023-11-27T18:55:31.446375+01:00" + created: "2023-11-30T09:12:28.749292+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -635,7 +635,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-11-27T18:55:31.444706+01:00" + created: "2023-11-30T09:12:28.747851+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -655,7 +655,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-11-27T18:55:31.442677+01:00" + created: "2023-11-30T09:12:28.74645+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -675,7 +675,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-27T18:55:31.441043+01:00" + created: "2023-11-30T09:12:28.744667+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -695,7 +695,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-27T18:55:31.439377+01:00" + created: "2023-11-30T09:12:28.74329+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -715,7 +715,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-27T18:55:31.437212+01:00" + created: "2023-11-30T09:12:28.741928+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -735,7 +735,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-27T18:55:31.410783+01:00" + created: "2023-11-30T09:12:28.721051+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -755,7 +755,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-27T18:55:31.408763+01:00" + created: "2023-11-30T09:12:28.719494+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -775,7 +775,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-27T18:55:31.406993+01:00" + created: "2023-11-30T09:12:28.718177+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -795,7 +795,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-27T18:55:31.405409+01:00" + created: "2023-11-30T09:12:28.716879+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -815,7 +815,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2023-11-27T18:55:31.403448+01:00" + created: "2023-11-30T09:12:28.715224+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -835,7 +835,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2023-11-27T18:55:31.401956+01:00" + created: "2023-11-30T09:12:28.71398+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -855,7 +855,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2023-11-27T18:55:31.400458+01:00" + created: "2023-11-30T09:12:28.712737+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -875,7 +875,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2023-11-27T18:55:31.398925+01:00" + created: "2023-11-30T09:12:28.711127+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -896,7 +896,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2023-11-27T18:55:31.395932+01:00" + created: "2023-11-30T09:12:28.70989+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -916,7 +916,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-27T18:55:31.394349+01:00" + created: "2023-11-30T09:12:28.708648+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -936,7 +936,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-27T18:55:31.39181+01:00" + created: "2023-11-30T09:12:28.706212+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -956,7 +956,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-27T18:55:31.388934+01:00" + created: "2023-11-30T09:12:28.704072+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -976,7 +976,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2023-11-27T18:55:31.386435+01:00" + created: "2023-11-30T09:12:28.701927+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -996,7 +996,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-11-27T18:55:31.38451+01:00" + created: "2023-11-30T09:12:28.700049+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -1016,7 +1016,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-11-27T18:55:31.38222+01:00" + created: "2023-11-30T09:12:28.698225+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1032,7 +1032,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-11-27T18:55:31.380315+01:00" + created: "2023-11-30T09:12:28.696224+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1048,7 +1048,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-11-27T18:55:31.377464+01:00" + created: "2023-11-30T09:12:28.694751+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1064,7 +1064,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-11-27T18:55:31.375538+01:00" + created: "2023-11-30T09:12:28.692953+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1080,7 +1080,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-11-27T18:55:31.371971+01:00" + created: "2023-11-30T09:12:28.691479+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1096,7 +1096,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2023-11-27T18:55:31.369804+01:00" + created: "2023-11-30T09:12:28.689924+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1112,7 +1112,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2023-11-27T18:55:31.367829+01:00" + created: "2023-11-30T09:12:28.687836+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1128,7 +1128,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2023-11-27T18:55:31.364383+01:00" + created: "2023-11-30T09:12:28.685969+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1143,9 +1143,32 @@ entries: - https://kedacore.github.io/charts/keda-1.0.0.tgz version: 1.0.0 keda-add-ons-http: + - apiVersion: v2 + appVersion: 0.6.0 + created: "2023-11-30T09:12:28.785859+01:00" + description: Event-based autoscaler for HTTP workloads on Kubernetes + digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 + home: https://github.com/kedacore/http-add-on + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zbynek@kedify.io + name: Zbynek Roubalik + name: keda-add-ons-http + sources: + - https://github.com/kedacore/http-add-on + type: application + urls: + - https://kedacore.github.io/charts/keda-add-ons-http-0.6.0.tgz + version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-27T18:55:31.490795+01:00" + created: "2023-11-30T09:12:28.785385+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1168,7 +1191,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-27T18:55:31.490238+01:00" + created: "2023-11-30T09:12:28.784908+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1191,7 +1214,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-27T18:55:31.489696+01:00" + created: "2023-11-30T09:12:28.784438+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1214,7 +1237,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-27T18:55:31.489147+01:00" + created: "2023-11-30T09:12:28.783948+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1237,7 +1260,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-11-27T18:55:31.488603+01:00" + created: "2023-11-30T09:12:28.783451+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1260,7 +1283,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-11-27T18:55:31.488117+01:00" + created: "2023-11-30T09:12:28.783023+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1283,7 +1306,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-11-27T18:55:31.48766+01:00" + created: "2023-11-30T09:12:28.78261+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1308,7 +1331,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-11-27T18:55:31.487182+01:00" + created: "2023-11-30T09:12:28.78218+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1332,7 +1355,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-27T18:55:31.486703+01:00" + created: "2023-11-30T09:12:28.781764+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1356,7 +1379,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-27T18:55:31.486234+01:00" + created: "2023-11-30T09:12:28.781339+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1380,7 +1403,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-27T18:55:31.485733+01:00" + created: "2023-11-30T09:12:28.780926+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1404,7 +1427,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2023-11-27T18:55:31.485294+01:00" + created: "2023-11-30T09:12:28.780543+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1428,7 +1451,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2023-11-27T18:55:31.485036+01:00" + created: "2023-11-30T09:12:28.780303+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1450,4 +1473,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2023-11-27T18:55:31.359315+01:00" +generated: "2023-11-30T09:12:28.683656+01:00" diff --git a/keda/README.md b/keda/README.md index 758c39db..379038af 100644 --- a/keda/README.md +++ b/keda/README.md @@ -21,7 +21,7 @@ helm repo add kedacore https://kedacore.github.io/charts helm repo update kubectl create namespace keda -helm install keda kedacore/keda --namespace keda --version 2.12.0 +helm install keda kedacore/keda --namespace keda --version 2.12.1 ``` ## Introduction @@ -36,7 +36,7 @@ To install the chart with the release name `keda`: ```console $ kubectl create namespace keda -$ helm install keda kedacore/keda --namespace keda --version 2.12.0 +$ helm install keda kedacore/keda --namespace keda --version 2.12.1 ``` ## Uninstalling the Chart @@ -126,6 +126,7 @@ their default values. | `logging.operator.level` | string | `"info"` | Logging level for KEDA Operator. allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string | | `logging.operator.timeEncoding` | string | `"rfc3339"` | Logging time encoding for KEDA Operator. allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` | | `operator.affinity` | object | `{}` | [Affinity] for pod scheduling for KEDA operator. Takes precedence over the `affinity` field | +| `operator.disableCompression` | bool | `true` | Disable response compression for k8s restAPI in client-go. Disabling compression simply means that turns off the process of making data smaller for K8s restAPI in client-go for faster transmission. | | `operator.livenessProbe` | object | `{"failureThreshold":3,"initialDelaySeconds":25,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Liveness probes for operator ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)) | | `operator.name` | string | `"keda-operator"` | Name of the KEDA operator | | `operator.readinessProbe` | object | `{"failureThreshold":3,"initialDelaySeconds":20,"periodSeconds":3,"successThreshold":1,"timeoutSeconds":1}` | Readiness probes for operator ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)) | @@ -154,6 +155,7 @@ their default values. | `logging.metricServer.level` | int | `0` | Logging level for Metrics Server. allowed values: `0` for info, `4` for debug, or an integer value greater than 0, specified as string | | `logging.metricServer.stderrthreshold` | string | `"ERROR"` | Logging stderrthreshold for Metrics Server allowed values: 'DEBUG','INFO','WARN','ERROR','ALERT','EMERG' | | `metricsServer.affinity` | object | `{}` | [Affinity] for pod scheduling for Metrics API Server. Takes precedence over the `affinity` field | +| `metricsServer.disableCompression` | bool | `true` | Disable response compression for k8s restAPI in client-go. Disabling compression simply means that turns off the process of making data smaller for K8s restAPI in client-go for faster transmission. | | `metricsServer.dnsPolicy` | string | `"ClusterFirst"` | Defined the DNS policy for the metric server | | `metricsServer.livenessProbe` | object | `{"failureThreshold":3,"initialDelaySeconds":5,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1}` | Liveness probes for Metrics API Server ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/)) | | `metricsServer.readinessProbe` | object | `{"failureThreshold":3,"initialDelaySeconds":5,"periodSeconds":3,"successThreshold":1,"timeoutSeconds":1}` | Readiness probes for Metrics API Server ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)) | From b28d271ec54686f8b1bd81b6de152df0b556de75 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Sun, 3 Dec 2023 23:13:21 +0100 Subject: [PATCH 23/41] fix(add-on): Use 'main' tag for KEDA installation during CI (#582) Signed-off-by: Dmytro Kovalenko --- .github/workflows/ci-http-add-on.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-http-add-on.yml b/.github/workflows/ci-http-add-on.yml index 6fa77966..87907f13 100644 --- a/.github/workflows/ci-http-add-on.yml +++ b/.github/workflows/ci-http-add-on.yml @@ -77,8 +77,19 @@ jobs: - name: Create KEDA namespace run: kubectl create ns keda + - name: Generate values + run: | + cat < keda-values.yaml + image: + keda: + tag: main + metricsApiServer: + tag: main + webhooks: + tag: main + - name: Install KEDA chart - run: helm install keda ./keda/ --namespace keda + run: helm install keda ./keda/ --namespace keda --values keda-values.yaml - name: Generate values run: | From 1c7f0f956a93bc47fd61ad2e2fb8e0b60427e3de Mon Sep 17 00:00:00 2001 From: Frank Kloeker Date: Sun, 3 Dec 2023 23:15:46 +0100 Subject: [PATCH 24/41] set securityContext for http-add-on chart (#561) Co-authored-by: Tom Kerkhove Signed-off-by: Dmytro Kovalenko --- http-add-on/README.md | 68 +++++++++++++++++++ http-add-on/README.md.gotmpl | 66 ++++++++++++++++++ .../templates/interceptor/deployment.yaml | 14 ++++ .../templates/operator/deployment.yaml | 23 ++++++- http-add-on/templates/scaler/deployment.yaml | 14 ++++ http-add-on/values.yaml | 66 ++++++++++++++++++ 6 files changed, 250 insertions(+), 1 deletion(-) diff --git a/http-add-on/README.md b/http-add-on/README.md index 0c529aa3..83835430 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -92,7 +92,9 @@ their default values. | `images.operator` | string | `"ghcr.io/kedacore/http-add-on-operator"` | Image name for the operator image component | | `images.scaler` | string | `"ghcr.io/kedacore/http-add-on-scaler"` | Image name for the scaler image component | | `images.tag` | string | `""` | Image tag for the http add on. This tag is applied to the images listed in `images.operator`, `images.interceptor`, and `images.scaler`. Optional, given app version of Helm chart is used by default | +| `podSecurityContext` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] for all pods | | `rbac.aggregateToDefaultRoles` | bool | `false` | Install aggregate roles for edit and view | +| `securityContext` | object | [See below](#KEDA-is-secure-by-default) | [Security context] for all containers | ### Operator @@ -171,5 +173,71 @@ be provided while installing the chart. For example, helm install http-add-on kedacore/keda-add-ons-http --namespace keda -f values.yaml ``` +## KEDA is secure by default + +Our default configuration strives to be as secure as possible. Because of that, KEDA will run as non-root and be secure-by-default. You can define global securityContext for all components or switch to granular mode and define securityContext for operator, kuberbacproxy, scaler, and interceptor: +```yaml +securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + privileged: false + readOnlyRootFilesystem: true + # runAsUser: 1000 + # runAsGroup: 1000 + # operator: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # kuberbacproxy: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # scaler: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # interceptor: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault +podSecurityContext: + fsGroup: 1000 + supplementalGroups: + - 1000 + # operator: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # scaler: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # interceptor: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 +``` + ---------------------------------------------- Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs) diff --git a/http-add-on/README.md.gotmpl b/http-add-on/README.md.gotmpl index a2acc973..eae5d371 100644 --- a/http-add-on/README.md.gotmpl +++ b/http-add-on/README.md.gotmpl @@ -135,5 +135,71 @@ be provided while installing the chart. For example, helm install http-add-on kedacore/keda-add-ons-http --namespace keda -f values.yaml ``` +## KEDA is secure by default + +Our default configuration strives to be as secure as possible. Because of that, KEDA will run as non-root and be secure-by-default. You can define global securityContext for all components or switch to granular mode and define securityContext for operator, kuberbacproxy, scaler, and interceptor: +```yaml +securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + privileged: false + readOnlyRootFilesystem: true + # runAsUser: 1000 + # runAsGroup: 1000 + # operator: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # kuberbacproxy: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # scaler: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # interceptor: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault +podSecurityContext: + fsGroup: 1000 + supplementalGroups: + - 1000 + # operator: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # scaler: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # interceptor: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 +``` + ---------------------------------------------- Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs) diff --git a/http-add-on/templates/interceptor/deployment.yaml b/http-add-on/templates/interceptor/deployment.yaml index c1a52311..20cd98b0 100644 --- a/http-add-on/templates/interceptor/deployment.yaml +++ b/http-add-on/templates/interceptor/deployment.yaml @@ -21,6 +21,13 @@ spec: imagePullSecrets: {{- toYaml .Values.interceptor.imagePullSecrets | nindent 8 }} serviceAccountName: {{ .Chart.Name }}-interceptor + {{- if .Values.podSecurityContext.interceptor }} + securityContext: + {{- toYaml .Values.podSecurityContext.interceptor | nindent 8 }} + {{- else }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- end }} containers: - args: image: "{{ .Values.images.interceptor }}:{{ .Values.images.tag | default .Chart.AppVersion }}" @@ -60,6 +67,13 @@ spec: name: inter-proxy resources: {{- toYaml .Values.interceptor.resources | nindent 10 }} + {{- if .Values.securityContext.interceptor }} + securityContext: + {{- toYaml .Values.securityContext.interceptor | nindent 10 }} + {{- else }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + {{- end }} terminationGracePeriodSeconds: 10 nodeSelector: kubernetes.io/os: linux diff --git a/http-add-on/templates/operator/deployment.yaml b/http-add-on/templates/operator/deployment.yaml index 9a374592..61b76b33 100644 --- a/http-add-on/templates/operator/deployment.yaml +++ b/http-add-on/templates/operator/deployment.yaml @@ -21,6 +21,13 @@ spec: imagePullSecrets: {{- toYaml .Values.operator.imagePullSecrets | nindent 8 }} serviceAccountName: {{ .Chart.Name }} + {{- if .Values.podSecurityContext.operator }} + securityContext: + {{- toYaml .Values.podSecurityContext.operator | nindent 8 }} + {{- else }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- end }} containers: - args: - --secure-listen-address=0.0.0.0:{{ .Values.operator.port | default 8443 }} @@ -28,6 +35,7 @@ spec: - --logtostderr=true - --v=10 image: "{{ .Values.images.kubeRbacProxy.name }}:{{ .Values.images.kubeRbacProxy.tag }}" + name: kube-rbac-proxy resources: limits: cpu: 300m @@ -35,7 +43,13 @@ spec: requests: cpu: 10m memory: 20Mi - name: kube-rbac-proxy + {{- if .Values.securityContext.kuberbacproxy }} + securityContext: + {{- toYaml .Values.securityContext.kuberbacproxy | nindent 10 }} + {{- else }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + {{- end }} - args: - --metrics-bind-address=127.0.0.1:8080 - --leader-elect @@ -66,6 +80,13 @@ spec: port: probes resources: {{- toYaml .Values.operator.resources | nindent 10 }} + {{- if .Values.securityContext.operator }} + securityContext: + {{- toYaml .Values.securityContext.operator | nindent 10 }} + {{- else }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + {{- end }} terminationGracePeriodSeconds: 10 nodeSelector: kubernetes.io/os: linux diff --git a/http-add-on/templates/scaler/deployment.yaml b/http-add-on/templates/scaler/deployment.yaml index 45289e80..7414990e 100644 --- a/http-add-on/templates/scaler/deployment.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -21,6 +21,13 @@ spec: imagePullSecrets: {{- toYaml .Values.scaler.imagePullSecrets | nindent 8 }} serviceAccountName: {{ .Chart.Name }}-external-scaler + {{- if .Values.podSecurityContext.scaler }} + securityContext: + {{- toYaml .Values.podSecurityContext.scaler | nindent 8 }} + {{- else }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + {{- end }} containers: - args: image: "{{ .Values.images.scaler }}:{{ .Values.images.tag | default .Chart.AppVersion }}" @@ -48,6 +55,13 @@ spec: value: "{{ .Values.scaler.streamInterval }}" resources: {{- toYaml .Values.scaler.resources | nindent 10 }} + {{- if .Values.securityContext.scaler }} + securityContext: + {{- toYaml .Values.securityContext.scaler | nindent 10 }} + {{- else }} + securityContext: + {{- toYaml .Values.securityContext | nindent 10 }} + {{- end }} terminationGracePeriodSeconds: 10 nodeSelector: kubernetes.io/os: linux diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index d5619daa..adb45bc7 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -158,3 +158,69 @@ images: rbac: # -- Install aggregate roles for edit and view aggregateToDefaultRoles: false + +# -- [Security context] for all containers +# @default -- [See below](#KEDA-is-secure-by-default) +securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + privileged: false + readOnlyRootFilesystem: true + # runAsUser: 1000 + # runAsGroup: 1000 + # operator: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # kuberbacproxy: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # scaler: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + # interceptor: + # capabilities: + # drop: + # - ALL + # allowPrivilegeEscalation: false + # readOnlyRootFilesystem: true + # seccompProfile: + # type: RuntimeDefault + +# -- [Pod security context] for all pods +# @default -- [See below](#KEDA-is-secure-by-default) +podSecurityContext: + fsGroup: 1000 + supplementalGroups: + - 1000 + # operator: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # scaler: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 + # interceptor: + # runAsNonRoot: true + # runAsUser: 1000 + # runAsGroup: 1000 + # fsGroup: 1000 From 603d337949b4d7e180225aaa2372a08082e7d274 Mon Sep 17 00:00:00 2001 From: Andrew <35912177+aballman@users.noreply.github.com> Date: Wed, 6 Dec 2023 13:52:34 -0800 Subject: [PATCH 25/41] Fix http-add-on operator resources (#567) Signed-off-by: Dmytro Kovalenko --- http-add-on/README.md | 2 ++ http-add-on/templates/operator/deployment.yaml | 7 +------ http-add-on/values.yaml | 11 +++++++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/http-add-on/README.md b/http-add-on/README.md index 83835430..74e65f0e 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -102,6 +102,8 @@ their default values. |-----------|------|---------|-------------| | `operator.affinity` | object | `{}` | Affinity for pod scheduling ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/)) | | `operator.imagePullSecrets` | list | `[]` | The image pull secrets for the operator component | +| `operator.kubeRbacProxy.resources.limits` | object | `{"cpu":"300m","memory":"200Mi"}` | The CPU/memory resource limit for the operator component's kube rbac proxy | +| `operator.kubeRbacProxy.resources.requests` | object | `{"cpu":"10m","memory":"20Mi"}` | The CPU/memory resource request for the operator component's kube rbac proxy | | `operator.nodeSelector` | object | `{}` | Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) | | `operator.port` | int | `8443` | The port for the operator main server to run on | | `operator.pullPolicy` | string | `"Always"` | The image pull policy for the operator component | diff --git a/http-add-on/templates/operator/deployment.yaml b/http-add-on/templates/operator/deployment.yaml index 61b76b33..980ee542 100644 --- a/http-add-on/templates/operator/deployment.yaml +++ b/http-add-on/templates/operator/deployment.yaml @@ -37,12 +37,7 @@ spec: image: "{{ .Values.images.kubeRbacProxy.name }}:{{ .Values.images.kubeRbacProxy.tag }}" name: kube-rbac-proxy resources: - limits: - cpu: 300m - memory: 200Mi - requests: - cpu: 10m - memory: 20Mi + {{- toYaml .Values.operator.kubeRbacProxy.resources | nindent 10 }} {{- if .Values.securityContext.kuberbacproxy }} securityContext: {{- toYaml .Values.securityContext.kuberbacproxy | nindent 10 }} diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index adb45bc7..549abce9 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -32,6 +32,17 @@ operator: # -- Affinity for pod scheduling ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/)) affinity: {} + kubeRbacProxy: + resources: + # -- The CPU/memory resource limit for the operator component's kube rbac proxy + limits: + cpu: 300m + memory: 200Mi + # -- The CPU/memory resource request for the operator component's kube rbac proxy + requests: + cpu: 10m + memory: 20Mi + scaler: # -- The image pull secrets for the scaler component imagePullSecrets: [] From ce6272c0f7038276f8d02d8c4ff03ed7cc3bd96e Mon Sep 17 00:00:00 2001 From: Andrew <35912177+aballman@users.noreply.github.com> Date: Wed, 6 Dec 2023 13:53:21 -0800 Subject: [PATCH 26/41] Fix http-add-on verbosity configuration (#568) Signed-off-by: Dmytro Kovalenko --- http-add-on/README.md | 10 +++++ .../templates/interceptor/deployment.yaml | 3 ++ .../templates/operator/deployment.yaml | 5 ++- http-add-on/templates/scaler/deployment.yaml | 3 ++ http-add-on/values.yaml | 37 +++++++++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/http-add-on/README.md b/http-add-on/README.md index 74e65f0e..58f2b7e2 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -92,6 +92,16 @@ their default values. | `images.operator` | string | `"ghcr.io/kedacore/http-add-on-operator"` | Image name for the operator image component | | `images.scaler` | string | `"ghcr.io/kedacore/http-add-on-scaler"` | Image name for the scaler image component | | `images.tag` | string | `""` | Image tag for the http add on. This tag is applied to the images listed in `images.operator`, `images.interceptor`, and `images.scaler`. Optional, given app version of Helm chart is used by default | +| `logging.interceptor.format` | string | `"console"` | Logging format for KEDA http-add-on Interceptor. allowed values: `json` or `console` | +| `logging.interceptor.level` | string | `"info"` | Logging level for KEDA http-add-on Interceptor. allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string | +| `logging.interceptor.timeEncoding` | string | `"rfc3339"` | Logging time encoding for KEDA http-add-on Interceptor. allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` | +| `logging.operator.format` | string | `"console"` | Logging format for KEDA http-add-on operator. allowed values: `json` or `console` | +| `logging.operator.kubeRbacProxy.level` | int | `10` | Logging level for KEDA http-add-on operator rbac proxy allowed values: `0` for info, `4` for debug, or an integer value greater than 0 | +| `logging.operator.level` | string | `"info"` | Logging level for KEDA http-add-on operator. allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string | +| `logging.operator.timeEncoding` | string | `"rfc3339"` | Logging time encoding for KEDA http-add-on operator. allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` | +| `logging.scaler.format` | string | `"console"` | Logging format for KEDA http-add-on Scaler. allowed values: `json` or `console` | +| `logging.scaler.level` | string | `"info"` | Logging level for KEDA http-add-on Scaler. allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string | +| `logging.scaler.timeEncoding` | string | `"rfc3339"` | Logging time encoding for KEDA http-add-on Scaler. allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` | | `podSecurityContext` | object | [See below](#KEDA-is-secure-by-default) | [Pod security context] for all pods | | `rbac.aggregateToDefaultRoles` | bool | `false` | Install aggregate roles for edit and view | | `securityContext` | object | [See below](#KEDA-is-secure-by-default) | [Security context] for all containers | diff --git a/http-add-on/templates/interceptor/deployment.yaml b/http-add-on/templates/interceptor/deployment.yaml index 20cd98b0..9090ed10 100644 --- a/http-add-on/templates/interceptor/deployment.yaml +++ b/http-add-on/templates/interceptor/deployment.yaml @@ -30,6 +30,9 @@ spec: {{- end }} containers: - args: + - "--zap-log-level={{ .Values.logging.interceptor.level }}" + - "--zap-encoder={{ .Values.logging.interceptor.format }}" + - "--zap-time-encoding={{ .Values.logging.interceptor.timeEncoding }}" image: "{{ .Values.images.interceptor }}:{{ .Values.images.tag | default .Chart.AppVersion }}" imagePullPolicy: '{{ .Values.interceptor.pullPolicy | default "Always" }}' name: "{{ .Chart.Name }}-interceptor" diff --git a/http-add-on/templates/operator/deployment.yaml b/http-add-on/templates/operator/deployment.yaml index 980ee542..5705e42d 100644 --- a/http-add-on/templates/operator/deployment.yaml +++ b/http-add-on/templates/operator/deployment.yaml @@ -33,7 +33,7 @@ spec: - --secure-listen-address=0.0.0.0:{{ .Values.operator.port | default 8443 }} - --upstream=http://127.0.0.1:8080/ - --logtostderr=true - - --v=10 + - --v={{ .Values.logging.operator.kubeRbacProxy.level }} image: "{{ .Values.images.kubeRbacProxy.name }}:{{ .Values.images.kubeRbacProxy.tag }}" name: kube-rbac-proxy resources: @@ -48,6 +48,9 @@ spec: - args: - --metrics-bind-address=127.0.0.1:8080 - --leader-elect + - --zap-log-level={{ .Values.logging.operator.level }} + - --zap-time-encoding={{ .Values.logging.operator.timeEncoding }} + - --zap-encoder={{ .Values.logging.operator.format }} image: "{{ .Values.images.operator }}:{{ .Values.images.tag | default .Chart.AppVersion }}" imagePullPolicy: '{{ .Values.operator.pullPolicy | default "Always" }}' name: "{{ .Chart.Name }}-operator" diff --git a/http-add-on/templates/scaler/deployment.yaml b/http-add-on/templates/scaler/deployment.yaml index 7414990e..03413d3d 100644 --- a/http-add-on/templates/scaler/deployment.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -30,6 +30,9 @@ spec: {{- end }} containers: - args: + - "--zap-log-level={{ .Values.logging.scaler.level }}" + - "--zap-encoder={{ .Values.logging.scaler.format }}" + - "--zap-time-encoding={{ .Values.logging.scaler.timeEncoding }}" image: "{{ .Values.images.scaler }}:{{ .Values.images.tag | default .Chart.AppVersion }}" imagePullPolicy: {{ .Values.scaler.pullPolicy | default "Always" }} name: "{{ .Chart.Name }}-external-scaler" diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index 549abce9..c21d435a 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -5,6 +5,43 @@ crds: # -- Whether to install the `HTTPScaledObject` [`CustomResourceDefinition`](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) install: true +logging: + operator: + # -- Logging level for KEDA http-add-on operator. + # allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string + level: info + # -- Logging format for KEDA http-add-on operator. + # allowed values: `json` or `console` + format: console + # -- Logging time encoding for KEDA http-add-on operator. + # allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` + timeEncoding: rfc3339 + + kubeRbacProxy: + # -- Logging level for KEDA http-add-on operator rbac proxy + # allowed values: `0` for info, `4` for debug, or an integer value greater than 0 + level: 10 + scaler: + # -- Logging level for KEDA http-add-on Scaler. + # allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string + level: info + # -- Logging format for KEDA http-add-on Scaler. + # allowed values: `json` or `console` + format: console + # -- Logging time encoding for KEDA http-add-on Scaler. + # allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` + timeEncoding: rfc3339 + interceptor: + # -- Logging level for KEDA http-add-on Interceptor. + # allowed values: `debug`, `info`, `error`, or an integer value greater than 0, specified as string + level: info + # -- Logging format for KEDA http-add-on Interceptor. + # allowed values: `json` or `console` + format: console + # -- Logging time encoding for KEDA http-add-on Interceptor. + # allowed values are `epoch`, `millis`, `nano`, `iso8601`, `rfc3339` or `rfc3339nano` + timeEncoding: rfc3339 + # operator-specific configuration values operator: # -- The image pull secrets for the operator component From 70d191c57c53ac063bfcb4c0485aa3dad3bf6b44 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Wed, 20 Dec 2023 14:57:04 +0100 Subject: [PATCH 27/41] chore: Adjust RBAC with code (#585) * chore: Adjust RBAC with code Signed-off-by: Jorge Turrado * fix typo Signed-off-by: Jorge Turrado --------- Signed-off-by: Jorge Turrado Signed-off-by: Dmytro Kovalenko --- keda/templates/manager/clusterrole.yaml | 36 ++++++++++++++++++++----- keda/templates/manager/role.yaml | 8 +++++- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/keda/templates/manager/clusterrole.yaml b/keda/templates/manager/clusterrole.yaml index d5cff9d6..201465b2 100644 --- a/keda/templates/manager/clusterrole.yaml +++ b/keda/templates/manager/clusterrole.yaml @@ -16,6 +16,13 @@ rules: resources: - configmaps - configmaps/status + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: - events verbs: - '*' @@ -50,7 +57,11 @@ rules: resources: - '*/scale' verbs: - - '*' + - get + - list + - patch + - update + - watch {{- if and .Values.certificates.autoGenerated ( not .Values.certificates.certManager.enabled ) }} - apiGroups: - admissionregistration.k8s.io @@ -93,12 +104,6 @@ rules: - jobs verbs: - '*' -- apiGroups: - - coordination.k8s.io - resources: - - leases - verbs: - - '*' - apiGroups: - eventing.keda.sh resources: @@ -160,6 +165,15 @@ rules: - delete - patch - update +- apiGroups: + - eventing.keda.sh + resources: + - cloudeventsources + verbs: + - create + - delete + - patch + - update --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole @@ -183,5 +197,13 @@ rules: - get - list - watch +- apiGroups: + - eventing.keda.sh + resources: + - cloudeventsources + verbs: + - get + - list + - watch {{- end -}} {{- end -}} diff --git a/keda/templates/manager/role.yaml b/keda/templates/manager/role.yaml index e2cd4eca..11339be0 100644 --- a/keda/templates/manager/role.yaml +++ b/keda/templates/manager/role.yaml @@ -1,5 +1,4 @@ {{- if .Values.rbac.create }} -{{- if or (and .Values.certificates.autoGenerated (not .Values.certificates.certManager.enabled)) (.Values.permissions.operator.restrict.secret) }} apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: @@ -13,6 +12,13 @@ metadata: name: {{ .Values.operator.name }} namespace: {{ .Release.Namespace }} rules: +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - '*' +{{- if or (and .Values.certificates.autoGenerated (not .Values.certificates.certManager.enabled)) (.Values.permissions.operator.restrict.secret) }} - apiGroups: - "" resources: From 298faeb4aefe541f04d9463e8b61d592ee90558f Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Mon, 8 Jan 2024 21:09:26 +0100 Subject: [PATCH 28/41] fix: Don't recreate CA with 8 months until it expires (#586) Signed-off-by: Jorge Turrado Ferrero Signed-off-by: Dmytro Kovalenko --- keda/templates/cert-manager/self-ca.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/keda/templates/cert-manager/self-ca.yaml b/keda/templates/cert-manager/self-ca.yaml index 77176c46..7eb1f82b 100644 --- a/keda/templates/cert-manager/self-ca.yaml +++ b/keda/templates/cert-manager/self-ca.yaml @@ -14,7 +14,7 @@ spec: algorithm: RSA size: 2048 duration: 8760h0m0s # 1 year - renewBefore: 5840h0m0s # 8 months + renewBefore: 720h0m0s # 1 month issuerRef: name: {{ .Values.operator.name }}-selfsigned-issuer kind: Issuer From c81ba58d256155f20978969400e77f943cbe5f3c Mon Sep 17 00:00:00 2001 From: Bhargav Ravuri Date: Wed, 17 Jan 2024 14:02:22 +0530 Subject: [PATCH 29/41] feat(ClusterRole): Add RBAC rule to allow access to `LimitRange` (#588) Signed-off-by: Dmytro Kovalenko --- keda/templates/manager/clusterrole.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/keda/templates/manager/clusterrole.yaml b/keda/templates/manager/clusterrole.yaml index 201465b2..673a5e63 100644 --- a/keda/templates/manager/clusterrole.yaml +++ b/keda/templates/manager/clusterrole.yaml @@ -39,6 +39,13 @@ rules: - get - list - watch +- apiGroups: + - "" + resources: + - limitranges + verbs: + - list + - watch - apiGroups: - "" resources: From 6c7c8e3bff7eef404293b2a5dae3927732881166 Mon Sep 17 00:00:00 2001 From: Frank Kloeker Date: Wed, 17 Jan 2024 22:03:40 +0100 Subject: [PATCH 30/41] remove not required insecureSkipTLSVerify (#564) Signed-off-by: Frank Kloeker Signed-off-by: Dmytro Kovalenko --- keda/templates/metrics-server/apiservice.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/keda/templates/metrics-server/apiservice.yaml b/keda/templates/metrics-server/apiservice.yaml index 76c2e20a..77d88137 100644 --- a/keda/templates/metrics-server/apiservice.yaml +++ b/keda/templates/metrics-server/apiservice.yaml @@ -29,4 +29,3 @@ spec: version: v1beta1 groupPriorityMinimum: 100 versionPriority: 100 - insecureSkipTLSVerify: false From 7df098b33626fb675fab5094cfcf714f0a7ae9ff Mon Sep 17 00:00:00 2001 From: ferndem <39851927+ferndem@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:15:07 +0100 Subject: [PATCH 31/41] Update templates/webhooks deployment (#590) Align deployment for extraVolumes and extraVolumesMount for fix problem Error: YAML parse error on keda/templates/webhooks/deployment.yaml: error converting YAML to JSON: yaml: line 96: did not find expected key Signed-off-by: ferndem <39851927+ferndem@users.noreply.github.com> Signed-off-by: Dmytro Kovalenko --- keda/templates/webhooks/deployment.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/keda/templates/webhooks/deployment.yaml b/keda/templates/webhooks/deployment.yaml index 314598bd..17f77bb9 100644 --- a/keda/templates/webhooks/deployment.yaml +++ b/keda/templates/webhooks/deployment.yaml @@ -137,7 +137,7 @@ spec: name: certificates readOnly: true {{- if .Values.volumes.webhooks.extraVolumeMounts }} - {{- toYaml .Values.volumes.webhooks.extraVolumeMounts | nindent 12 }} + {{- toYaml .Values.volumes.webhooks.extraVolumeMounts | nindent 10 }} {{- end }} resources: {{- if .Values.resources.webhooks }} @@ -151,7 +151,7 @@ spec: defaultMode: 420 secretName: {{ .Values.certificates.secretName }} {{- if .Values.volumes.webhooks.extraVolumes }} - {{- toYaml .Values.volumes.webhooks.extraVolumes | nindent 8 }} + {{- toYaml .Values.volumes.webhooks.extraVolumes | nindent 6 }} {{- end }} hostNetwork: {{ .Values.webhooks.useHostNetwork }} nodeSelector: From bf24c714e30213893e09a00529ad89e213ba454d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milan=20Pl=C5=BE=C3=ADk?= <4592597+mplzik@users.noreply.github.com> Date: Thu, 18 Jan 2024 18:29:51 +0100 Subject: [PATCH 32/41] Fix Prometheus metrics handling for the operator. (#555) The current state of the Helm chart is slightly confusing, because: - There's no easy way to really disable prometheus metrics -- `--enable-prometheus-metrics` defaults to true anthe current code either emits `--enable-prometheus-metrics=true` or nothing at all (making it `true` once again). - The `http` container port is actually a `metrics` port (by convention from .e.g. webhook), but is present regardless of whether Prometheus metrics are enabled or not. To make it less confusing, this PR proposes renaming it. Signed-off-by: Milan Plzik Signed-off-by: Jorge Turrado Ferrero Co-authored-by: Jorge Turrado Ferrero Signed-off-by: Dmytro Kovalenko --- keda/templates/manager/deployment.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/keda/templates/manager/deployment.yaml b/keda/templates/manager/deployment.yaml index de67906b..c70d7546 100644 --- a/keda/templates/manager/deployment.yaml +++ b/keda/templates/manager/deployment.yaml @@ -93,9 +93,9 @@ spec: - "--webhooks-service-name={{ .Values.webhooks.name }}" - "--k8s-cluster-name={{ .Values.clusterName }}" - "--k8s-cluster-domain={{ .Values.clusterDomain }}" + - "--enable-prometheus-metrics={{ .Values.prometheus.operator.enabled }}" {{- if .Values.prometheus.operator.enabled }} - "--metrics-bind-address=:{{ .Values.prometheus.operator.port }}" - - "--enable-prometheus-metrics={{ .Values.prometheus.operator.enabled }}" {{- end }} {{- if .Values.opentelemetry.operator.enabled }} - "--enable-opentelemetry-metrics={{ .Values.opentelemetry.operator.enabled}}" @@ -126,9 +126,11 @@ spec: failureThreshold: {{ .Values.operator.readinessProbe.failureThreshold }} successThreshold: {{ .Values.operator.readinessProbe.successThreshold }} ports: - - containerPort: 8080 - name: http + {{- if .Values.prometheus.operator.enabled }} + - containerPort: {{ .Values.prometheus.operator.port }} + name: metrics protocol: TCP + {{- end }} - containerPort: 9666 name: metricsservice protocol: TCP From b35727c66206c71438ec69772457b79e03c9e8f2 Mon Sep 17 00:00:00 2001 From: choisungwook Date: Fri, 19 Jan 2024 02:34:10 +0900 Subject: [PATCH 33/41] Fix Remove app.kubernetes.io/instance label in crd (#556) Signed-off-by: choisungwook Signed-off-by: Dmytro Kovalenko --- keda/templates/_helpers.tpl | 13 ++++++++++--- .../crds/crd-clustertriggerauthentications.yaml | 2 +- keda/templates/crds/crd-scaledjobs.yaml | 2 +- keda/templates/crds/crd-scaledobjects.yaml | 2 +- keda/templates/crds/crd-triggerauthentications.yaml | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/keda/templates/_helpers.tpl b/keda/templates/_helpers.tpl index 1fb210c7..3963c42f 100644 --- a/keda/templates/_helpers.tpl +++ b/keda/templates/_helpers.tpl @@ -8,17 +8,24 @@ Create chart name and version as used by the chart label. {{- end -}} {{/* -Generate basic labels +Generate basic labels for CRD */}} -{{- define "keda.labels" }} +{{- define "keda.crd-labels" }} helm.sh/chart: {{ include "keda.chart" . }} app.kubernetes.io/component: operator app.kubernetes.io/managed-by: {{ .Release.Service }} -app.kubernetes.io/instance: {{ .Release.Name }} app.kubernetes.io/part-of: {{ .Values.operator.name }} {{- if .Chart.AppVersion }} app.kubernetes.io/version: {{ .Chart.AppVersion }} {{- end }} +{{- end }} + +{{/* +Generate basic labels +*/}} +{{- define "keda.labels" -}} +{{- include "keda.crd-labels" . }} +app.kubernetes.io/instance: {{ .Release.Name }} {{- if .Values.additionalLabels }} {{ toYaml .Values.additionalLabels }} {{- end }} diff --git a/keda/templates/crds/crd-clustertriggerauthentications.yaml b/keda/templates/crds/crd-clustertriggerauthentications.yaml index 792a7d18..217f6277 100644 --- a/keda/templates/crds/crd-clustertriggerauthentications.yaml +++ b/keda/templates/crds/crd-clustertriggerauthentications.yaml @@ -9,7 +9,7 @@ metadata: {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} - {{- include "keda.labels" . | indent 4 }} + {{- include "keda.crd-labels" . | indent 4 }} name: clustertriggerauthentications.keda.sh spec: group: keda.sh diff --git a/keda/templates/crds/crd-scaledjobs.yaml b/keda/templates/crds/crd-scaledjobs.yaml index 8473b6f8..f9ec76bc 100644 --- a/keda/templates/crds/crd-scaledjobs.yaml +++ b/keda/templates/crds/crd-scaledjobs.yaml @@ -9,7 +9,7 @@ metadata: {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} - {{- include "keda.labels" . | indent 4 }} + {{- include "keda.crd-labels" . | indent 4 }} name: scaledjobs.keda.sh spec: group: keda.sh diff --git a/keda/templates/crds/crd-scaledobjects.yaml b/keda/templates/crds/crd-scaledobjects.yaml index 05f98ce1..c5ac2116 100644 --- a/keda/templates/crds/crd-scaledobjects.yaml +++ b/keda/templates/crds/crd-scaledobjects.yaml @@ -9,7 +9,7 @@ metadata: {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} - {{- include "keda.labels" . | indent 4 }} + {{- include "keda.crd-labels" . | indent 4 }} name: scaledobjects.keda.sh spec: group: keda.sh diff --git a/keda/templates/crds/crd-triggerauthentications.yaml b/keda/templates/crds/crd-triggerauthentications.yaml index 4facbdba..e7801585 100644 --- a/keda/templates/crds/crd-triggerauthentications.yaml +++ b/keda/templates/crds/crd-triggerauthentications.yaml @@ -9,7 +9,7 @@ metadata: {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} - {{- include "keda.labels" . | indent 4 }} + {{- include "keda.crd-labels" . | indent 4 }} name: triggerauthentications.keda.sh spec: group: keda.sh From f77ffd6653b4b96d9a948a3571e3cb532ce31e66 Mon Sep 17 00:00:00 2001 From: Adam Walford <34867732+awalford16@users.noreply.github.com> Date: Thu, 18 Jan 2024 17:35:45 +0000 Subject: [PATCH 34/41] Support crd-specific annotations (#584) * support crd-specific annotations Signed-off-by: Adam Walford * update readme Signed-off-by: Adam Walford * update docs using helm-docs Signed-off-by: Adam Walford --------- Signed-off-by: Adam Walford Co-authored-by: Adam Walford Co-authored-by: Tom Kerkhove Signed-off-by: Dmytro Kovalenko --- keda/README.md | 1 + keda/templates/crds/crd-clustertriggerauthentications.yaml | 4 ++-- keda/templates/crds/crd-scaledjobs.yaml | 4 ++-- keda/templates/crds/crd-scaledobjects.yaml | 4 ++-- keda/templates/crds/crd-triggerauthentications.yaml | 4 ++-- keda/values.yaml | 5 +++++ 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/keda/README.md b/keda/README.md index 379038af..468d378b 100644 --- a/keda/README.md +++ b/keda/README.md @@ -78,6 +78,7 @@ their default values. | `certificates.secretName` | string | `"kedaorg-certs"` | Secret name to be mounted with KEDA TLS certificates | | `clusterDomain` | string | `"cluster.local"` | Kubernetes cluster domain | | `clusterName` | string | `"kubernetes-default"` | Kubernetes cluster name. Used in features such as emitting CloudEvents | +| `crds.additionalAnnotations` | object | `{}` | Custom annotations specifically for CRDs | | `crds.install` | bool | `true` | Defines whether the KEDA CRDs have to be installed or not. | | `env` | list | `[]` | Additional environment variables that will be passed onto all KEDA components | | `extraObjects` | list | `[]` | Array of extra K8s manifests to deploy | diff --git a/keda/templates/crds/crd-clustertriggerauthentications.yaml b/keda/templates/crds/crd-clustertriggerauthentications.yaml index 217f6277..4f11d292 100644 --- a/keda/templates/crds/crd-clustertriggerauthentications.yaml +++ b/keda/templates/crds/crd-clustertriggerauthentications.yaml @@ -4,8 +4,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 - {{- if .Values.additionalAnnotations }} - {{- toYaml .Values.additionalAnnotations | nindent 4 }} + {{- if (or .Values.crds.additionalAnnotations .Values.additionalAnnotations) }} + {{- toYaml (merge .Values.crds.additionalAnnotations .Values.additionalAnnotations) | nindent 4 }} {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} diff --git a/keda/templates/crds/crd-scaledjobs.yaml b/keda/templates/crds/crd-scaledjobs.yaml index f9ec76bc..69b2ffbd 100644 --- a/keda/templates/crds/crd-scaledjobs.yaml +++ b/keda/templates/crds/crd-scaledjobs.yaml @@ -4,8 +4,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 - {{- if .Values.additionalAnnotations }} - {{- toYaml .Values.additionalAnnotations | nindent 4 }} + {{- if (or .Values.crds.additionalAnnotations .Values.additionalAnnotations) }} + {{- toYaml (merge .Values.crds.additionalAnnotations .Values.additionalAnnotations) | nindent 4 }} {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} diff --git a/keda/templates/crds/crd-scaledobjects.yaml b/keda/templates/crds/crd-scaledobjects.yaml index c5ac2116..e4dc4b8b 100644 --- a/keda/templates/crds/crd-scaledobjects.yaml +++ b/keda/templates/crds/crd-scaledobjects.yaml @@ -4,8 +4,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 - {{- if .Values.additionalAnnotations }} - {{- toYaml .Values.additionalAnnotations | nindent 4 }} + {{- if (or .Values.crds.additionalAnnotations .Values.additionalAnnotations) }} + {{- toYaml (merge .Values.crds.additionalAnnotations .Values.additionalAnnotations) | nindent 4 }} {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} diff --git a/keda/templates/crds/crd-triggerauthentications.yaml b/keda/templates/crds/crd-triggerauthentications.yaml index e7801585..0df3f515 100644 --- a/keda/templates/crds/crd-triggerauthentications.yaml +++ b/keda/templates/crds/crd-triggerauthentications.yaml @@ -4,8 +4,8 @@ kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 - {{- if .Values.additionalAnnotations }} - {{- toYaml .Values.additionalAnnotations | nindent 4 }} + {{- if (or .Values.crds.additionalAnnotations .Values.additionalAnnotations) }} + {{- toYaml (merge .Values.crds.additionalAnnotations .Values.additionalAnnotations) | nindent 4 }} {{- end }} labels: app.kubernetes.io/name: {{ .Values.operator.name }} diff --git a/keda/values.yaml b/keda/values.yaml index 98500dd0..c9d87162 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -42,6 +42,11 @@ crds: # -- Defines whether the KEDA CRDs have to be installed or not. install: true + # -- Custom annotations specifically for CRDs + additionalAnnotations: + {} + # foo: bar + # -- Defines Kubernetes namespaces to watch to scale their workloads. Default watches all namespaces watchNamespace: "" From 37b5c503f08bb4c2787009eb1712a291f702d13a Mon Sep 17 00:00:00 2001 From: Quentin Bisson Date: Fri, 19 Jan 2024 11:01:20 +0100 Subject: [PATCH 35/41] Add ciliumnetworkpolicies (#558) Signed-off-by: Dmytro Kovalenko --- keda/README.md | 2 ++ .../manager/ciliumnetworkpolicy.yaml | 27 +++++++++++++++++++ .../metrics-server/ciliumnetworkpolicy.yaml | 26 ++++++++++++++++++ .../webhooks/ciliumnetworkpolicy.yaml | 27 +++++++++++++++++++ keda/values.yaml | 6 +++++ 5 files changed, 88 insertions(+) create mode 100644 keda/templates/manager/ciliumnetworkpolicy.yaml create mode 100644 keda/templates/metrics-server/ciliumnetworkpolicy.yaml create mode 100644 keda/templates/webhooks/ciliumnetworkpolicy.yaml diff --git a/keda/README.md b/keda/README.md index 468d378b..80126252 100644 --- a/keda/README.md +++ b/keda/README.md @@ -90,6 +90,8 @@ their default values. | `http.timeout` | int | `3000` | The default HTTP timeout to use for all scalers that use raw HTTP clients (some scalers use SDKs to access target services. These have built-in HTTP clients, and the timeout does not necessarily apply to them) | | `image.pullPolicy` | string | `"Always"` | Image pullPolicy for all KEDA components | | `imagePullSecrets` | list | `[]` | Name of secret to use to pull images to use to pull Docker images | +| `networkPolicy.enabled` | bool | `false` | Enable network policies | +| `networkPolicy.flavor` | string | `"cilium"` | Flavor of the network policies (cilium) | | `nodeSelector` | object | `{}` | Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) | | `podIdentity.activeDirectory.identity` | string | `""` | Identity in Azure Active Directory to use for Azure pod identity | | `podIdentity.aws.irsa.audience` | string | `"sts.amazonaws.com"` | Sets the token audience for IRSA. This will be set as an annotation on the KEDA service account. | diff --git a/keda/templates/manager/ciliumnetworkpolicy.yaml b/keda/templates/manager/ciliumnetworkpolicy.yaml new file mode 100644 index 00000000..f9186810 --- /dev/null +++ b/keda/templates/manager/ciliumnetworkpolicy.yaml @@ -0,0 +1,27 @@ +{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "cilium") }} +apiVersion: "cilium.io/v2" +kind: CiliumNetworkPolicy +metadata: + name: {{ .Values.operator.name }} + namespace: {{ .Release.Namespace }} + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + app: {{ .Values.operator.name }} + name: {{ .Values.operator.name }} + app.kubernetes.io/name: {{ .Values.operator.name }} + {{- include "keda.labels" . | indent 4 }} +spec: + endpointSelector: + matchLabels: + app: {{ .Values.operator.name }} + egress: + - toEntities: + - kube-apiserver + - cluster + ingress: + - fromEntities: + - cluster +{{ end }} diff --git a/keda/templates/metrics-server/ciliumnetworkpolicy.yaml b/keda/templates/metrics-server/ciliumnetworkpolicy.yaml new file mode 100644 index 00000000..887ef5c2 --- /dev/null +++ b/keda/templates/metrics-server/ciliumnetworkpolicy.yaml @@ -0,0 +1,26 @@ +{{- if and .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "cilium") }} +apiVersion: "cilium.io/v2" +kind: CiliumNetworkPolicy +metadata: + name: {{ .Values.operator.name }}-metrics-apiserver + namespace: {{ .Release.Namespace }} + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + app: {{ .Values.operator.name }}-metrics-apiserver + app.kubernetes.io/name: {{ .Values.operator.name }}-metrics-apiserver + {{- include "keda.labels" . | indent 4 }} +spec: + endpointSelector: + matchLabels: + app: {{ .Values.operator.name }}-metrics-apiserver + egress: + - toEntities: + - kube-apiserver + - cluster + ingress: + - fromEntities: + - cluster +{{ end }} diff --git a/keda/templates/webhooks/ciliumnetworkpolicy.yaml b/keda/templates/webhooks/ciliumnetworkpolicy.yaml new file mode 100644 index 00000000..1eea65d1 --- /dev/null +++ b/keda/templates/webhooks/ciliumnetworkpolicy.yaml @@ -0,0 +1,27 @@ +{{- if and .Values.webhooks.enabled .Values.networkPolicy.enabled (eq .Values.networkPolicy.flavor "cilium") }} +apiVersion: "cilium.io/v2" +kind: CiliumNetworkPolicy +metadata: + name: {{ .Values.webhooks.name }} + namespace: {{ .Release.Namespace }} + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} + labels: + app: {{ .Values.webhooks.name }} + name: {{ .Values.webhooks.name }} + app.kubernetes.io/name: {{ .Values.webhooks.name }} + {{- include "keda.labels" . | indent 4 }} +spec: + endpointSelector: + matchLabels: + app: {{ .Values.webhooks.name }} + egress: + - toEntities: + - kube-apiserver + - cluster + ingress: + - fromEntities: + - cluster +{{ end }} diff --git a/keda/values.yaml b/keda/values.yaml index c9d87162..6ba78104 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -53,6 +53,12 @@ watchNamespace: "" # -- Name of secret to use to pull images to use to pull Docker images imagePullSecrets: [] +networkPolicy: + # -- Enable network policies + enabled: false + # -- Flavor of the network policies (cilium) + flavor: "cilium" + operator: # -- Name of the KEDA operator name: keda-operator From 4024f419a48661743f1b37deff7285e0f350d30f Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Fri, 19 Jan 2024 12:29:49 +0100 Subject: [PATCH 36/41] Add tlsConfig for ServiceMonitor (#591) Co-authored-by: guicholeo Signed-off-by: Dmytro Kovalenko --- keda/README.md | 6 +++++ keda/templates/manager/servicemonitor.yaml | 5 ++++ .../metrics-server/servicemonitor.yaml | 5 ++++ keda/templates/webhooks/servicemonitor.yaml | 5 ++++ keda/values.yaml | 24 +++++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/keda/README.md b/keda/README.md index 80126252..13ba4075 100644 --- a/keda/README.md +++ b/keda/README.md @@ -204,9 +204,11 @@ their default values. | `prometheus.metricServer.serviceMonitor.port` | string | `"metrics"` | Name of the service port this endpoint refers to. Mutually exclusive with targetPort | | `prometheus.metricServer.serviceMonitor.relabelings` | list | `[]` | List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | | `prometheus.metricServer.serviceMonitor.relabellings` | list | `[]` | DEPRECATED. List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | +| `prometheus.metricServer.serviceMonitor.scheme` | string | `"http"` | HTTP scheme used for scraping. Defaults to `http` | | `prometheus.metricServer.serviceMonitor.scrapeTimeout` | string | `""` | Timeout after which the scrape is ended If not specified, the Prometheus global scrape timeout is used unless it is less than Interval in which the latter is used | | `prometheus.metricServer.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.metricServer.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | +| `prometheus.metricServer.serviceMonitor.tlsConfig` | object | `{}` | TLS configuration for scraping metrics | | `prometheus.operator.enabled` | bool | `false` | Enable KEDA Operator prometheus metrics expose | | `prometheus.operator.podMonitor.additionalLabels` | object | `{}` | Additional labels to add for KEDA Operator using podMonitor crd (prometheus operator) | | `prometheus.operator.podMonitor.enabled` | bool | `false` | Enables PodMonitor creation for the Prometheus Operator | @@ -227,9 +229,11 @@ their default values. | `prometheus.operator.serviceMonitor.port` | string | `"metrics"` | Name of the service port this endpoint refers to. Mutually exclusive with targetPort | | `prometheus.operator.serviceMonitor.relabelings` | list | `[]` | List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | | `prometheus.operator.serviceMonitor.relabellings` | list | `[]` | DEPRECATED. List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | +| `prometheus.operator.serviceMonitor.scheme` | string | `"http"` | HTTP scheme used for scraping. Defaults to `http` | | `prometheus.operator.serviceMonitor.scrapeTimeout` | string | `""` | Timeout after which the scrape is ended If not specified, the Prometheus global scrape timeout is used unless it is less than Interval in which the latter is used | | `prometheus.operator.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.operator.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | +| `prometheus.operator.serviceMonitor.tlsConfig` | object | `{}` | TLS configuration for scraping metrics | | `prometheus.webhooks.enabled` | bool | `false` | Enable KEDA admission webhooks prometheus metrics expose | | `prometheus.webhooks.port` | int | `8080` | Port used for exposing KEDA admission webhooks prometheus metrics | | `prometheus.webhooks.prometheusRules.additionalLabels` | object | `{}` | Additional labels to add for KEDA admission webhooks using prometheusRules crd (prometheus operator) | @@ -244,9 +248,11 @@ their default values. | `prometheus.webhooks.serviceMonitor.port` | string | `"metrics"` | Name of the service port this endpoint refers to. Mutually exclusive with targetPort | | `prometheus.webhooks.serviceMonitor.relabelings` | list | `[]` | List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | | `prometheus.webhooks.serviceMonitor.relabellings` | list | `[]` | DEPRECATED. List of expressions that define custom relabeling rules for metric server ServiceMonitor crd (prometheus operator). [RelabelConfig Spec] | +| `prometheus.webhooks.serviceMonitor.scheme` | string | `"http"` | HTTP scheme used for scraping. Defaults to `http` | | `prometheus.webhooks.serviceMonitor.scrapeTimeout` | string | `""` | Timeout after which the scrape is ended If not specified, the Prometheus global scrape timeout is used unless it is less than Interval in which the latter is used | | `prometheus.webhooks.serviceMonitor.targetLabels` | list | `[]` | TargetLabels transfers labels from the Kubernetes `Service` onto the created metrics | | `prometheus.webhooks.serviceMonitor.targetPort` | string | `""` | Name or number of the target port of the Pod behind the Service, the port must be specified with container port property. Mutually exclusive with port | +| `prometheus.webhooks.serviceMonitor.tlsConfig` | object | `{}` | TLS configuration for scraping metrics | ### Troubleshooting diff --git a/keda/templates/manager/servicemonitor.yaml b/keda/templates/manager/servicemonitor.yaml index 727601cb..1213ee59 100644 --- a/keda/templates/manager/servicemonitor.yaml +++ b/keda/templates/manager/servicemonitor.yaml @@ -51,6 +51,11 @@ spec: {{- toYaml . | nindent 6 }} {{- end }} {{- end}} + scheme: {{ .Values.prometheus.operator.serviceMonitor.scheme }} + {{- with .Values.prometheus.operator.serviceMonitor.tlsConfig }} + tlsConfig: + {{ toYaml . | nindent 6}} + {{- end }} namespaceSelector: matchNames: - {{ .Release.Namespace }} diff --git a/keda/templates/metrics-server/servicemonitor.yaml b/keda/templates/metrics-server/servicemonitor.yaml index a2a0dfc7..4e4fb12b 100644 --- a/keda/templates/metrics-server/servicemonitor.yaml +++ b/keda/templates/metrics-server/servicemonitor.yaml @@ -51,6 +51,11 @@ spec: {{- toYaml . | nindent 6 }} {{- end }} {{- end}} + scheme: {{ .Values.prometheus.metricServer.serviceMonitor.scheme }} + {{- with .Values.prometheus.metricServer.serviceMonitor.tlsConfig }} + tlsConfig: + {{ toYaml . | nindent 6}} + {{- end }} namespaceSelector: matchNames: - {{ .Release.Namespace }} diff --git a/keda/templates/webhooks/servicemonitor.yaml b/keda/templates/webhooks/servicemonitor.yaml index 48b5223d..8452b4d0 100644 --- a/keda/templates/webhooks/servicemonitor.yaml +++ b/keda/templates/webhooks/servicemonitor.yaml @@ -52,6 +52,11 @@ spec: {{- toYaml . | nindent 6 }} {{- end }} {{- end}} + scheme: {{ .Values.prometheus.webhooks.serviceMonitor.scheme }} + {{- with .Values.prometheus.webhooks.serviceMonitor.tlsConfig }} + tlsConfig: + {{ toYaml . | nindent 6}} + {{- end }} namespaceSelector: matchNames: - {{ .Release.Namespace }} diff --git a/keda/values.yaml b/keda/values.yaml index 6ba78104..9f2459dd 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -576,6 +576,14 @@ prometheus: relabelings: [] # -- Additional labels to add for metric server using ServiceMonitor crd (prometheus operator) additionalLabels: {} + # -- HTTP scheme used for scraping. Defaults to `http` + scheme: http + # -- TLS configuration for scraping metrics + tlsConfig: {} + # caFile: /etc/prom-certs/root-cert.pem + # certFile: /etc/prom-certs/cert-chain.pem + # insecureSkipVerify: true + # keyFile: /etc/prom-certs/key.pem podMonitor: # -- Enables PodMonitor creation for the Prometheus Operator enabled: false @@ -618,6 +626,14 @@ prometheus: relabelings: [] # -- Additional labels to add for metric server using ServiceMonitor crd (prometheus operator) additionalLabels: {} + # -- HTTP scheme used for scraping. Defaults to `http` + scheme: http + # -- TLS configuration for scraping metrics + tlsConfig: {} + # caFile: /etc/prom-certs/root-cert.pem + # certFile: /etc/prom-certs/cert-chain.pem + # insecureSkipVerify: true + # keyFile: /etc/prom-certs/key.pem podMonitor: # -- Enables PodMonitor creation for the Prometheus Operator enabled: false @@ -676,6 +692,14 @@ prometheus: relabelings: [] # -- Additional labels to add for metric server using ServiceMonitor crd (prometheus operator) additionalLabels: {} + # -- HTTP scheme used for scraping. Defaults to `http` + scheme: http + # -- TLS configuration for scraping metrics + tlsConfig: {} + # caFile: /etc/prom-certs/root-cert.pem + # certFile: /etc/prom-certs/cert-chain.pem + # insecureSkipVerify: true + # keyFile: /etc/prom-certs/key.pem prometheusRules: # -- Enables PrometheusRules creation for the Prometheus Operator enabled: false From 94c44121d3650376d6999d1449ecc8d34025d11b Mon Sep 17 00:00:00 2001 From: Jan Wozniak Date: Fri, 19 Jan 2024 12:40:37 +0100 Subject: [PATCH 37/41] Release 2.13.0 (#593) Signed-off-by: Dmytro Kovalenko --- README.md | 2 +- docs/index.yaml | 163 +++++++----- docs/keda-2.13.0.tgz | Bin 0 -> 96137 bytes keda/Chart.yaml | 4 +- keda/README.md | 4 +- keda/templates/NOTES.txt | 4 +- .../crd-clustertriggerauthentications.yaml | 251 ++++++++++++++++++ .../crds/crd-triggerauthentications.yaml | 251 ++++++++++++++++++ 8 files changed, 602 insertions(+), 77 deletions(-) create mode 100644 docs/keda-2.13.0.tgz diff --git a/README.md b/README.md index 234f11f7..057a14ad 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ $ helm repo add kedacore https://kedacore.github.io/charts $ helm search repo kedacore NAME CHART VERSION APP VERSION DESCRIPTION kedacore/external-scaler-azure-cosmos-db 0.1.0 0.1.0 Event-based autoscaler for Azure Cosmos DB chan... -kedacore/keda 2.12.0 2.12.0 Event-based autoscaler for workloads on Kubernetes +kedacore/keda 2.13.0 2.13.0 Event-based autoscaler for workloads on Kubernetes kedacore/keda-add-ons-http 0.6.0 0.6.0 Event-based autoscaler for HTTP workloads on Ku... ``` diff --git a/docs/index.yaml b/docs/index.yaml index b83a3f1b..fbd77298 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2023-11-30T09:12:28.68395+01:00" + created: "2024-01-19T12:32:08.715266053+01:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -22,9 +22,32 @@ entries: - https://kedacore.github.io/charts/external-scaler-azure-cosmos-db-0.1.0.tgz version: 0.1.0 keda: + - apiVersion: v2 + appVersion: 2.13.0 + created: "2024-01-19T12:32:08.905813008+01:00" + description: Event-based autoscaler for workloads on Kubernetes + digest: 0dcc74315d6ca02fbadcfc5e358040580c0ad7919921e07ebf2dcc0b1d2d5f03 + home: https://github.com/kedacore/keda + icon: https://raw.githubusercontent.com/kedacore/keda/main/images/keda-logo-500x500-white.png + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zbynek@kedify.io + name: Zbynek Roubalik + name: keda + sources: + - https://github.com/kedacore/keda + urls: + - https://kedacore.github.io/charts/keda-2.13.0.tgz + version: 2.13.0 - apiVersion: v2 appVersion: 2.12.1 - created: "2023-11-30T09:12:28.740582+01:00" + created: "2024-01-19T12:32:08.896240745+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ee87da063be94f3f65661656602775c38ab723374c9892ecc73c1cea269e64c0 home: https://github.com/kedacore/keda @@ -47,7 +70,7 @@ entries: version: 2.12.1 - apiVersion: v2 appVersion: 2.12.0 - created: "2023-11-30T09:12:28.737913+01:00" + created: "2024-01-19T12:32:08.885127348+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -70,7 +93,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2023-11-30T09:12:28.735381+01:00" + created: "2024-01-19T12:32:08.876048658+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -93,7 +116,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2023-11-30T09:12:28.732731+01:00" + created: "2024-01-19T12:32:08.866163643+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -116,7 +139,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2023-11-30T09:12:28.730667+01:00" + created: "2024-01-19T12:32:08.856347981+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -139,7 +162,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2023-11-30T09:12:28.728117+01:00" + created: "2024-01-19T12:32:08.846361554+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -162,7 +185,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-11-30T09:12:28.726019+01:00" + created: "2024-01-19T12:32:08.836129564+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -185,7 +208,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2023-11-30T09:12:28.72344+01:00" + created: "2024-01-19T12:32:08.825757959+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -208,7 +231,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2023-11-30T09:12:28.780031+01:00" + created: "2024-01-19T12:32:09.062863885+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -231,7 +254,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-11-30T09:12:28.777909+01:00" + created: "2024-01-19T12:32:09.055747405+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -254,7 +277,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2023-11-30T09:12:28.776116+01:00" + created: "2024-01-19T12:32:09.04764804+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -277,7 +300,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2023-11-30T09:12:28.773922+01:00" + created: "2024-01-19T12:32:09.040753938+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -300,7 +323,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2023-11-30T09:12:28.772046+01:00" + created: "2024-01-19T12:32:09.032740339+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -323,7 +346,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-11-30T09:12:28.769801+01:00" + created: "2024-01-19T12:32:09.025958682+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -346,7 +369,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2023-11-30T09:12:28.76788+01:00" + created: "2024-01-19T12:32:09.018533711+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -369,7 +392,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2023-11-30T09:12:28.766195+01:00" + created: "2024-01-19T12:32:09.010390066+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -392,7 +415,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-11-30T09:12:28.764164+01:00" + created: "2024-01-19T12:32:09.002692571+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -415,7 +438,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2023-11-30T09:12:28.762407+01:00" + created: "2024-01-19T12:32:08.99312408+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -438,7 +461,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-11-30T09:12:28.760718+01:00" + created: "2024-01-19T12:32:08.987337601+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -461,7 +484,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2023-11-30T09:12:28.759253+01:00" + created: "2024-01-19T12:32:08.981484633+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -484,7 +507,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2023-11-30T09:12:28.757871+01:00" + created: "2024-01-19T12:32:08.974926052+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -507,7 +530,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2023-11-30T09:12:28.75646+01:00" + created: "2024-01-19T12:32:08.969540327+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -529,7 +552,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-11-30T09:12:28.754845+01:00" + created: "2024-01-19T12:32:08.963702724+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -551,7 +574,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2023-11-30T09:12:28.753487+01:00" + created: "2024-01-19T12:32:08.958295348+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -573,7 +596,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-11-30T09:12:28.752152+01:00" + created: "2024-01-19T12:32:08.953425127+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -595,7 +618,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2023-11-30T09:12:28.750645+01:00" + created: "2024-01-19T12:32:08.94716966+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -615,7 +638,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2023-11-30T09:12:28.749292+01:00" + created: "2024-01-19T12:32:08.942430392+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -635,7 +658,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-11-30T09:12:28.747851+01:00" + created: "2024-01-19T12:32:08.93721564+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -655,7 +678,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2023-11-30T09:12:28.74645+01:00" + created: "2024-01-19T12:32:08.930958846+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -675,7 +698,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-30T09:12:28.744667+01:00" + created: "2024-01-19T12:32:08.925014944+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -695,7 +718,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-30T09:12:28.74329+01:00" + created: "2024-01-19T12:32:08.919958175+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -715,7 +738,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2023-11-30T09:12:28.741928+01:00" + created: "2024-01-19T12:32:08.914934581+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -735,7 +758,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-30T09:12:28.721051+01:00" + created: "2024-01-19T12:32:08.817708321+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -755,7 +778,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-30T09:12:28.719494+01:00" + created: "2024-01-19T12:32:08.812718531+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -775,7 +798,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-30T09:12:28.718177+01:00" + created: "2024-01-19T12:32:08.807771972+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -795,7 +818,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2023-11-30T09:12:28.716879+01:00" + created: "2024-01-19T12:32:08.802827299+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -815,7 +838,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2023-11-30T09:12:28.715224+01:00" + created: "2024-01-19T12:32:08.797914684+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -835,7 +858,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2023-11-30T09:12:28.71398+01:00" + created: "2024-01-19T12:32:08.792513035+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -855,7 +878,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2023-11-30T09:12:28.712737+01:00" + created: "2024-01-19T12:32:08.788504803+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -875,7 +898,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2023-11-30T09:12:28.711127+01:00" + created: "2024-01-19T12:32:08.784096866+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -896,7 +919,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2023-11-30T09:12:28.70989+01:00" + created: "2024-01-19T12:32:08.779475562+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -916,7 +939,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-30T09:12:28.708648+01:00" + created: "2024-01-19T12:32:08.775067136+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -936,7 +959,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-30T09:12:28.706212+01:00" + created: "2024-01-19T12:32:08.769342328+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -956,7 +979,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2023-11-30T09:12:28.704072+01:00" + created: "2024-01-19T12:32:08.762648323+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -976,7 +999,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2023-11-30T09:12:28.701927+01:00" + created: "2024-01-19T12:32:08.757576956+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -996,7 +1019,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-11-30T09:12:28.700049+01:00" + created: "2024-01-19T12:32:08.752364719+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -1016,7 +1039,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2023-11-30T09:12:28.698225+01:00" + created: "2024-01-19T12:32:08.747185796+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1032,7 +1055,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-11-30T09:12:28.696224+01:00" + created: "2024-01-19T12:32:08.742132728+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1048,7 +1071,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2023-11-30T09:12:28.694751+01:00" + created: "2024-01-19T12:32:08.73844598+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1064,7 +1087,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-11-30T09:12:28.692953+01:00" + created: "2024-01-19T12:32:08.736308605+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1080,7 +1103,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2023-11-30T09:12:28.691479+01:00" + created: "2024-01-19T12:32:08.730199876+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1096,7 +1119,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2023-11-30T09:12:28.689924+01:00" + created: "2024-01-19T12:32:08.725555244+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1112,7 +1135,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2023-11-30T09:12:28.687836+01:00" + created: "2024-01-19T12:32:08.723517744+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1128,7 +1151,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2023-11-30T09:12:28.685969+01:00" + created: "2024-01-19T12:32:08.72032415+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1145,7 +1168,7 @@ entries: keda-add-ons-http: - apiVersion: v2 appVersion: 0.6.0 - created: "2023-11-30T09:12:28.785859+01:00" + created: "2024-01-19T12:32:09.089527389+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 home: https://github.com/kedacore/http-add-on @@ -1168,7 +1191,7 @@ entries: version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-30T09:12:28.785385+01:00" + created: "2024-01-19T12:32:09.0873347+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1191,7 +1214,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-30T09:12:28.784908+01:00" + created: "2024-01-19T12:32:09.085246145+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1214,7 +1237,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-30T09:12:28.784438+01:00" + created: "2024-01-19T12:32:09.083318716+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1237,7 +1260,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2023-11-30T09:12:28.783948+01:00" + created: "2024-01-19T12:32:09.081161297+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1260,7 +1283,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-11-30T09:12:28.783451+01:00" + created: "2024-01-19T12:32:09.079008278+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1283,7 +1306,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2023-11-30T09:12:28.783023+01:00" + created: "2024-01-19T12:32:09.076665359+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1306,7 +1329,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-11-30T09:12:28.78261+01:00" + created: "2024-01-19T12:32:09.074244845+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1331,7 +1354,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2023-11-30T09:12:28.78218+01:00" + created: "2024-01-19T12:32:09.072114385+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1355,7 +1378,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-30T09:12:28.781764+01:00" + created: "2024-01-19T12:32:09.070101539+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1379,7 +1402,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-30T09:12:28.781339+01:00" + created: "2024-01-19T12:32:09.068165729+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1403,7 +1426,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2023-11-30T09:12:28.780926+01:00" + created: "2024-01-19T12:32:09.066419261+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1427,7 +1450,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2023-11-30T09:12:28.780543+01:00" + created: "2024-01-19T12:32:09.064734672+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1451,7 +1474,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2023-11-30T09:12:28.780303+01:00" + created: "2024-01-19T12:32:09.063840136+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1473,4 +1496,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2023-11-30T09:12:28.683656+01:00" +generated: "2024-01-19T12:32:08.714210531+01:00" diff --git a/docs/keda-2.13.0.tgz b/docs/keda-2.13.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7900341201c2dbf5e20bbe7027aaab0276b237ac GIT binary patch literal 96137 zcmV)aK&rnViwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0POwycI38|I11-)Jq4`JZzRpAN>X3*(_|)A)UqwRFItjpuY4ZI zjUrK1utCyxw_|v#@dDrAQXZDz)1&k+otqi`>|_ZS4ELBOyLIpJSoM zOB_dkc!+js(OjuSo*o^|sG6sfalqpvz4Zbv z2>h`_0}bE3Ch+~(yqZcP0?rg+YW1t57*lpcV>}}g9*iPB2+v~@$xmY%2rl^)`rbi^ zVLh0$c}zld5#8V=3A1m0fOp z9*fd8__a6c&>p10DO%ttCGx>8fM)vt;`zzR(=z>k^8E2Y|35@~gkF*lAVuON!ivc8&dx026C9oHAOwV4|AEjWG#a7L;TQ852{NNni6!Dw^wq`7GZgSR z;fydP;S2ZsDPn09?d*798v7j3%W7ymAp$Eds$iAA)fBYuyM#-sxc+iB55$=A5*aOl zQh2rkX^h^&?TVvAG@}c`5Ka92nK3lhaB&^(%6j8xC;WQjtvZqS3mvs1LYyMs_n zl%Rn;OXv*|3nJD}#B1{fI=i|==9{ilQVU_t;_k_0&iS2O zKVdkGsnlJJ+&5h(tQNw$39I?AX2w?EMq8b-T(?OYMOQqc!4e1vj-rY)o4s_3&Z2v~ zlsh{BBjXlP5T#NP0rNFRUmGfdrUa{05Q$_O%n_D|#8fHDX6QWPX$V}Y+_B%jF$|A~ zIda(7b{2BY1iJ5E!oN=4uj7aZINI3>LcS6Hu+L^2@(ozehDk(pNweFq^N zhSaR$S@yQsxIh15cf^$QQ#8TCj@lud8@--lnc%=s?R%_(x&8xKdOaYTQ5rkDpWGx~FntXn`y)#9uM{|N0>6Z(Xo@3A-20zJc)^9nPp@G4GqfMjh^Fzu z4nk9S^AzoxN4q;aj(+>j-BA5z$lVng7e2~8h0m@@643zP5M^#(rElGrB#HPkCQRuI z6y0M6b0>%vRnWd&jZ<`TtdSFBLG=m#f=W$3UeTDsZ+>s#1W#y0)lvfqIGfU0Du@|$ z8czsJfiQ>|EQ(hY0Qz=LBLe6Im?4oe6mvnc&-fJSyWV|th&YRuh%@3JnXS(Pg6?S) z>GPp6hzJgeK$wL{UjzDBD}kp|8km0nmhUl*6iuS6*F!W(l?JmkFd0{f#);qy13V!D z_!ix%C5(rNDirWE3Jr#WglRxf$nTk=F+pJ}G!7U|F^#ysXaJ2@1PeQ4%FuUus38wh zy+&{Xzu$L474T1TeiZUR9s%22)-FI1xM`64o`wclzrPD~x2U37Qf5zpCjMew<>Uu1a7g?M@d?rb`xjH>1L04CuflEIvWDU4usbD~>(MGBQ0M9cWVLUc1uI%#ih>Q5?M_5nkSqfU{7ZqQ}qRw}c4FL;n;= zB0~C@^HgPz;i*3EsUWv=LFAlA;VF6o&t)3ubC7#}lF@F9>#sjMk3zWOb1#@54$K8% zAFiFY_0VwYCe328t6*ESwIpckAR~Jh#Xnwma^GV z$RrRN``ghY_{YdR*8Fr)%n4yyUcR|8jPcT*QBvIEdWcLq`7S@05_4Yo%CY|X+Hw5% z4npPe7MS++{6UqjU|D47wuyZq2F^Hln45^;tuzPds8RLxOfl%D5rF4tZ9E6TOiWh$!KDs|-_ySPy~ zsA}H0t(v5YI1RkeLnuuA!hB{g*VK`+YoT@p4|NrTTyjO%tI*CYb zH*2CIxE4j^(Ib0iE!%$JP9U7E`VD2ja=f}(oSmICnF$<{8>I!dS*BF4+sxnP&W!yQ zN&E5l1x?6Kel`3qQp<##qH7-M9rAS&VnysPBL6H~rWn8fnpx2?B93m^Uv5${gJ+wg z?HRCyW(Lg_%j$1nAZJyp?^&mZA3(yxmsE-rc&@*u;f$#DyXuOEDEkVT&%UqTLMW!} ztOAWy{Q7rm7Jg;XKSb9ROVy#IumMCRnh^$y*AS%=EUI&YrfC$x@6H{o*)ZKIZXsCsYKWuVJ#(j zQRj+>`|=>?>SMtm%IXl$=@ZNwT0AIp@BU#m5`g5l*54!N1mz}7q~M=nbR!m~dp$!a zm3Rg_b(5KLUMGF0tF&1RIxGGkJ$A!6==tH`-4doH#LLimUxTIJHilopHN{&5T@pjanmMdxxLYHYrM2@H4TtPkpnbS6I-mT&luoA3{ujY zZOT9&W)5|q7k(a2(Ua%L$C}RETe+JGY29>dubc1AzP&-0XRi@l$$-DTLy)~hB-+2c zzBxO{aMw7G@x2`582`i>L^hB+Z;nhQ5wnzrxsAObQ!epBbfzyzJqD7BEV?6dRZ(&0q5C0VHO6A6`XCdJ6ZV9hyig*1+ z|A`sQx1JYs_ONCa{at|)!51_%mfqlu)Ddv0Z&^kTOh*1gj1%# zrcN*rOXFRh;de~}9>;`*By@D9>U)Hvm`eq2jRBTKZh3@K$!pu~h3!?IqFsHhwpyQ# zbY^RKuN>n)J%0-4cormUxrEQpuPR9PI_}`{_~f`mY({S1$)j12tkRsLMh>CNh%4EI z(Flg3PezIUpo!&VeU zjMwfQtDQ%FW`Ub0o;g37i6jV!P!c6r&D|tl@o-1~a{KD$T>og?cUz6`3oPgKoQni~ z0|MNyIk*L2P#)OaVF(D`zPd5viui0s+3Ym0t;#mhEAuOg$bv+fjQ%#~Wvk!BQN-^_ z=(N=6T}USB?A;-HN72!(J zxnMg7=|M(jB|g6|a~3w|Xz7GPeTH`2QL@g=msjq?FK%zIZor?fY^f{3v0i^)fSik- zK7G<2LY_Ez7`Ir=v<&q;2dc_y;#Q~*sTJ$VBlInC+8rY)g~hx8;3$8uAIm^ch-^hR z6hNNtJgOGuYhnO)z>bx7voajo5;_*d<|#q@Tp-02s4|VCW*#$naEO9AW;23-6NteP z0_L>?j>{+LSmHP%cZBLR^TizP6SHX^{yT#$-ri6#O}gr_hzqorKaG1kk3dE>NFL>JDNf^#ADrKWuQ9_jg1&RVfDaXs3jG_3XiSy-ekEgo zr6WaRXI^%9K#-))IY1MR7=p_6DR@oo)dHQA-akH$S3iL-x}sV~`&Mb#$AxzVmtYVt zlBWu!pVi_}i}mUUuc?ii<{?4Sdc#$@_qFgy%|bx@XCtzp0ch{Blyt_xD9Lz8jt&lX z^nbkro+b*$IL#v>a?TK2#zT`hHNq?$Dc_MsCi|C-_jWFLH;Lwo&N-7xV9=r#F05Po z8p^$~{s8G7+CypH+b+1R8_f0l4rZaHs}y|%t|0El&@6&;)z-JI zk?ftRPhZDIjcq(IQb{y``#E7QY|T*}(8zmrv5f~CqicOx8P^ah{iO;lgoY#tmfYy^ zT>=e#$WQZLE0w6`t+|oYPg{(^{DSYz2gX_~(Z1v{@$czZZeD(65CN|rq=4(mp>E9U zkY;0&(nyUcD}X$N?GENQi&V&o1kV|F^HY7{C;Hkqie56EQA%1)SWMY%Bz1IeUGv^T=J&r)clu%{QZO&R%_ev8S;xGrQnX8f#&T zh4yb_hRb|bLhtIHrLY?B*zYQ`z7^s6?UI2p`$WI>jRj&DwuURNh3fX8c7IT zns5O@>IRKFe5I*LkusuWrGp}IIj(}r9OKvns$nJbPb~xRnltLJn!=n&=h0waF&@P( zy#iRfv;N-ZZ=ojdr!V;gT;Z(SeaxN*E)4v&y3P*ZOmJ9>t zM?P_&Ec0LoJVxJ@#&VO8;CqYLj~1n}kCD-+y|UpE0y8<)JeBjKci84od}n)kXGkIN zEylmQF!jhXVKyefor26)zqx1UsgmpWiid0aOp0*J-M*=CGly*loS*lH0>69B>x|Ls zRHfFJFo;q~7uGS%4DQO^m~LAavB~u*a&eEqm>UiiI=7FslsqAGYFT$X&4(r_hkh?k zr2@|$Z_hPBr2f`}w-TYbCAF-_J;|`nhEd)amrN0{z>((v%x?4t(fjqwK;VRg-YehZ zl^vS@_y7O@Sf4ceHrT2GuuZV&T&>*ml^tqD7^8_asKEMJaIkI_NF0`rZxIbIS=uy@ zDT}n^K;a4e3FdP@4V2~jj0>dFYNnQ zH$F%%yOJEhGOdlInXVjG8cu*eqY*hpM??ijdT=9fR67!!EBJGqkU0N75vuwN{r{t2 zjwvgBLYc8=-Q3aS8zSg*nKM|KSMJEN8t5HadT0p`o9^i=|MPb4=o>eYo*vchlO*4B z^B$?AVZJj*b+*t~Bf0S%`W&U(=#mu@oaVageD*qYy6)UobZ%?kfM< zhV8zp=D62^u41?co_OGif9pK4hc)oV18+R=#x++`|Lb{RjR)4a%o-PYjfZ88H|(nq zYrJ8X{aE7-J6(6~HX>0a-f|P(80A>gYu!QhHZH!i<-OcuwO9K8U`yVy=XL9zLjXq* zn6_;M0P3lyWB$4U1kBH;=qnQ98!*yefWbNUPSFLk@B>1Hl6xA6G4+RUCqI%vp`U+7 ze>C$tEN>%QTL$SlYhL2&zA?7?(b3ry2yB zEYW@u^F!O;0ooT>k^MUo;vej7^#eBc$sf!sKN!@%dmMj%aDdQ%+ZZR;%an^#^f)d& zi+uK-dJ}T3v(?t6(pH^3ynI?H6x2j0ejMb}K|UR9HiKN6jbe~X2f1{ROPl1+?m!)gpK}Rs3_8m#~yO(&XYW*$H_*4@Z{ExZKSSvMD^?_#B2@%*-+M zIWe)Cqx(4#qy|+id{;Zj{H4D+MMn;f{;!E3TD5ISbgpSkY<`9r$w5cvdFH}amt4lq ziG&1;(R3u~jFAwXpPA9;`*2ABF8xxF^D}*^1I)vGViUvj%?Ua`vmec|%V%Y!PdC5s zf_xX0A3=EXD1=OHBg%d>UhXbqk+}!5{tFSBrPVZ(Z_vBp;GzVU;49$}ZaOq&}u}>LO)~+o^HeHfjr*#d0B>P#^8!LR}XpI7;UD#6}I> zQ5O1`;afpxGa}9k>8$LFE?sgKxMbX>@x2@cg%qlf%J;FYEv=tx*&%~a%7W@*o?QMc z1DxEs%Dcss)G8GWadyO~Q*?H7etC(Y4lpxSfo<7ZL;D%m1Q^SJ(lcQrw14ed=0oe= zp#HzF&VKaf?d`?QSiM)6}n&09FFVe+)nZ*8SF0~efnj^y!)+a-fvh^4}5GE z)V!;Q{Niu__UR)%#xisd+-@g}T5%_S;(@>Tey46JI<;FG`2#lYcrK^gloU)V62kow1WY&;F=49{;gN4IX{@`RAYi_0vy3{kIo| z*8zCb8n$nL`SjCA729D;(62uI>)$ILZw314zkPmM^?WP9KY3QYiMImWgWl0s2Vo%^ z{qhU^dnaf2xL6RTMxoFm96C!CmjO2UA~c(RfJW#nfudHxOyb-NF;uakaT1a7&d%pV zAt;aL0%hAt* zACF2ohg*#vGe|+Zpyb|}#J=Ey{=}KW5m?9E?k7T`{V%T04sy90sMAH}OlUG7jI7Mm zJi!_j97P#A^7|(2N}OG$*c|)9`9(|fIB!$=<(Hk&L$sZ5&#vEGzWE%DP)Cd)sGcN( z1Xz*q5G4`8lAxH*1XiFlY!A@DGfBh84>V9m9)J0zVJY&Ol{L#zIdN^j?=*QWfEFjP z)lhxb)Q@J@wZW*<#H|7Nfp?u-i%6mIc`h&ISl`oDi8X#r85d~x@rzyb0Ve-CWz42s zNSRENgo~0diA#yHdoup{=QU{m^2_en(9y@^lP92C_8=jf36aXw8_jjFdotF8hG&udTrt+9s`}|NCK1qJ#)JR!OwAKAQD^$0yHDUX=8I zPoJGU9`t`7qW%2y(Z8bwjZdLm#*{`xEfexzv7VM-PEOIkADOG<=-+qFO|iLPj$NJ# z$k$>iHnu)V6O+Z$yao5(cn5%Js%AZKz=Ai1S9Z1h2)`wQGBriJ|3{AgkK9G$bN%xe zJkjjmminWAKuKiH^6vh}F53NJ7ySb%k+J|ie*%Bf_$HlB>3g(0%HUgB)egqlT+swe z8szIHo?pMLLs*2yOeW#BoRcWl{fzYIHQ*aS@lVY z2h4boy1A~IV>iEU)k;&ETY;K+1v3?tLdwtAo6@MAzPsdJVqQUt{|(2{nzyRP`)eQP z&aFiM^Tuwt@JDdri}4c2y)T3{^#AzTi>D>}|KjTIoFGU1P>M$Ct6Ie+EY` zGl7?#BNit+#{7K=+h!+k;?`Y(v&rhQ%BQgY<(Hj`;0XP(JC*1kh*1_2rqEOKdhP@| zBYFervwM1{U{Nm<3!_r`<(D02Uk_}0vAoMsu9MoC%lobrsl~6o_J3$|{#7LN9xZ(c z!J6~`_}R(x;`x7k^7Q!GaQ;6;d#LlDbFeB9f%S*8wBcmeW6I;0vz6ny!u}u>GRVCP z1ZLFq?zpzoz8{X|BG~BTah~!R&BRL{W6D}!wVLj@_W(P9YBS`H;JQqLSIu=@)7BqW z4Y1S4YlhS2-jRiyX2sudWkm6-n-xiDV?>=Mk?S`&Fz!G7ECrz5#c!otRPf09K84ua~hZM@q{0_CG9XN4oZa!doxl;BZB#ArqsSaK#Q zjY3NuT-S@^@yV0%@eV3Pu&vsD)*fX~8;WM7%%t=WRHPIJ;_7LDe^53XTb~Ml)-CU{ z^1G!Nr#X)2Ttfv<*&BcgKSflkuPT3jMWwAy5~Tu16#PLZcl z;SO>JT&oAmi0qYs>=x%dN@M1Q{2wJ}CO~#96;`Pn2b`HttisX09x^c_$ZDXA=%!7YfJ|!p^QPzj<;~cw9=HRGvR;XOw8p z?~$$M0<+^&)<|NiQNq)lx3r|}&i~Vdpr^TfL_Spy_(y3Fj6{Px=@Q9l6StJ!@SgoA*l@Ywm-YlMZEGSPUy2ndXpf9G%5T5c* zYrkd z>&_JJbB|$0Dxj>}i!qTB&niw~1rldyp2nC#eSBNk2|m`m8$@rgSuskaev8kEN#h2{ zk89p*aS*Vqq68JV-$I3J{kl&8WD%5)UA1=nqh^el+fM)ss>GKy)k4y6Z;}_4K z4)XtpXumc2-%9UOw9iEm>uT*_qweq^uMx1?!u^8ub{BscwoojrvzB^cxL$8ge(cRS&&-B2d`-9+bacQIFJv&r~HAT0cc6-8=b_PpW$OGJD(t{MOW2 z^+%_q+Ok_3>S5>hb)KIwd1a&Jpw=4HT7}sk)LI`vtyOu5S9Dut6;aJmZj!C>y)@*% zkifDQud~wYKGAfkcbm1K{CY>lRW8R}U;Pz^{D0o#r5_OFs*`^vc--_-TVTkC34BGC z-aTeJaCN(D8gIU>6~~K>RjNTZ2HdPB%(syqT8p=GyvaHoYee<#_>Brn+W2a#p4ay} z%68=%9c^P*=8W7pr=AM=I1%G#^3#IRQc8# zBuY7sS6h*%P1QW7TS1W79N1c6vx7%k;(>xS5mr+!>Sl*wMHd872Pr1O95X7b-(P^Adp{Fnfu@k3?qmasgFNjzk zg4PgOGnY}RpnERvB96m46OwLqMSuj4$eE}!1tCOO+CXqeE^T(*&knUsR>No7ZnqG* zoq1)ybhVLe1uk36#=)(!R<#>E{wWppRL=fBS~~|LGz*d@F!%K+j(qy@<~QyrUPq!D z7s2k6mTPcr-bRwxs%K~4-uQ>6Tmsa5^4qdu=ax2X;hgm!(K@1AQYcqJucfAf%qqQD zS|DZ%D^!15>ra4M@+a%KhgLj8f(4F=YC4ZCAz5u^6S3|F=|(m9JG2D0?$U2$ZARJb z)V#5l8>q8*H{<45pH(u@&>@hgugDV22J7@#`FGbTvGlvBniYZXyK1!}p4O~K8-12$ zF-(LW(fF;aOWpN!)R6{JCHqFTdiD9Hi7iN?mP(lsZVMgOr*Z&jU)SzeiE? zUsyKOtZf>puj|538i&_MupIdgyU3j8%6W|w?_syvXS=uweZQZtKx-CFD`y6qLhpnH zkbNFo98rv`$lbcl-@vo4-C<3KX6?so56eb={nh+>?S^mO?7dw6^+mVXWV2kb1r?md zgsoFxknGLMxm;jDO|4qWY;Be-Bn=!I&3-IKA7pLa9`dF9tE1@h^Yq)?O&@aC%z|W% z!`6fQR1FG@b!|{!{O%PP?Q{_R@BH3brXF$;Hc82A@bZO?6yqc@)mzm)A!cVJ*ajL` zHJf9@poJ*28_uA`f6?xHm^><7M#^ki%ftVf zNK;LDYv5>dgR8O&^#sS&oQSPLRH}xQ_kfiOx<%Yt=^L88q3Q_<eWK)xwugise3RMub4=n@XKo6iQ)@AxWh&*%%&O`t81y4o)+4dW{S5?>#}C^ zw9vL}plLyqItjh6mSvsL+CjrouV84Alx*3xx87jKE9P2J^U=(2|A5*t-O!td)L;rAUN z*^F)SyMO z_MKc|&Cu3#Vt#DZi6epIKoFSXTN)FoaGVs;o)vKpU7oKkWf1g7RI}=u`7&?&Jk;4i zMQ2x+9>$OvaL5ceWCm8(>JJ79_Hg1I3%zwR&-gu!X5jaNg{&+aMZE zF}3MWzo1$yS-zq%t*}*C8-_kzPafBFkiQVK_9LG(C?^V2l}(aaju`lhH+LKGJ=ApxCIw|KVHCZY^U0|N;X z8D~2~pKA06T0BwuzCdb@l^>oyaudkbuP94-Dx;-E6-}UIXA{V!R3t`90CpTHB4Wz) zuA=HcEq#bn2`4b&k{XXdvs`r^ZI@Gok-b`EDigv&5~6(!)^#&F4BIy+>RX%lh+? z;h;YRLqiBZ+dc6bTRaB${9q%u5p7k9;zMPevBXD98y3s{?VO;}~5k$lT1C z-Ro|5f5|6%5(PX?BBI}X%|r5EFzF;btc43BMOT2QAV5w~!Xp|i^;q7J1rcMYN;0J+ z0#<>>ajNtr)gAU*xaHmJz?F_7eZ6|zoy)90mG8dflfPDMmv=Q?ObOQ4GnxTel77|p zLn_T*lcl~M^&UT1dysqX@8VRq*x9?qFW|B_J6&H*S3JytlnB?lsw#nlJK%f#biRAT znO*C5Xy1)o6V-R_@fiINE4)_&Jti2;MfN(eR6F2I(vWBt!y-xi@(F_G7_JslcM^@@ znIE1^A=TS7jiRLo8R}V(V|0Ood1*pw08>4AF^~9+r>0Vt{uKNW%z*u@l*V;c=VE3g z2^jZ`D5$3-B@d`(HFNmb0}tHnvF><(WsEi8N9g3>5a9);5tJvgv?4p>wFD!BZD>dR z32eJ=R6-q}{9@F=EG!WaWSD7#hoPN@H=r_`^uyJKuiJH&qi|=!T;A_&bp$MM6p@I^ z_?>?%wsqlvVPU)?Toe887{GTv<<+Vu{i*+y(Zu=h%Ax|Ojq4xm89rj$`R zCv~3B2@j=b(5+fxLXb!qFfn6JzcJL0ROtYLR1Nyt|+>(-qHcXl8sW%PejD<4w{$4ZX^CtAGJ+k#8t-fa}3^|+mp zbBqjT3d-7Pd{SvD9S9;5eVOVjThk$pO1*cTMb37w@iI5t(rMJ(M2`{r%t!zlNe#4a zg$gi1#1C*PjW!N?0ImmthE|ghuFy1PK?Cy?a3M&bqU9K&FZjJ?_7BnDcnZKJSy}x5 z(zEhT-!-|?H{}K={a!N{Alqv;pQ^br=SLxWmstsq7AF&;@X0%Lc6B*!y89mJ6hF$= zWVGa|81Z{HN_aSOi&K5f%^{v}9+67!BgXGP1DVpWLEZI1F@8^D9F;^(xa9$$m1pY+ zu9tER1K>s6L&N!1$>pG!A*zm{d<#A}1p&N-5qTdF0;i5j_m)xeDq4%FX;$w_w&1R%M`zJ zoR;A(3qpDg$O5msc3pC!o*q~|%bO@ZTYGP~{WgZ&wI_@yfLq9c$QdtmG zXK>7gfnzxBOa)Lcw*BiW26AjpcP10gei~OWn~s5OQ14l`QuCBp0mn9@3q6%ICPs~e z1CD^S$6(L5FRm{sucDVk#zMtY4cIZr_S za#=@Q6D$-B(g=$~Eg@QIL2<|2Sk4BVjB#M~SS-vHvaSJa1WQJYG@xlCR#XCQ)T|r6 zGuKZ}6Jx+@NwUQnJ2%_K&8HbzzoO_|DHYYigYVP@kr)WqH~ za!>l5Y$p>4;34QtSs+LZpETVtK&XQ`3GSQ`LKxoP1 zW4zpruGj3K|9Z>pjshjbZM_Y_t93Qw)`oarl{RZ;&>x*KF1$&D@j@?az~(V193D?9D$h;>)Z!G%(s`)g`D+j@o{2MsVlEYW ze2hp0pv_bOi6RZDHX7qRQALPFVLM;zi7lF#aelN7aEvL&U%&B886u-y9s({CN;XZrEdV=Dm6C*@PpIGjcViYBH_PW^xWLXx?Q| z5FCIIQEOq!TFUMizh{m%O_pHINSqc1h-Wp^lC}0h*4Zu4iH=@--@Gybba^X$uEwBz)a%xU7%ZnRtT!gTo!vo8-ayOdvi>*(7Gu%AwuGoZtUau%z7-y1qU zXay4_iuVxK5oX@B`Qr?GKVxHBLCwgiWo0he=?Y*fGd8K+mYO20P(-j6rC8-8qy3o9 z=BhsKyV&A1QZ$K(25o#8fJ=5yv%`ey1><59mTqL?{9b_&?HQ@}z+6VH_mfqFtn3>! zLT|XLnB8_0np=T3v)c-&UxD_s+m7yW)n#^D!?Z-Hc7`)9q2tysauRi%Lc5b+%T0K0 z!O=Z5S)YCt0iP|?*z**{W2vVllVH~I8mKFYHdEA@Ko=!9yIyXUz{yJxl?v99nlw_6 z+}>p=W6tXk1aT+Z#LRxey^+33#l)XC~)^2R9rMmwqxx}9gwIx2Uv zwpPuPwe=eMa$BdduYSL-_CdM5A7v(qk=_R*dvqH!0HF>!phtem*1p(EBhoqvbV*6I zWpO6qdCSB4U2?lhR`a@kEDeZHP)X2gNb^vBHE_X_BF z?dV#dowcW?wLDynn$)+&t#Deo|Ts8bp5vJmPWoRH%9Z& zD(_Nn&cEt7rVNKMy5&}6#Kozx`gqqzOQ>FblrdzcBjZCLSI=Zebn`(gw<2xHh;>ZI zzb<22)*fngVAnmw+GOhj+2l4{m3D^%J!IX2Lfm!Ji>j__=qj2mZmljCc-`fV6_06E zJr&p5%)`hk9GfgkyU%W+QaRSQ?|G4Ec; zxFs+6X#~rtWyTyWS~Z5yQNz$h$s8LU$rxRLoeCMhiq);$lsyqXR2+GaVFR*P6ou^I zpMGZjmH#&-Vu|>I2cUg^MaCl@cyD~HqsLP$YuaLG9KPXkKn)FaadM6f30T~VJa@(YpFvvi$sNKE`Mfn zIyhm)tboI9{iPF|1P-@VX7aN)FSqATaaKaDEE?f9NL%j4XSy`U?+{^hN0ugM2hJ(m z;AOBBtdV2&2D{UQm$lLPx0M1~l#wb-k;cFhEHhX7LB?vgnI2?vNLicHI-ae)9kQj_ zrZ6183|XcSvrv1oV7^(;t(lCF1&!i2IHIBN!tB>ec4+kNP5xA-UA(7K8HdG}oX9s^ z!IP~`SUV+ZVY=*9Vy^zAPt9o?Pn3NAnRT7nEQs@* z^SPAFxifCnH6Xv_lfy#VA%NrarJYsfg|Zoo6tCsM@)}N9h3XgA1t2<4oi_5>ORqln zem)SuX=8l+7KY?FCU~xv2xAj?eOnf+z2^|b^b|r5a!QjLpu3QSW>+7uT_2~g`)h>m zw2oqol5%<#vK&heUIgQ};HpZnIUn z=G@7T*Q&E8#1VCCV`V%fgfHN)P zP*zdRCg0lIE%hRwwZe4;-|TvUo#IBE$9G)>m21umMW5a+8)XxyG$Ba%5`@GXkDT%Q zw~sGe?066R;4Ng(1+b1$GMz&7r2V0#<<00%In1b2q=FBDVG;ctlT4~;YiacsLSQ$Y zLe&HhQDu@&%(<3N>Z=GB8}liJ7LQ zpN`k2$367Qg7PkI39)M993rBE@xdXuFQ=NXhgoUqu?Tt-fh}8XvU|dEJ0}yD*|{lK zzzUiy1Pub4pr;&DK~S@|bVN3tX5)F95$Rod2f>y)WB2YojcDU`}Uq zx2v$Z7)yJ$-PZ5m%2rmlGowSxos!%hRHU}<`)czpM|wLOQ-~QUjgyE5RM}I5j$4B? z@+eh%5@E#nh$jbQbY>EHR3Y3NupXF4m~oG+Vlsi9 z?JXvHaECdDrvu#F-Yjl=vvh4I0`;5>)XCgc-D*O%3sck)WYG$yFG3A%Pug5gU1kM! zJ*`=5T=T9$10{^|cC~8TSr4e2THC5yHyd1a>$^8iYhkaeZY%6x(R|knJbiO~qe0hp z&8=;BYuj$Owo==+ZQHhOcWZ2Id+V*;FVFM7@At=K4kjn}FFE&QGC9{Zlr-3%JlKy` z0j|!mwCxOzfa==W%vEi0?^y*Bh?*gZHMGmHw2^bOA12}A#$<0g>=YI{t9q`an_8O= zv@P*STDGQ`r6wnr+$fojEkiHsXeVWqi{~pAQdh9eJ0BY~DcxP{*rwhhHJUkpQYBv1 z;CUTgtJ?^(f0XeHYtt5BXzO6=RFm9v3(2A+!W@9XXRHddm+oq@Mi;UG*OYJ_&p>ss*nELGkVe5UMR}`<~InbNvKM(d+;LkgCz7E&D=Ha@&tkv0#EDszZKGv5q6#XJZPurGX z>T<+crtYRlc7wkcSPCTwO9pHt<|fXLUOJ{KFY*G0+}4>9AkQ6nB)IX^FBGPw+gpd+ zwv)Hp{BmP`tn&z;)E`D4g80q}=(Ob}1`)tt)JHL*B1JSYY}(oEWU+JXXE$l{D;7Nq zLLykLWmbO{T-DifnsH{O3E75O2gS19g}gZ4YsLq#95al+H4HjUoeN$j|FgNIQNfUj ztD_cCv1>H*fc%hDD1X!;gCA0jDz=Cm4}!9i^EsS6gN!d^5r20*W1vZ|)CtGyBL{i& z5x}!{Oc@>KLK)6)xY*Tee~c6I%}8zPql_i3AcCGn{ajXJkAtoz!N@JZy(#3v3In~h z^ZXAY_hhvhuWc$M;5`ifUWg@E^A&Kj%~?9b@&f(i3-oHUz>uz0czA6K3gNK8FoeSb z8~Q&2K3j~O?Hp5^b+G@y9ubqnjTZ2|-{5e#0e`mJ9Oy;b@{a$nvQvey<=y@Ceus1x z<+;f3k|RGnjyE(NWH!rQ@yZYuoj z=d5;SO(fiCRz%Qpx@cZq2oSwjAYO8v0BJN1#%vP!(rX@=aoE;usZwVRHJ5p%p*!s4 zqOOnky>6(mK88>Jkm(OkLLO#c(?8?-tbf2Q#_VtxM_1b? zQ}#Q3?mEP&YnDgL$LHncmNH3%LDS0aL^PN!(D;wa^cX6{d0zCK)O6uqjf!6M3f@gp zYwhtO@?&BDdS6gmFRa-Y;oC_$>}nJ$7EkU9MYmM)5ZTr&NM=_&&UZb$_ZAkN|NfMp z>IdEGdjf4in3*bb16wK*8h~6_W7}l~@iz@DOrC(6m<=7ImhWCCD zsVc*cV26GJTi2m1!5U9pARPfC^_ARFbOCD0g-Le=Yw%{#sFa^!e~L_f9h3cx?kI~c zMkRXn^6kdN%JGJo6JZg@MJwIkm?+aEpF1XG?}7?y`jpcTv`ld4hyu`fW}GKCR{zXo zEti}murC;%MoiSKdnkE(aFL<1asS3UXqtT+B+Mr6l#MYpWVWeeUE8`9{%azgbj<^A zgp|*WKc0E zID`AI_i_>He+M1^pJ}VC&Y@XxucvGp%ki4^g7OoNoN%rp}iLO*>Wr`zia>7q}OQAP6Js>9`IGt^>$_S z*KG{-U03~5@Plmw!l_dbDT;L;B%f=WZ?<%iZ1^AXnOfpAi^#qu%=dO+F?)J+^X6oA z7rmi7*D#4V60g*KwURa#Rvzg&ZD^FF%2F~FMG{%c8m|q_21fCAwssuKxp|BpG6)XH znxLYpY#5KXPMDF^roHgpVkym6P>7mKky6iOk_<*F^Lv@QKmbCB|E{AM4E;AyPjz9% z|Df$kHsCzsn=ytN4(IeeBV{eN9~BFhJh0oU=4GtxB6#|S_w*5Y>gi{oIQMr#^b?dV zs+Z}f@3qs%y|N9ILiC?)a)WY+Aomhzi^MES&67{*5yx^7;N+e!jfP=X7;MfvqwQ#t zA~dLxbO(lHuZfAag+vyQmp!;@o1!&H6AAcTQ8*~FG>?NwHq_&^O4;i%Y~EWu<`lCN z&_|@MXb0!aLmJ|2b}%9#=DgNV>$Qhz?d1>!)UI$go7%57Ro4bOtwhOPmH50l$9=!v z&_FFS=Uj!`VXJ6j|H(4jjB+DzCn9sZiReArd`UwSEf_~FY@yTe!t z4y|pMDnJdmrF+$6Sv&6i#o<(^`Hy^E&yMSsbiIjDs+MT{hCE%j^(H)3#hd6nX?H9k zpce4HsxZ)&Xg=!J!@{wKXAS&3qHrpXxRvgHkAJVMMkPx+j}#ZhFLT@vR6LZO*^N5w zV8!O4`(EN8?TgP}3eQK+pHW;t@OAcEf&Gppt=1M(b3Gvdh^e}sY^;i_XhF&-a3-fp zRZTAzHvcVWj+&GZcNJ~s4yv+`QFnb%rN*s7`yDl2NiQaX(3SUSJNM{f6w;P zc~xxK9T`%EV0l4zTcvP|TB7Aa#l;h;#a6ue!GPIIkIMYC+(H+sG(AZ=96fuQq7}ST>Dnc#y8z8s8(~`&K+iSN_tcRD!8sLzYYH%!?M4CZNa3Lg9G^T zp26{o0%teh|M=GbZyF1(bC|>3i*;5vhAzyAxo8ehEshUo$>NF^s)3geP&MF~m^ zT~n+Yk$6smxD>LsjHP15+s{TBP9II(3Smj}QA6+&rdEPW zOVb*Xv8-#Qq*O^EtKn{0QNgCFT4g6HPGKP`URqd`WDo4lIZW2Cf))}?+ePu3E?0ax zP1bFf!|1xNHWEzT$D4S8D!9RTQ}^{E$<+1#H!X)nN&h#-g7p97U>Ptsm4RX`Fh7Aw zDDq#c`P^d*DASqOiZ9Q9vhjbCw01*L>3=T8>T~A*L~VG}ii(zh(Lff06KWMsF**yO z*&w0si?rQD_J0uKkCx!rVp>w*Qq?YkKdt&WPQb}53y5t7h#?(Vq@gq~yon^|QH94Y z+Tt?fVNX#kWiyS|MM+n5kV5zSoAAY-n6nZhnsMe>uOqg)W_!3 zteH~~!6YTy%HW?39B<^;82AWS`D5qt>TFcA5G-tQ+@nyYwIcD&O0ExPt{!*mc7Tj6 zw%MGei8Sg;J?e_tl?QMm*6rD=N+Vz+)^eVBl}3;w){q@}G%Je#aaS0jjaVyeYE&8_ z0L@KdG#n~D>Iv2rM(iWj-T*|^#uqQ%Dyg+1R&f`6|7)ptc8KfxTINkcEy2p%R|ojA zPg%@S$3e{9y&g59l#lfS?a3a$cWow#n%g_s?%|c~$dLVvmem9ds4u87y+`HN2wilP z`rL@nS^o|n&wnRRcg<7L7f;AuR4hWSOU`HB)+GUmWc8gmXu_B& z`KAwvKs(Q`ICb88A%3DEB{`4(MEZ*9_{69Y zz8CUfI@<=d?|*ZF*mmr28er>SRx}H`^P2_3k2@9r30Q1#H}{mawl31N{rs5ide3=u z!`)PGQ(GI%p5N|`xy22K@qR+vS+`Xv`!y7rL`4Z_{pwkRbZPi6-@yCYYj(#I*#I+b z_v-5NwK}^0^Lc0I`3BLse<;>ss{+2>g+NLqi20Dj6Z~aZ&~z{fTF@o5szLhLW45%b zhsWhx)QoAeNyg=FV11f)3ptAL)erI_%X5^A@hU^TgyDQVlMqj51S| zD2a`KiH*t_3+rcYa-W@8Rk@uIo;=HRWUisJy0;nwbIe4Q`S|)Wg?5JPN5JA@y88RC zPg^CMbe_M>waRwTtqLzDv!ni2IXu2zKhftio@ls>HBv1+ZFd8(p?`T<48|IxIyYWQ z3tWwnXC`aHcav3i46r(#@dnF#ky<5!jq!ckl-Ae5Mm7?2=R!hZP5R4RB)?}WZ+r6X0|7 zGWbCsOWuXU%zif@^b1}!KOW0lzyi*10oV8m9!4mIK_z><*L@@aW}^>; z;zn-eCfzb!>iTCvha;(kGtXi-4JkaTmU;`u7B(v%D{L6L`xEkS$fE}gHl0Xp>u?5B zsl}v-Lu3#bLUA!E^m*POy(IDjne5^4&@&0c(!WCpN>?AsJh?^#Z#1z*w1o2ospoAS z=jjbAK+-`fP-NqWG|)(a=<9z?rQ5H5?x;T+#XGS&wK(es%1dSF`N^m}K z>eWt7{PWf+cO$AB{?wyD(d={17qWno8;tv#T1H2)a&k>5rDrl<%z&R7X%STJgtE1L z>dmJ25jW-v|6t0ly65?Jv9;;53dxT$OwuQ{kbJ5#w8r67;;wBM*OqiL=1((>$soI{_U zaXmkL{3<(r^hq=UlnAr~W<0Ee6z?cK(>BP(UFoN$;le%ok%TpwS-M z4)my!Wx=YkISHC2X53LR{mf-&<`3JpzeWjR$Lb=MbPgh8zsUo|ygPT~c#DKVq&CV3 zeF#iCvp4X(N|$I$e<`<5|MTk`^;&;xN6%MYHB!gAB3G_TY{*YKBExC^@4$2ErZWR? zEPicFo($wd=`k@5>;rZe+FDO=b~T!>C%c6IVI|=Q(4^*0=nO{*aQyjvFKz%?!w+Y(T<<_f*amVk2jMfdKO=@T&hsx`qO`M*1UqP? z842vV?DsDhsmU)MZQup>`=^G#2B}1efmn(* zktW65Mv}g%O}u@Qrdst1m9oJkZdCFR6IaI%)WlVY7#A@X@Am=?h5YmC-3xk~E6ih@ zoLUG8B%G0VQTUV3?|oh43BuuhQzwX7oT6ap(TvHWccKOcD$#_VV4;YieK_ zmNPVA^jWG(yq_WZasg8Z*{}BdOBVw){H<+cl%OUoTAo4_wJA5xh-d`( zAZ*S+P)Zc0{4^R(H#VgXC~f`WG9azw09X=>xUtbEM{r5=3Zd4GocZdTT*Q^PeQv&x zaL|p*#xk6IAlSrAU-muDkVBn@!oHm&W2mB62W(To@7 ziK7nJ;F~2Dd2xkQ%6}P)K~laA?np7DXJ+qM#xsF$g9RSv2t9G#wm{7?g9fYbLfmC0HeITFdW4{ zp8rj)DLTHG4fCUTDUn=>qHTDdAIMs|7r*B}bEEarYdOn$^QN@gz?o%j_6214!pi~| z(=u!%@u+rRjLqUFF$oeQi(x`;y;NPAL;wIGuNK<7jxB#p1U+4Z0m`KryRI?+Gyt3z z)UE~pgf4J9BVMA~a0hNJv%InaJB==28@t=e+A#F79&N3uv|;0J71m@{dd=kVV$?S~ z>2wCOUmp2>W$;S#-HU43+lh6XT|T#7=%Uh<7fWo`b1AD1-D1*u(jsT{&EuCG>e*0t zz%SpZ&8fgI8kQ4KgoH4$1mwNH%i%g?&OK)=$t(z9A_bGadJldqPZ`~B8MVTBE!)gx zACOE#3WV<3BMde7vgDuFO@Hd^XPw<~%&uvQZ3c_wn`01|W?J}Da6)BFl zewYm`Ib4jA0M?BN&~`!1@@Im)Y_UyJ2U`I22}35=J8L}iY3bv?G`A!AAd9)AN%3DY zLsDPCU>;s`Alz3+OE#`{l0!V)T>gXojsYhm`U`ISWsmxALMf({RK&UBsSX>mOLEfe zkc;oEjs7b!tU^N#=qY*PS|G@sRSIrrR}XlSf~Z zKvzk-tB}jt_dUC+8D5%5dsQubdGhKvZDH5lyDP&_Ppl+)CfaSew~qLSgL<#7*cK<8 zzp~(X+v0B>{ttV~t6jbxKjY$}O0?7C1rYH+b2-}-Ys+j(Ij^z!FRvaE@%Fst!Hr^@ zC1$URpy!&3M^6~A@TlCpyR_LD_bBZkh#I~$&3{G;Afoc;lD%D65APRtY^uUb_Wj+b8*_tH12aUW-3Zx zjLgfR?jIw-a=`zVLs6k6QJkS#LkpK&qSEk?K`B%saaN7nlB`u9FP)wAL2xAdI_q_;mSiYy|tn=t~fbi&z8C z8SVP4mVWWK~ZILH5 zHnyuP$ho>1jvPiNVS$e==?UC;W&QaP7B{N0S}>`Gt+HduKH4NL1=zPUS1Bt7&p49! z_`50+%cwta?o|sDcALTR^rR?;EJRe_n}RcGyC}v{QNn&E3RLf5cmg^}Himy{mIf8z zsFx%SvtP93+DeuJ%jK0O$t`EFPu5OP6^P<|%b52oy^wo{KXah2q_K*NGQ^BYQ50mN z3en*Ef{O}`O#K-r!{xUm0Pq^2Z*4iB@NWVYP_LrX(IO8(tDlzY2mZBdzV(A?zr`@9Y$bWgOYo_R@nw8L*MyRt+-a7qhmp2@WN${-iHbMp;pR zYfOr)mhAB63;Vtz#SasSW)Pr|=j1QzzKaDB`>A9nf}=E={>Y9rL)S`{@g@zPox0yp zf~uK_gPQU9uR57B zUYrbMjr3bth^|?!JOkWrhhqe&=+^D=x>+x%yB76Bqmoc(i|784sxP|1Ip>GRFmI>W z%O`N%S$-d88UxblrD*z1h5yT->aW8EH;&~M8$0`R#{b3|@%U$RxARj6<=sO2M5k)1 zIndjK zP_^elfl`ITn=!@)_hpzXV2CPP^_nt)MNt|bR9XDZI&BGE_&iLIV)rEz>bux7tD6%G z7sa1&Nf(|r^^kch-{(C*b6yzQ8C@_y>m|?t{}|lDHL%geMCxqB)(gYLs^p+TDprop zoi#+4JM0uLw-BsM9z;uci#RexzX`dL;J0}+`2_0>wSr_H{PuRNmVR5Xc~4tm>ErC@ zt%m;XX8)(&jmY7o>#v`rxL(0Ar=9J_zYru1m%2g6PQ$;rVp3vcL%Eq<$W z7M&1(ZZ!j$(QIQ*5opT2_?G+5$n5noXd#L}Ac!wUV6V+Y&LKykaEh_h*&aj;*yoy5 zK_~x967_3(q$#*#O=cJVJm%?rv*nIqm1zsYqLSuU5ru;-!D!w{`Fm#R^-U;B-pQyfx&KRbftiZ`CYDUzdhd2uZkLy`Ks>7>#i3Gc?ve5@2I$0u5LQ?RSVh9p zlVQP7D50Pvn_`lwi*;m;R;R6!Psw-$_#UTiK~HG|lz2c_}dk6pA-nS?dBzely^SF4@QluR|vyJ!<9 zFk*3BDMcBX##I_^Koe|tMoBP}2Fd}{@Ym$C113T`15i^xheGOrKwnuCKhwBh@eD%- z^203qj1WK@=vtsZpn_jP(eib20s`iBBoU`x{2@*Z>W ziGYT6l0$W(QtVQOgppWrk#@6o59PP>%T#*4grq(J;n#=L!?S)r--qds?|=3{i|?JF zkEe@^$IE^D&5oYJtpBlOz8|KXr?LN=%L^;-H+$0f{Je&~n8LqAQfObfD_$;8P>_|| zvLrtUdkA_{vV&r>1TY(nes$(XpM>9<7^H65Ln6FWG1BE$qi`HFF zp}6M#m_}CPekxUwIugTQtKo!$pm500xMI=tlkR{FH1XWz&k;*U8IAK$ddikhL{TwD==nXVhSk~$X+jf&wM9+)W>R>-yPlNLl0* zLiZ(cbci_#WM|@tCSsCYB$dr9VO%v3E9>*ZnS_z1^e|D{NL*lPHb1n?!LLtaZOS7n z;TlbtIigcm+vdigXpK4rz^U;jFj{(frzr|oxK&|5JwzI!3EtKP^U2A(W41e1&_af zGvWU+Qe^uze+z`Nmdvav<$`FEkmFYmSXSBbT*b!HWV%moMCuE?V7ym6A8bIk8Y$mX zFs|j~R>xo#h?fbY%ik10@oG&YBoN4+xWSICU-LUe!5Ov@)~37_goi>t8V9`XdWWS{H80|AXO z+`p(`<`I8jsUE7=PgIjR?;aqCiEnTpAN`RWIGL6I*{}QQ^0@go+Z`+YNZBf^niJik zL<>)lwHn+RN~2BHI0XyC$xEEUUd@Gg%SpwVOVfmUI!4`P51sq;!cu+Brooku_bwu%FnF6HQ9>}d9C%pu{68Ma+8Nm?2t z;^go0uKaz@ac`?QD4H8BwZn-%9*EcY(dY7rKbbM(=WutGa#K!z0X7!Ni3G*XGPK6F z<67;h7EkRm@&f9j09(;+QBkp^bS9b6MKY%OPC07EREyc~541w=*jBjdGZ*#Y*}|8i zMFI{~zr#Vu7R5jDXotrQ^O-vn5+$ZJtqRFGu$8&u#%7?$%hs<<5EDoj{7A~3-Ym*m zHQeeyoR2x(7iO2*jxEqtx+C{zZ|uwftXaX(Kwy<&Gp0SYO!jbKZsr*BpVB*hSC5i=?^mW1(C@ zmWs!p@k^_Zb*5=~B&#u)RW!<*RFrC2UCd+T*EYa~3lugz%AfhN54b269S zpsYV)v&d8J%TgaZ6uP1A+8X=g{Z~Tq{RjwM)oe}vBWUQ%Pjr%doF{a6W zd>jo^$maw7IyOBLi+CY<>dSP-+-U2;s3@&a@q>UoN=L}Jw^H;l5(|J(MN6b$U`5UfyJQ<2t3@Vlg0oWibNVQo}ObP1OA zapyf5ca`t20|d`sh%;O9dp&=s;uXLa7v7RqKiOHoX*A(Fdj3_UZ?N1LlaedRwcT0| zmRf+*)j>d2J&h0WitIG%|9a>(a&01h^NSCndSK7&-l(SAjz0-jGFA-RL!l~^KbA}7l9wSXoPC;O2CyCv#cQ*Gh5J&=FOJ2s+0N-X3 z(WiVtFF&(rR`!(v%B?&{J*>vn+R4WO>U3XK;2Wzc)=#%k{p_0n+5GzAhw`KIj~&8Z z;SxJYy1YHYfagm*|BzOvp9&3F6w=Zc^;q5qyVL(&AfYfc+tyo75J;KC#A+8>v&a%yW7v|V(y zeh_-3P!%*lW!Yan!V=z)BQ3seBOyC_-kQE{E40|iejVIU6*yzocJ|~-hUe8PIM#5< z#qnX>qk%mV$3-D&pL=+Jxa^uICWf|9`yE-SJM&3Ik7Lhj7G`U~a6&V3R4zUr{bkqu zx;+!YIb*H$_7LR?Xw!(N&obJD=UCgnaPu%+diAXmyjPxY-tdV#Y3Zms$SzEZrF6Qf zlYcJ}3I#BUNd$kd^Sz^u8D93yaVEez92S*ZHd$#0qBXEF}ALDOq1a(mQ< zsQ00R%2HYPBbGa7ls3$a5V$xxR~FHpy?{#E-e?b={2N$q^16-C=?ad!NEuM(q>L-+^hjdPEZHI=RRw=?y*k6bZLR}mhn}R^?eV)@}gh^vuWR? zTaXL@sTaXP|Fw4MCA9?pm%WY&2b45j7SDQm!=vzhOH;))*@2fySQHfs(cK6SS;$2! z=Hn>}70m98vKhyxhpZxkvLf0+ip-HLY^fce3o+-6J;@~EoG%j=%mhJS1a=CIh$g+>On*h)RSW?V3D$p^shdK2tP#%@3{UE zmx(OofSe|=cb2;1RF0Ui0YJK<;F35`noy($bYoM>Hn6K}-0Hf{q+!=*F;IwljhI%X zSks9oiXFZZO|ALubji@kO3&ojkYt%@S+&wsOU$Wq*H3+`K_q80hNS??UJM84-H#)^ zym?-DOiSve{jAUm8oos(M+6~CvF3?=GX)uoXb|m7}odPi) z41VUVAx_~#pQe9u{qyaUQZFd(Uib&__a&`C%_#b4rwlf|MtDJEn}+Tl5e@v;FD;Sf z?lN7UvsTrz=)B(zot`ZCdjr<`vb_v}a}Dq2q;~zIQtmKZgV%)PC_HSp$oA@ASYg)V zhJ+GuQ5}E1yes7Fo+gMM1{4p(#6)A6(X(U7nT^zt+*c^b}`D^OYam?Me zPNpaSve2Bo6je)gJcQ+mC?&I<@ev=L6RGk=#-i464jM-a)63+BEv-%n9Me9jlK;^O2o4!nmk+ZVOw2z?_8M1H@~^ogb#AOge4d4 znsNHp*GA3qb$Hehtdp*6{uii?QQA32oNa#yN)Pic_GK!1nbm)Ko$LducXz|N{meN^ z7X}(7W~s}b1fTrYm3Z#JBM}sRQj&fMV2h`9{N>G^vPglqv7o-RA?6_ut4eWy&c(Yh z6&{V6^{Wl3EPC%@kQ^tT3PEq${z;h*!78l>T_L~p28|6DQOb+{W??JG zvP-EByy!UXe(a$`!z%Y4hU?mp$scdYfr$9oR;3PWRw9?GoSSrkwaSGXkLdS)h7mMaz|&M?e`1rAf4hsmo=QZMUx$3=vq%r(E9E894{q&;tdq3xs z*K+&c$ldvkrOH(cbmC8v;76UjFMPjYSU4A3&YH`ThN5~ciWnZO4Kai!sTBnjkIV_= zm|wc&G3qv&a{6Rh;>*vtbCi4w?`RO(Ct9E5?d}e!H>wEw$lW=G@6$4CSOw_SO@!fP zi7d_vgeMSOq5>?1r_k{XnihHzz=qdAV4xhf<1waUbQ3UQqRN`?IY;-TIbb7niJq)n ze+=r3*XNjMY%r0g-+Lp# zcefg~04qyZT1(I7p{fjWKQNgAiX<7%2FP`Tj$Ed)$XbnS_)mYM6pK1CuwoQzE!(iO zap3!vbZ1jP<#LFmR%6oKhON|=t8IrITy+3JQi+*YAXx>Wz1m6gt!*^C|f(YbK;= zvz6xLr~4UBCp}R~H{VtC`?m=#QTT`GSz2aRf-eJK-# zZ%c#gZo4u+(^1}qWYvd))2uCQNv1IuU(fS$O%}7J2#tA;r4%`HM8-7i9IFNqTenxv zg;yIiW(IDn5S;YcgC;D@qNNhK0Gw-a@aZZhkrb02y|kfyUHs9n-2GU#;bUSjJ4f0T za57hNX2xU2s+KYP{A{A{lrQ2`qn2;4X2qVYkvYeRa`%fbBuv=OR>4PVJLOn{=_@qG6M3TWPo8sW35fnh!LsuU)4IGt{>)70h?*j%)b$Wgcv5=N#F1 zqUPi(k(?SkwIv2WoLxP(=~TDWwf9AFXpI9dXx4gQ9mlHVgz8O}(K#N^FWL$eiZ$ye zMRKGvwg&}?1&;NS3yeB{Ao}N(REr-JQP_go-eUO5MH@*sXIsDK=2Sl)^wg0V6ZYOP zR3v6ZOKh#Vt=ejFa=XJ+a*;51TPM?D*+6!o4R&OM%IRxe>+l9K-Pb-r8J$)RO+B8b ze}54@@t|oXe|x}c>7K8#7?Y(NSym-sLRP=KWpkTsGHe&`a>w@T#aj*O=zp7d3s{dt ztvAlV+Vf*W6JH|Ls7A0FoQLs;DmA8vt2A-iOf+{;soKMOD|jo|4q}wtDZpoLi}~7I z!$27Pd8~6{){hIQ-+9I0-?REvO(PHi?%BiM+e&mT0C!ERN-3Il{d)}R3f@?a>sz(~ zkpQ$m72|`GgT%2oMl}1+P91C=KV@Jph#$rch&0Ub{y<-EE1JNaxO7!6=7p$xMi(w*`%Y+d^ zBW@fg86fD;!izZ|oCHp{ZwB=_vkb=cv^@;l|wLn-Z5qzJ`tc-41Wal*d%ST#Yjo#mkzNb3kwu^iXHv_}){av-5C5{H+56tFHFjYN` zZ9&q?lDXR<#8sv}x_fz2RQP3Cf61J5#+df44vRueiV4SZr?G@t*);Tfh{MxP0_pLB zqz>h{itG&k2&zZ8fm@rJ(!hO`nR! zhM5$@qRHsVD6tg6lGn(=OISg%XU1T>j_f0q6M=|_RX!WZ=yWdIpkv*~y29vvL_km1 z2XRA6Ri5O9bf(AJS%9jUHWexPbShj&wPI-3Ua_)Z=nxcf@}1k&Ez6uE#*!_jQU%?r z*jR6LZ-~6^T?JavMj4BcN+>xp2x#z58!hT0e7Edzsj6-DH#0t6isu%c-J`iXITg+t zVBF;E2v%2VXztA%t0^kZ;%cQ%kC~tXOzWx_It*Mjn)*#1x4e7`Wuee&pfEOj=5Bm` z3^+-rB53w^_B1)hzCUyB{0=TLma30wfby2{*m%RASq<16K_$gP6S?mRqq3dmzAV*T ztg;IBRBVc;!JKUZjKEA1>vyx0*=JSlagbsqJ>1l3QKvJz|J;BNxG$GvmBs;>ediHW zXC{TN*R>tXnaB;c4kI)sx|REsM_$)Rj-IsNprUo1*f@ueL$kh9qGoT&M=|0ABy_;?>3lV^apT*G@idzxnEenMy%Nj$o-F{GUF5__6q{X<`I z4r%m!x82U^SO+}2tA>J+yQX-d`=4SIyS7DWy?HbAQiwQNf(o!|1*e;%SH5E?@31X% z1p$9+j^t2RVO?AvAese~ykDu z*T;SSvx(tYx8Ktkaqn@_+0b?pM7eH#|6Je~JP@UwNppR4w zE@7Jro{n3i?V&eYHsdop@-bN52{ISEV8}bVA|HHIUt_i;J69z%hGJ>LSE4?-g_>Pg zvwihPAwANCB%t+VNN)sFp2H5R{kMUUhIKfpwD0tzuhtE}}gV;tW^`+JX1Y6ZWBf^*|Ct-19v zL{JLVqdnnweNCc14WOYXP_@ca)S8Bk^xwxGnzJ_LO9p+9uIf9 z7bIZ406h~LJm$%DRUZ{Io8Gg`ICA!yrw_+A<-SF>q*^4mF@oSg+g0XogQ4Q*7nUIe z5Nvs}-%%7!BH+M2z!zm^^4n*Zf4Xsdgx>mF(N;0$O8kO*r-P5H_EZiQp+ARomp!ua zC%8{6bfQ#rv%CF}Y!4IX_^EB&1d{xh#9M#6INo&xiI~zQ==`t{cqfy(Bi?BPzTnEA zi)n{bemnCkT}T~OiS)>JwM{ndMEZ&h(N~o93{T&GkUqXMca+Uf8aiBS$Dcm?z4LWZ zrTc}lrY(0yKk$|stro3^#%yHud{FqlhWy0UWLVYG)zN#wAXgo7^+M3cj<%*Tibk#m zBc8@KFXJuUU4T0?CoQw^R9j5esjAs_Fv>>arB|9gX@zW7Ys@oN4)q8PHRexc$ z4YV;mj6Ma(R^biBwzmmdCEtz|7}ov7HvLCNBH{|1{C|8Ag1SoICHxi-LAGUEkxOVB z!RUeIQFB9ZwOQjhzo@uzLuL_n^7H)MFQ0gip1N=qz{2Y2jK;b~Rr6)a%R*J$9)-Wz zcXrh8pMbwPaaKZaza8>^(b3r-8Zi*cAplybu{+@!_| zc-E8B$Rww=(A<_^DF^dxg`S#f&4vITK;Ix14PrzRbK8xt52T$;FNQ2)$9(M}ggeMA z$MaB}C(0ov(HN39=u$wIfOiEwP~Z+xDUB($(?@rTC2>$k3wX?Hgl)Hd;&q&X0RQ0G zbWq(~TBGo!G#PGY>7!D^ZIOG+TUxCElPbYz?3v*p3z_`{0zj*0AoFLOHEqHU%0UEpN0?C1Ik%e-!}M2SW%l{GO$cFL9m!3J$dY6k+OtB!qAK}v)_{X^{DKfAA5 zV}798#nB^=sKxWPKQkDz+vKrrf$HBP*59oquE6A8&Z!+zk}5WFi@F5Iw04zI)Jn_> zEH)kCNE|c$^x*9Co@3Snv{kDyD_^A%ewqYCfuNALFf zlw`vXo*0BRoU0i*1L0A0w`0sWfZPg?;_n6Qk$HBF?ndz7+1Di6NU5a<@NJ)gxCcy# z&(maqryYC>vD(V72JESo;E%>2mU#M~znE*hSl%(ps%r@_ma~=**kAL9_4_{9c;3!$ zZ%@;U`@i3g_Zf{};{AEw&d-v+_os@Bhllg~eV?DaoW5uU-yWJRCh^`E%ZKyVUxA09 z$Hn!%f$=X(T7#Q~>p$t*_b4QIY{O;{u*LoCS*Vl_{ht0KQ?5u?ow*YZJ*zBn4bYfB z6G~h;dcV~1*h%@N1!gqZCcl`s+=L%)*hoR|5w+Ih%-oE(6%`Elcm0oVJ4&OH)AE*j zG-fQ3@@&=kLYy!B4M~>Hc-Rx5#IVDMIJIviOzIwfH>L+c?LVE!BvM_Ox~YWy|7g3X z=*qrrVf3+W+cqn9#kOr#TuCaf*iI_8ZC7mDwynGBUwfakPiyD954U~yA(?Z`*~geK ztF6rR{u^WL)l)%X68UeDE2^~7Nm%!^!YtSf2VU^t5r=K*VuCSs@x6K#(n(&&T z{A8uE9r;+#yg`*F4;sUwJ{VLFnt^uo6>EQ)I>jMp<)`wRVg`64K*wMi#mrzDim^S&vNB@-o=U2c>k` z^>CaabG}FH6MwYG6uLm=N2Qen<^WTJxcpk&qAFET6>>u`ZG8bfaJui-#Iwu7{>Mw6^liyLSLC{N95Zl@#S@ny58}`-;GCb67&TWA&``i61WJ< zfggU`%?M@#IWn%`4H=rQF@&g<%4XIk0Tn;M%1)dHqeJ6F7ugQgNX6s9X@ZL@an+HI z|1%f6waaPNHn689%$(qwOS_EJqk$60Or>B3Sam$|e7ZGzWq&G9>X+}{%41PH>&;AK zq3K*pD{Q9;C9F7XN4J>sPufHJe605gD`=^=Ud3KH)a^R>L4;|+h?UL{v>7tynSJ{3 z1ZK#zkNw-XHxbybT3~{x5pYc{;F4j*q4hX#vVY_rW0gP z*#^BRZmAg;M83aB#!`=oaQef)jwiV8a#U`v+$h$i?6q(FI5cHuV7;Mi)urNVH?%@r z&?xQ$-X4fvoZuYZOW<-oX^JGvPO!~wZEHg}2fbF-xEA|H1PryiIP8ZP3Q&q*y%G#0 z7kEE;URWd%T~zgV4)aofI7jE~h6M3oN~OT+!tF9wd}ShOUMT~AMmwY^Z#>A9iPJxWu-aZVe-xO)D^X{87)C6y4glvca~wDVRy;|LaFNab-`C& zp@$|FtCCQQ5$dwGZ{s+VY@8flx`}i_JlLcNfgCx$$@XW&svpSuzMkrT-Yhc92&B@W z@9o^(+%=UEPGo-re@Nh?nIMS6oBrNH=mvsf<`UufCB9*CT^TEXb}5p6+HF7G`c3qa zIY=tHI)pQ{=cK$fZh0I5;{X>>Gp(!KKdlQbFoSy;eOzn~*uCur5?kbc@2ZKia===v zhH=a4K(qm5N3^vLx6TUESvOr8?6!dW#~ zNDh+ZvHu$I8TF@j0m+%B*zkgl!ik}j9giBPsYOxSZywcS%jydhH%v>Jpd;CoA|p(D z9Oae%(U~4QuR@Qd!e&g^qV_^+A zCm-o`r3bbBnEGq!fbmU^`tmqAf;mc$qzNNO7lAG0JkSI<8-Jww%^NiQ>puTN903PN zCzm<6uIAKd1gwMK{K=5mWnL%*=2p)UpIy-kRoA)5IWiEhufUyi_OcNt+yoHp(Et!E zmH{v*oxu-qxauFgga0(IjsIyyGIxVOXmkUjB7rfOxFsd`ll3%&^7 z7O}+^IwxnSGGw(eWKw}FKw;H8hcyGnnpb0!kV8ZfPQ)e}l|}kWhO!jQy$N0`imQ3{ zKG)2OINYLhW|#W1dCOEe?X&<+dTSIz0)2BJjjO6S$WW88jd;je4fj~c!_buw#+B{} zr7o^?m}MZ_+ry&k!*p$8jgvou;+f{*_fjWBw(Q6LWU=n=qpaK3ukoh#0x}aIn&Ls2 zraE+{ep;qhq1fZ*Ss+N(kaw!6ny2iDi+F0?9EZInsd7TTlBnWSGTd}z$K6PWiu=tJ zh#mdk9rtm7cy&pblpSO?W2fU({%6^T&_)M^@)6CLzSm~rJ~uUrRr6O0tnsJ0*3hw( zRHE6v6ay+08a)03e8!R~t|&CU5En2pLryJu1hvgB*e2v1CIz-8BMv1d zEU6b&k_QqPH@^eFMOaKdk2&(@`YeVh>#6q{297QU?2Qw zx=CT;8u6{GvjZ@Wfy4I<`uSr(5h1C&=Y&hgA0esYs4h@4-0Qo+2*|4m1H1EbK>58! z17Rz<={KtVD=Rf9#0V;K%IAODU&hv&WGvFs%Q^_@rsEkiui)_$ZaAJ`idvnWk*0So z`HgM2Cf>^uTUN@^Sbi3bZow!uon;vHjmYon)dAMOwmIRvNg7Hu^T%`A2JBG5M0(9X z^U#V-Q>EvbTcOOFmh0xj&sjv#Y@6u$eY2kQ&3(dB!eIgJp_GK-FfP2s+3xZAu&gp* z@LyFNIUSU{!lKs}TMitFdG%B6wK?PG+NwzkFE`W6y^R*o-Q9gIrJn*Yo#qPB>r0SP zfWz+m?qLBIMCh%(bz05v#7ZEbY-4YAqM=hpXY^lno7El2m<<7I05z<$6g(3{b;;3( zEdx>#0tbTn(X1(<4A)ty98{*oL#@XtjKv%_1GB5|+~3@h z&r)hrW`|r^l*2kIM?LCG?{u}P`6tx`WI`h{?)J(~XM>hy_#}K7bi+|lF=OCdJZG|c zm$%!C{^2I~0&zQoCFs{TLU_{pgjgPSdjI2MV+U36E+B|Hc?0GVD5fuLCm*(3alZ(d zGgtar&J!RVO0z>)$^9*z=ZzxGZogm#qV)H-L)oTrb?JO1JhVFr?U3N*hrVsPQZGqi z9YZ>ZQVnOI2t4qxRiXFNZJju69Oao&t9MK>zKMIIe3tw`g=_8VcV1;f(h7_0i2157 zgW|S52tF^^Q=XM%G9q?SuQhI^lStAO?RD;MUHC$WkO@DpGxkzlKW-eN+jTxT(SC$m zaz`G<9Me$V<`7IiznnW6z{C*jb}$4sLz>*}OdsdngM2VCtBZ!`RN!WJv1$%CmVY<{ z9DBOwu0T~2M>V&=J&ti@=|Kb)(EyIBGgZJH_CSwy0jVk`SaJI2+g$t0hp=S*}k~sU`v;`^8OM&_*r@?yV)ifP)xhcaGO1x-}YO&(! z;>veS`@vW_Nx}Hg?8H^ISzHAx%D?+aF+sJeAHB=2ZrPI<%s<9ygI)l;-9>PJo*rLE zs6G=iS~wqZ@O_9MZXm|HnLqffkNDMLh(7{PFW!MJ{&r8mKm>r>nSuOnqb5WA zZ{1*te5^yF^aOe=+DtFDf$Q8Aazji%{Mb|zvKY4%S z?PZsYJT5m>o$%`AG>Qj)D0;XX9aKfBKPx+hdZ#nCKa-BceVU1?v&>hu5zind%=ovC zt%;uko37szPSVz{N z5Z&KM*Dv~^8;Zs^944(bZ|H*Owd`6zv%Kfvpq)BXxe;h!6%#!adAF&0>x;3+)tT6j zBCwi+9%3V6(Gv!DRbQBXv$`jx@SXkm34~|g#r^T&;gHG99eHykwUmsvO2$$5OB_3* z5T+1JJ!kR&bGl^Se=1i?!Q}SfJgh1M&|HJ&KeaXHvO`u&`QRm5E_58mHe}N#y8d1{13PDN zomhHg)mNxRJBd-0`9X&3tCE1os8yjIW~+Kk(B+VBq^a!O!4ofB7p<5b(}u*X?yWRY z8r{Ykv$OS!5=FAKP5PGJ1l6)u9(xXq$;%>KfY~-6uX<#wN+aDBO_T7XUinR;FS*`8 z7*d52=?n&1qQ$bNklKPJK8?|%=ip4ov>wPV79)bEBLJt|n;urQ-Mt5nl%r_?qP_=_ zxkx8whN)+y3k;Qx!$yl%X?mr+Av$4|mOHW5!IUoSDFW(KSFMtXWY6Az{lmBE=1{Va{ z%V@~6&Y?#tk&NtAZuGnj3UmT!g%V0uHu1BDgA?j)(5Md3_mNMK%7dX>i5 zNe{B1#x4C61VF|WrM1mQj}dT7bgzZTw2BW0L$95dj$|%PNN1c-SBj)20_P?~jLd)= zOst$YIfZmFedF@$!%*I;WxmuOB6q7@sApZmcSt1BB zGi^PXpIB$F$j5eJUW{=Uu~f0jRt@pDqNdMfNhIRyMvfUpmKIuWz`>=GueLB52Ui{JHbhkL8?i4&98yeE5XahoS--#d7Z8Asa z@b=M$bm@1y%tZJY?ExN+HP<+@_DG&us&x_jGA4*$Mdxt7K-hcW{A9tqm!^gj`O0&K zN&m3^4;N1T`rlkQY1SZ0+H@tVjwrIt3*Inu`LScP_h#ndhhBVbC zP$*ufwz8Z`b?-HtbB~;x%~`Y8H*RObfKjjy9>w& z>d9|3wXU{T$zTckG^@Q>QSz65g5khCaT2(8%K6@3;u+Kr_?Y7oxXxeQCiOBwvAJ%m zVY`p$7zks(Q!Og{GkTi8x=XMkJT(o1;1*jQ@bYOhoAx8ZAVo%Q8@26W$ zF2Xjg(MGVDS~M>6&J605pRF8RW@^s7$}w;HR}AkJ(#@Q*{Sm{d$^YNQ@R%WfF#}+h zcg|)0DUYI-TgmP z2N+J`{sV?Lxc4FmitGHWd?bY_-qPMkB-^A+=GHk(0^fe60}^~_vRbGkKJ&S_<`-$lg?E)LJOB3{o!4oTJiO;Tzs-lCfil+$~m&~xaliP zpBmjv@^q)#%4Yeg6}Bqo|{0m7%&}OB{?= zM{dC|fT)17jk{78G3AuM^JGjICiS{1xlHws7lc(NZb9NTbXbF@4}z*U?Ddd39V75G zQi^LZINI8ud1~|8eMSnG_hvCCZcy!|M?nmyR!H^(o#N}ug#(t1C5m3PH~>ZiajEJ- zyEt2JED|$R%fzYto-J&H-HJo@4arVhym~ppH2XND%+FrgVToPyE|InVZaqx;V|t9= zU1Wu)xKY!9Yx!bws89hjSJw9nM;igky`X0#t&m7><;KDQ?E2wAT4{RVsvk5?9Fs#c z>go@mTvDUGCiMg)2NBNH@vU8aAu+UVz?RnnP|FaQifn{%q7=)efZ1=MHIgWV(W10K zh}O1Tal_Z6MGj`UA1!4oeD(US#ui=e{J{^SBCq>7?@oK}ovGyioZd|N0J0T$+<;q% z(K+vbnxj}NjP?kQ)%=P*{25|5DYk(NU^W<~D;T3T01M~a` zTfM#>;omVk0G;qy0lj^p?%e^We1KE8$iJgobjbi(fVilSDW4W^Ba5!LKQFSquFeGW z7es}vg`<~OVs5#e(Q%fn=`}ckP-AAGp3CTx(dBuwB1%l&aNq)o7G(T9@B>Wd z&0Nk)f6Jr(Vp}jNK=%WSaW(pI;Z~oBM_O)6ddVGsAbNQZHaiIo z93N`ftJSOlkF1+|FW^Veb_8#2wVpoKl-Yx3*N25vsV-=VrZW~_&vSD~kT9o8TW~I1 zJ-Dw)Rq+0zzl2J4r@Dnj%Vf5g1lWgQW1)R$f@h|;xib$mt_hNEtMjx=XL?C*HUu-i z&X}deeHZD*sd1Wa`B6Dql*`f{)GpmYdmfK_yb>q$b3)2GO)y|@jt0S?q+WLOXKlrk z?ne-Jt=gn(GJTYpcHQz~;FdVi-aU`u~CH)ZDR zK+A{n@T7yQ>U3zx=&}vg>TX7i)XrvbuF)tXgBQ;zgNEZT-;kV>bdgb)~yx;X1(lH^ruqU7=e38%7IJRWrTf?R*72ZpQnd9~wuhusCV)`;; zK)*`D1??Ze7i9GZ@X2!8zXw8QD-mjxAQj=v!F$2XdQ*oNn%FPJnLE~OY@j^+dbp19 zr=2n{3>ve`<>zn%1ChM<>}yS7l=$)c@-2+uOMAX5Iw4IE3E^MBS9;1EUJer$-MxxA zQ0nlJYJkrJ;zLXOWN))_DIWB*u}id#qIn`6%oXHGwLP7kcquYq?r}lx>4}B9#8s=D zlZTnyl17cTG6L%ZSZ-fa$m1A39|l=g(!wDylqLEv-#g+hK@-I@Sk-emvH|eD0saQC zAF9h2hT1ZrT;McgOI=ol4)Z_u7PL?m$(kAy<>EU_+V4W_{9eoF-XMmh=_@GrvYCeQ zv8bx$IM?|hMbQzC&J4U(K;GA}tBpY{c)(CpSXfaG%#Q9Lgn8RLpL9Eo z?EdsD7*KIP34p(g`?F*cBtyd>e`^CvE{!p&Kl)n7FIXG*42t|jHS79{6Bk5BN3s42 z5ozQ-nnHw$Xl|X(&PHftjb)=Rg?ks^RK^T+Wo!L0mDs)1fBtRS<|O?=#CuzWCsA7b zpR^i&=x_06;ut50z6uW&&SRgm%6FMd1aMkZ5TWX}=&|O9Zfgb#b0~i2tB&x(R0%`` zv~AUe9MS>XxIqzGY!g4N)7_6JoAO~~CM2?3vR-~OhPE>6-H|Tgt>QTDyL%rC-?tGe zc}5*P#Mj#LW#C5wC!DADGIlkPZPe%m#OBlVVjf*baYD0sN=$oKZgKRq2c&66?SDAQTF-@lTLUCi1Jc_QRCa&a%z(A)4Br+=}}^< zdk`__fIJ0olB$CJHgM_b>@`xV@XVTy>{mMtdJUnkshmOgI0AwXThU4pJ0Imgw8He^|vW*H$1RJ)j`E_az3nXbwiW?6m}ukuQFiBYoS+wBxV9 z?ud<~7%fC9FI3iZARUF)W-%m%IIuMvK|KDZ>ujm_NORxT``Zk9Jl*1;ysKEa;L1Yv zpJ}=c&zX(+11^ZG;^9_85>qLR!tZx!+rluKt4K8!9=ljXWV=i02eg~oTsw*VCw%pm z2pCW95j%$J7F|E3x}vg3x8_4a$98Sn*vl$s5&Y7+&M#7wjYJekAz8lv;K(ok{WBQS z1*7_qLRL|yrrZn>eD~$;&gguZ_bd%kwqv0LH0T14dKw)ZwmQ?+Ff|0rN?DK}>sxLe zE~I`b;B8Z#K;DMiy-go+)T@6b^d+*qSP5gePi!Lji@gQ#tbq%pe*rUjBmN?dHzAgd zlG31%+!^QRu+K_Z_%oD`apC@fK%9}N#DN2UZ3RTd$wmOdThC>+xm_3&ar!d|e<{Om zt!o1r_^blq+Wl!`wXOuO+gCRQ&JUru_u2cD2Q8aBQ+ic~E!K-ZHqY1nxOwRbJNb;- zFDyI8CYTbL-HX58pg;5zxZU1A#$Olr*d}!?#-(LRdFN85!alpLz~A-ln%%E%mZq=X z$|MH7NHPLDoPhqABn*H_S|-J^)wyCY2kBSra{fi6ei!;_2U_VT$7C9WcKdTbCiB3V zxcTB3eG5E<0d@;K!3Cj(=1r&(2f}<@2QD1m*$l32zoQ9Q@~%gRu&O`{D7(scw~g?b zc}ULDecu$=jKLva$P@S;P9)=Nm`eEa{`@N#4)NpUA{`=8{IC!#hT|RTJ7P%_Y-0a zcUx3)KvMK9z-2nAb3Q}+Hw285?^>sZGxfgvrx4F*BV#evP`V z+x|ZG#LSQ_Fr>ytDY$Wr^Sx~f$Pzmw*f6eq@*obK?!1x*Q{eK%oU|F%%lp~utzIAV zLQDHX>l91&&<{VLyGYo|SZq~ThJKNRMa0C@s}%NzScZNWtFpb8*ev!EfC@(Bz2)rq z9p{<@g0nBa_QC#a) z4c|-6HftYESOMqeiYB1?6<#`>;$U@(iMH$?#@!5JYJ70tk9l>^KAJwJ_r{eF$vdn6 zM3hx_2|p$WP?LD5xU}lDImd&Gfzit;?N21`Z$a;2rAcO`4BI@O;4qcIXwM}1Toi|9 zl|a3gh~nQ;W)J%1+VY%btT>8X^thrwZDW=$5QWi9A7W`MG8pZ(yIJG*0rT?V0$4qd zsfyB~KnT7Wjlaj9qOj*)V7Rqk?a5cdP5*5C48x6w_r&Qxnwlj27GS}&U~Y4$J1F9g z%EoXpr#>2#*BSM~ukfC*kTjpEujl(@dGoPz!^6S(saM$?xhtmFkwt6g(B3@zhNOPx z*lsc5#i+j4dz}llIgWn0<*ul5xf}NA*zUg3Is8wX>~bsY(Yc*!#Lc1q9FGylhQ*ONNQS&)-BfSDPy#}MyYMq&O-*5s&;frmK&tTHthvh*o1BVA(I^m8|Bg{? zCiA-!=N-}-@Y?$z7e5gBw^a#vl~4xGB+tLN_U*KJ#@8bkk!h1s} z%k8hb`+x@Qr<@cSG`37WM(Fcx<)$POs`rm}be~?zEsB1RP8?hGRVtQ4YlCW!x;-Bf z$3ypZ&o;&!@Vx5#^47o|+&Lww%`Yo>p8t<^j3WF$S;zT_Kh}{xWt?|6los8$Vtj(mL>!{^Z-j@IkR3lkRhb|A1U zh1Il4&TB%>J$@uf15{C!(wmX^Sl=d+b)-Zo+6j*!WL@){EKdZo?rI)EMv)UiUi*a2 zv=MIxVZItRWsvn(pA4U=r%Zghs;F42g)i>;BKSVv%pM(;0YIaE)W^qZa!6Oiw!p{v zQCXh+M+jqd6au2}$HV&S>F{&a+tKV~F17ucd=`SQ*C~M5U@qckhVsYAR_521|3R>&y%J9X0B%cnrrrM;) za?(mOs;?R=zlw65logY;t*3&k8U2!Aa<;-f(K8+*%V^9U&(hzAuaRidnX0<)Hw#Bb z6Z-zn_-=IyHwKxL8

wSj^2J9yC>bnpO*bkdR!szk?xdaZ0kNqU~*WYJ-6{bsRZr z>*%p~Z;Ni7E5iXp$BGpJ!_27I;sunc*tc`|5+#-ZxywctPwmNddPTNe^;uj&M-w`8 z65~ofqb7k_^!hI3(UdVKUaDbSScbY2i1MoeuN5qNwDBTf$<(r4;T2#xm~VhRtj^G6 zniXt+Q(v&{%=dA~MJmN|-u1fvvR+yLm3QV2PR9|1TCwsui(b`1ty==4o?Dw(XmL*O z+7@ngf_Nezs@SHOyi zjFtswZ%IGBo>I~P2_eVhpv3tLlTwyN{gVl>ZQBC&9{;v8U~`#aWruk;MrD)+toL5A zitkf1{y%M9-DR_rVwJ`6j*?WST5MH{O||V*7i=dV|Lnqk>?HKPlohGiRIyqs)_;@f zCRjB{Cz0Wim{L8>st>a=C91C=+s;w@n6d^ojs6jo+*WeGl&T%GJ6Aqu(-H5o)kIp2 zFg|>_U=G!K`i^)Y32U46W<}#Qb{(B9GazvlT{q6TT{#4jszKE~7o@6~ z-p(sJkMnVEA>oJz4E(W2tuRcBUOf-r#+pHLT!lQysH2s5oi0xju;^cd7mS*7N&bui zGHJ#9`)>h+AQ=nA>Wr&e6Yiok^y>+!Rl4+tHq^E_w@%&CvH%pq>Bb-pK*H^n-@}&I zRDFuvr_n7z>$n*V>g7UIOnJk?035$VWva^qunfVli6*)OWFB>q{{Dl2#5p&?A2KQ6 z;_I*f+scIcg#C4hB?6^!LH>s+eNp`dnYJl_D61$k zo>D~z;IlFEY{>b6R^zZ}q0~W6tDz=MI=f0T4thR31@N1zt-URazURy-OHRDSo-wYw z@5R~7z@rE^#=R~hHt-=$_wt6Sx&t4~ig8D22WwVd7PW%?Nb@ecVC&mGMWBnxuWDhS z-^<5r7E^Rq{R7WM)ocBf%BZ*CA8Kga2V81EmW51=rAKgLZD=vG{~?oZPKm5HC~{qi zqzZM3jLXCR)544nv8+2^{a~oYyXv%7AeN(0T+^UF-ML(Uwj0Uh-xtLkWW_SrYu57% zanR`N>&tJjbPQC&tA3MAT)xmkFEg(d*L_my?1+K6-#77Ex7YH7SE?TS4*IJn7>HBf z=E8`DLSPu;Yt}TiFyC#TdVrElJf>MGBV07Q*DZYBbDxVZXNaLy_ZfAQS;{bUGW= zyo{JvabUTP8-y=C-|DfX#5rSa32d7%mJq(5);T6tdynzu0Vax1`+xodYotKJPU`jZ z5^@|aHX{8&L`0W0o?1$TyNPE(Ul6+;inh8k0uYm1hX063GUWdjlS`pnK>UBjBzjHwF zgH_o_%dMYZY>Y~<13qrv*)O)9GI#~)T*1r!PhL`_4PAQ>7aFQscHP$K2R#^_F1Q4) z8r$seAgVW@sw&k#SP}`i1|JXKj<%TJ?>E6 zV(IO@CJB(4x$5VpJsP3V7;6T?)ToHkx#Lf>Z~!KV*w}R~jl4`BzW!0%&D7-yj38$Lkr7XiOF9Wi;Ony?|?3*)1BEjiRuH5sCfK~_wq9Rm)w3B zA`CM@B5!9r37PG*9ld=e^`Qzg{C4G->kTb;FKP>M=_nj77&6zYHzz}Hf;_J7`DGs; zv)$&ab4P+9^!H`q?u3^9YgYr>FdO%7q&@C3O@zC#3z3Rga9txcC3ejLtZyxdvX@;E ztEsOaDbr;7{lBnQKS0p7yWX%H!m;K(^wceD&(1@JHHk)xuW}>83+NQeWaydm>d%#d zjATaHzIPRZ> z?^F|D%!zE}2vC(Er0%^R#uhQ6FoGn=c(EW6-TovGz(2bKi2tg}UHapiq&==tenCXU zLG{0?a!~D$s#N!=Pk|xWswQ;k%LB&!-&AD-ip9TGWuK#vE+;uaRo;mZ@;jYi{(uIk zN?7#O>q&&C7)s}=<+V0lj(c1W={*@%A%vEzS5LH*Sa(88uXVUYbw zbY;}F#;<&x_AAIfUk>X@xvXKlRFRXNhx^yKn_k~;RTq!;(XD=+pBIu)GWdGU&c3g4 z;KBo+mfh3uoz{F`UNn#IXsdN|x?BU6zj4B&{!Iv;##TINcLwSYI9#7x-zvccWPCQU zk1v^++xF^v$8oZ|&{e8pFjq=A4}%-GbllsnLlny}{SlO?e*Y;buR;D-K`A-^S5Vpq zJ$z;Tx1e+hK_FlKpMnw`=_USu7nGSquNpODOW>M4#TGQYzQ%BsCd#kRgPZz)7r+SL z&E9|Qzyz)#VhE7IPCV|ojCaQCTx}8xD_Xe^uCQv^Yl*CSHa4n&}maZf%C(BaTH2+)JcdFzw%{6 z&~#dw5%_vm6*O}I&l=Gxsg2vyH;aHxjUIqdXszWnhoaMX6`Q!7h6WW6UWV;)`|%d0 z)7eF#Y8&1pmPhXgF=jCWr^-9{T}G~dtz4&R1bxr!em=heraN-P90^46AQsiTV_bDt2}=2g_OMPFhWJe99C%t zeb_{oGZtF^>Rx4*`B`fr|L)63HFTbuo-HJ)O9btke5Fd?+;Ca)=QZHJsobGBJ29)i zM~(_0K^LJux06S*1s9`VkQh0D^*fGueaU*#t7>9l1qW1)P%0IQ+$7BOY3f;9Zl#autb{O88vvH_W?q}m-HZUtIli2RkHeX>VVtAH3>7CJJ4KlxYLhr{CaS?c)^>%k zBxZS?O zMF8dht8(eY4*)z(9R(ZiEk*wYJnOd1$}1Jgo!~+=J-S(TV#pi-*(EJAl#eab3u@C@w9$9|>13c4x{|k6-Uj7?+%2BTAi`=n?v?wm*SiZt*iyaF; zRY`ci9_*bBCf;qg`m*P7Zz{i(w{^u14v!nRvqv{3NGE9UcQY1n*V`TL&-IHWX0k222x8zSd=U`4Gb|K` zrf6c|$0)$nfhfRn1XaieP_AbHQ#NVD9jo%Y+aeROyR8>{`Vd^=4H@Q6@ zpN}~CIywz;o`U)+#J>Kb_o2RrG@tmASD$$GV^Cn`TrWexYh@1ou|0`=(nzCXKj~>L zhE-E7(u^+W2K0^3cpO`mDXnyM-eJ%OIa7%qioO(Fj6-j; zQY{_ay$+>*FI7OVNQ{^@qhnpY{9UJl$DTqrDY9@D#P54cwPmyt8m+So`Yiv^(S#~n z7&5fYO6g9w>k60*#Ta-(@fjw?w+^m% zq}_7v9|OAQivpDoFrX0800Y|c*MM5(53r$-{$Dnr+(*_{e+($lUjyp?*MQ>tp&67t zHH3wNzkJNjv&Z!U;Td@}6Z&qwZnHRX*g>KEFtVR{z}+DyT$=mv#wx0yYgwR!bcqj! z9`WYoP0Qbfj^UCgUgebZfoJi~N0j+JYG7#ttfvM}n>yvtB(XsPY(9$B1(M1RzdRUG zvnKm-Ys{&^NHrl_?^7Hwm?>7=jyds0euBChNY5RRJsx)mPv4s+&^Z$UUnPp%;OQWx zjvI`I`Gt<^8y^d_f17xrpshESfu>?9%v6ys(> z=f44j=cPfKQzqZK$0jX27^9!YVv-Tukg$a!a;lw)lFUi>P*zA}cVm2Q7xsqPgE0bH z4ef)_I2s*^Z6?=X#X%dUAKBB5=;rl4cao{~{Kk4#TzD6b?<%prhdl0fd29?TtR6}; zna#Ga(jo*r_GLwph!rhoFNoQYRjaEzt)M7KZ^*23$<_bo43acQcpj6c?Wsw`6bg17 zi#m(fr#;BEicX zT1(EvCMLUL8`Dt5nj0i}sABDUw{UU#9lF~G0ox(zC$lI(R~|FHLJqt+i_vJY=4ihqBtj`u!>X@Q-Dsfo4JOK z!SFmP(WK>0V=W@*ud7^Y8ASA(j!6j%{d6?|{GDs^l-0veeZ{aRqM4bXru5|p;c#>1 zc|JcWD%+IXY;S8OOIBjl>Btcz9bb7$)x=L>ZLTfA$!jl;nWc5|D9Z)iPD)Sf>miXg zG^@`AR4pSwO-Ug+$Uwe|{uQ*24v6h=yg)pOnQCwA);{tM8Ss~U(G z)#11z^kZgTRL5T7A~IwLdHQ5vF@{7=+{tl}&>L5Hr|ro|p3~v5!ctY~jfN0Q`ee3ze_x|M=7+tmK3fw_1b}x z)|*ubb57CczEd~_YjjqK?>sUb)3lFXpB~;)4)L~<)GN$fhJvb8wDJ5mp*4^AhtSse z=>{u6e(W3VvZrkj-PM4?xZOr=u?-A{|RXC61D6dt$uN^-VeeJ z#rn%(SN4{S@7F-bq^pCUTmL3`F^$#hxD23686SKMHyHAEwFW{gs042Q=4lNyQ8#G| zj}vGowy@YuW%kYvM1ORv1zNwWTSFIb%3iV`F{qylk9|7ytsCi7us`1*&IgCW!qq#s z{sJcKx5QIDx?JbW&?oFS{VmrL|JBLT5NT$62j3?fT^lJQNwfMN!Ntu1q6>(#JUNw; zuqOy0DB!;kYZa)QMZKrQBu##4LE6{OJ5|~`B4i(*&SIVSk_I}QSNUrS8G@`rw%Kl3 zVT6X_X)8A7dOFHjsV#+ZN8zq(bd3TxrzumM+82I)&q7-r$6D?DF!UO zwXy$tik22rK%~au)eRDp)qv(>sGfb_vy3ziFTtS{Ul;jqnO>=#2U*IP^8y?n1KmZ@ z1vO)bg6+}-k4@ZlXy)1kFE+a|hPY68BNRQIHrkh}vos7s-<5khw&ew^E=9yR^AoBi zsBp8$d@&LNm|L)nL{8@1>f+O4*gc(@)kegbS)H0ffIdv`&MkfX(oVeHQg3voNWFZu zw!_nA8tqlDx(7kOsSh@9;!^oNH973p{DCuDQNJqsCS0NoTdbFx%L*kp&6+>4FwSq= zv>Y)DJ*NU9(e6T6YWtz>BmzAl;k+GZmmP-Pq3_s@d=}IGBR$sS^*04j2Ev-JE?k*? zbV0TZ7un(I(&)NEgNR&KUW+gs(U6r%^8pfjGx*C` zba>Bk;={+WrW5{SXiZ}8X5~De;gH6^{J5FAU{7(H;9GsDry46&maJALZiLe%ZI(3- z5EteM7`J%Yw%STx#B;51^QOs5>h$v+7D!u$w3pO|oNtVQr(Aut<)YB5>SF#i8R(R!pDCC5l&7DC_1PK}Y(UR`(w=UjTtV(`Psz$3fKR@9MN zi0|@@9x_}n5yRQW8Q~owm~+{|DzCQIvyQ;Jtj(u}*+z1j>RR0~KMNRC*cv5WwlZ7l zBU{4*+py>5+C~)@xM8>L879kcnC9oQ(?{karLx*IxsDvHQJmDHyb(z%@;72gnuJ*o zAHrI5A;TmNhC(u<#~pxiC6^D=SBy&1Q{*j!OsT5Gv@<713W8i%<+IHXXqYxQ&x@&l z9dfPw`E-OHP$Qn!0wzTebQ?{led>6MlY>PqW}oX}5T=H6BEO0zrx`LIc#f9?Ql5~8N05PM06+C{hoFK8o0-1#n1wFfr+>*E> z*k;h%5IOvuoGV#r0@^`;rf4C3XELY35~&)*?8g9dji!cX?DP?9O&a9_YUiJKT1U`Tg(1K;6z1G!)SY4pqfVN0L zPpWbQdL1>B53q=vEN@$EubeSiUPX+rlQ=yF|NXE&2MhSF*<4mz@T`bF!BhJ&FCE3I zC%J@v(kUkol|~&BM23&G^KyG*6SB0INWSF~+U@)^0#BPooRQIDp_1%ujI%p?5(6;Z zqhZ;>NuF7}@u_hHR)E^mg{Z^25&>d(MP0Y~8y--#5YfrRCzl>J_7RRUH zUw=mJMQVU|5V2NNPG6kfs7r3OQad~O?-wK*-S$z`4@&QxIW~_a)Z&|0d7!j4reBkk zRdcT$)4S*z63+*dHS2NR$&@v75TGjDPQJh966*npteuw6>9LzA)y>5(Z*EF%R1>a4 zuHc*W1ai7-NEo_1>63Oqy~@h61clBNyIsN#g7=To>H5*L$leYeUlG63OHwGvB2l*} zDbde2xt616d}+W630!2!`ttv**z`iX`*fM8!os??M2S%$%Y=@jS%&o9p#H%_W3|H~ zO3vf#vMtbp)f(a1sX8%EYvtI&R+(MWc^57|BH{ltw}kE7q_qL}Ebw=BTBpE%@P~kw zD9oa!bE4Rr*hbrIZ=ibZUS3ah->Xm?6rJ{W2$OAku^3s5(fH-5QgLlC8FQ229Ed-| zxg|1ir7WT~O^WV-KYiU|cZEc*lXtwfZB1n#W45~9^`dUoJY7zmwngIZ{2MxbJ`;N| z*3FTAz8>Em>vGu5ShRV0BnW!7t06bpJ?jI&0)JYK>UO^zblVD8hC9Fe)r9{$eZ0Af z$sWA^Tq19~z!c&t0y=VMNzr0R-q5`H5Q}X~D;CLNO+r!m|C8G?e)oPvd>5wSeJf7o zwoA!JkH+zCe?(^XBF~|dRLxqYtGj$06VPSnRIYAG+d3fATPBUN?#$|lpf&W~`Gvq? zC9HE5L8PEHidO*=l8%E=FowbS8GJ9iE7ktb*tR(T<@e8JmzN81OB{Q<&xztLg-0|= zNTG=(`Q3B^w(c)NiQ-|>SWxF>fAt5u7Mldo3HS<31B-0hr3YLY;611i!uQZMQ~8GT zBC@a=42nNb$LFYDM`r|KGg(13cJX^xAXM*f30`=ovsJF>mQ4rHC5EkA3f9H=n6`M> z8kroAaCg*wY1@AcUz$~%3acy9z<=31c3v)?pE4dR9bTqJkqXnscoFbrdwehTok( z0NTY(jwMC$hVBqn6MB#Q*YL&U2+r2H|22GBsXuy#-VoCIvLAA%@d^1Gnit3RWI?C? z-@F1HBF2=&x$y=y0fIt#ig@26M6HcgPsvjb1d&DG{|sM(Jt+IP_aQ8!&0Qy`s(nAZ z9yI+ic5E~YSlO#|&?!FZ!g^za-a$)&AiZTjfmX1Qy+lRiC4;XK`kLk zMNNJe{Fpbz!I%fq@9L{;fPN(EbQ!xjO%X^h@mWkjn0w&-vBhjcczr%WU0{I5(WO*u z%en|xd&`;8g^0{HBz>(P4E1t4^M8OZERyjJP*K4_r;)@QX9rwlt+hRsKx~t?(&>P5 z?d*8(a~0dke*j;k5lm%#N8Mk**OG?+C`2iqFnigKuY)i2S&}{V8TdFFjq~{b1AIfu zmr}cV1?6?W zfSupoxTxY(G1Ioe{g2=4;fPw99aw911U*Zw&I+2W({=018)d+g7*tEG-z?zG?>X*G zCNNZwiet?u9wA~-K#IqY?I}WUDlcW`{GsAadve~?T6xi%DrU0{%F2G6kJz$$y*|)B z);1Lj)j?vCfd*NW+cSHGisQnRdqzD`Wg&)OavV<1;G9|R(aP(6fA-HcGpus#pKNZq zWRx66h6iP0F_oEoZM#iNnsoE^?A6!g+3P`*D)RBwMvvaizbZ9GY<=n07d@N-W1q+t z!Bjv+_De4eRF`^F3Fp3RS2VPs^SauX=7&WzEdk1(#@IEhStAF@+=NTcODc4xhtS8R zsD@M0>g2}q{s0cS5zPgU%+@TFOjUleh`{T}7}$MqA!UvinGkqdz?MYR&zn{MK~xNI z-I;4Qq!qk`UJ2h$C>H?Iz`gx=FON=Sy8qz4RcIH2E{v`J#e0vjzR{eI9{lg;IjPGb z`2Go^=cm4|v^Ho0=|aeeN%vboNRkc}z+IK>7i~37(gGqVukKq!Q6d)eJ6VJ!(2XkD zy;w~IbT=~dg`v3oz2Jf3#5jawf-B6xwbuPBqKw;8Ol2J!9d2bc3F)Vl36X9BzPcBC z@NWb>$#Ha8L&Xtq>CLToiZG2%Z&`4A1j3ag9xfg8w5~IV1H@NON-0drm_%l)Ih5?h zQQVXkJ5H0nzyVQA&XY6snVK>+;%T)PJ+O}GuRW+f6Y*J&Og8VETn%UH#%{VtlI>L9 zCdVm__OITX*4Qe0ZN8*)k;CA-gmG{;Yn=jJhfCnZ12w!gUCjbAIYvCp)st}T|u-C3#0cx zyq7kGcy+dVWI!vLV66+LM-SS41mHaoy^)SUdl&2kU#NaAFpT?ucrVKT@ZMCZ;qcFy z1e=*1el&HMZD>I)b!)cY4P_{NF8u8SFb6G$4uX4?2AlrX2~qY&0Hw4_QapLfiK;g)I18q+1)PpVWZzdL_n7=nb0b>$_*dI~LEnwvzY$L};Zgz$U z6{U4@f2ki%d#_^0C3}Tq3xbFj-VQj4;IFxe{Cl0o%7JY}sLIvN;e&yPH;Z+*n-TIu;C!hBwG_`?2XX7+O(1Us7I-6KVw^@ z%BYX0=&(6}%f`)eZP0swVPm2wwc%>>132*@h@3A{Py6Zj!}+`0OU_Q|Rcy}lOi04D zOX23H>Q=UfnQprN#64|~cXw`oP#N;SMx`{m^)edMDH`+Uwk;)*hCxi%*>mt8fZ{lg z$KrCRR(DfCqfeT3;`c8xpRM{({he)5M(;lS;?%it8MnTvBGKWE>-Ve2OvR(9#P=W< zy&J(xv7<(6K%((u^=QS<>4t2)4>g}|qzF`w(k67E%E~)X)6=i`ZspX^9vZI4+ z6J&<`lUR+i%oykio7xEfQRroPU0NYvQ-85e6Qu;vMVbT$KmtK$0eUrT-M2H@orvPjA)hbDd!CL@ z3xc?Xg_$3RiC$-_O`O8q^(A7~3iIOKLH@9EW`?bMYfb7RBd}PsRMVq!5K4-zS%}!l zH(cau_RR->>l$YZVnHkLE>X#xNU_rEMpb{U(=#@n$;oQ&U^qbHeDkm|H5Kja?;|#} z$~@pU3x65tDW3M!d%+>1G(DgaAkF=9i!-f*A!c;wPP?^5E+;aBT;~(l3T}Fm)9;dA z-pD_j(G8+ZtHAIJojni?(W@dr*L69+R;!&F#`hB~S!+Jvh@3D`RLpnJX>0YOX_TA- zzn_j7USNwI+M%_KiHC@klmw=oh%?=#$Rq+TK_-Wfxyrr@8S(lbCZvA(9lBKGYPm_2 zd%SbVR+jSJz)mpSz)k~~O1w53Z>#Uq^{*+k^{w22_7`ADB;XoM_In6XgB49~jMXvZ zd)lft%fuzxypB*5K+Lh!(FIR+x+D4lH%~Ngr(OR9j?h!K zIY&n5)bfq*f>q98Q|~0ys5+qa9qSHUbJ54HLBx6g z&HAIRN(UEIi})p@aV?{Tc&O~Rwj1BgV=m{)sxu@T?Zsqw zO`DA_;QjTeL?WuFh@53T0J4@rFqpjmaz~)woGbE@XQ+K3@%vf)#+%!Dl4gYL6<=xiQOa zJ|Cw&tc`r-!gWr|0y9J-Fo(ct-)5k|uhm%~gJYYEU|c_@x+L?=azEI&Y449U!Q1a4NfldjWc#0rr;gu7WhWWMMGJ?{nn22o1Ie&^(ZDFW{c^SZZn0Y-+&)d+$b;cQ#YV zs9ip`N;M?7tYELerk}Omebf$da;x)b+Vfx&Wi+8FviBF>+NAn_cp6K&2N*-d0KmMW z)*;7_)&2}MC&V@h%>E?K%X`iircG!4qEfLDs_Z`xPjBccx;I_l@M2g~0GmNsR1l{z z+pGiuWIG#(gboo^9;f0TsmEPiYu%U%n8L0=W=MkIA(Q5}&&yz?K8P5PR|r-P5rWL< z$oFX61Ktzk;~3LppO?Bt+V*uki(W+->XP-wwhTi{L8puuH^`!mUxEx%Gvz1HzPg7}ntf%tZ53Ij|d`D=*OE1AH#}T`Bt?Dis#VIEBlT#PA zh(MK%LYIE)-G4Mdu(l29h93+-hqHfx3TjGN-xa#DWB#1;y2zIBw4{Fn4dc4iH|WTHRc(IO7hFPRCNrI{(uqXG1%a<@IKEZ8^CJg=l_e zCI6cwl7gDHQeUPO?X9`HXerh=kMs`FvO?aj@UbW9qw7a*T=BScnJhfTZXSfioa zXd1p;^E|fiTcBp-Gq8sdF8YJo&DWgtk8%gRu}IYQ(XE{Se1o3s{j|Xik(0-_B$af!f%v%(Kp{>maLv>u;46zSK0^X$L$~d zgAZcqwQI)5D58>DPEYCyXc#U9`m#3JFWG=cy9cuN zIs$&y+HwN-ABP|Uyd+1C!!De243X>NA1d`xBJd_Nty*ps*ZB=WK#dj8b<<)?V;S{l zMs3C&A!$$SU@OTD>0Ll|9>T+5Mzz9goZfnf3pguf4^HAq9H7lscnjRUe@iOy!er_A zSs#rd)|g=CJ+7GZCLv|X!Y1=>v~EMOQ6KMtcognNr>? ze(4vt!nGd4_)rAtYmq&?t^o_sUm%xaLQvOyb=%B_>IUTtiJFHgD>l*E+gD$$-S{yh zhWA3DGYgow1>5FsM+J$TIkX=ZX#7i=ht8?Cwxwzscv7R(km8(5E=Vv?&wjWPv({3baZiR@(P~rrm*=$t~3oKw^C|M{(-T@7?ZkH`py%*P8j0(YteSdOdZ7h*VZ-Y4k{uIxQNwy0oDoxnXjq+m(%_MzoDS_pMz&vp_ zxK-!bNxqB}u=TL|npi~CM8}!BPoR{UC)eThf9hMI>)$wa)LCuC0t(}IN_h`=fHdDw zLz45^1M523JJE)kc3}3ARAeB)`U!@Ip&V#P*uJl=r>+}wyd(y56F2ww=O1hH^Aa{b z!C_@-mliimjZ^_BV&|}qQ$RwER;S6QD(a1QqeQZUp z@7M)Nlu|r}@qh6puCrDhjJQwQ(0c{3avtibIE7i; z(S#Sjfe3sPbmk+mQ+MB`m-03I#`=uZdb0|Q7VFi8>YKNZc}j>Q#Box)mp1Abr;X^% zZ1V=or=gim%cvxL^qWxzR}q9UUaQBNMAd4+f7Z$%C<=r*fx7+E)#i_MM>xYuWLyqE zkziY-4kWD6Nv>3{;;t1~3e=ggdIyLR700At(gDwd8yQ0VH8quZ!?$JC*JuBB(m-k0w5-J-(<$PbS+LWhY_M5L*vB72ioBv>3npdQI zBe{#eC-vnlTyjH;-ewhJ(Tc_4&=T}V3!=PdI`13=vMPXi#Rp-K9sslDpYatX#Fhy5 zbhzY!{Z+&;;@EA)mw1-L9PFwOO)L@I88)D%7C?7uY{lZAm;rmof@dWT9VViW%co}z zzm|y3zG*M81)RA%4b91B*UEr*Ewz8Zt#qxu7>&ADh?jg3)kc&ftFmhSy7TVh-JR|H z$TRx**^UooGD1?gh9vqB?M6o^0rcjmWmY;$#&~X6&isLgsZYB{ooiq^ZI%0k!E+?Y($sQked5FAXuW9`$W{~o3Nat zCkD@+p}|cSnWh)I;4N=qR#^Be%71XUwgmk|CDO2=3EE>tWJ=LFyFDpg90w{>J0rCI z5U${vmmtyt>2nMv2(B%V1h73AeKYicvrPU1m$8D{RLn zu$H!FMQRV7oKI$#)ulVKR(;Mgmc$lQxk`K40q?PgazEUYW+V zwP)@X9cv~#s&(OyCO+Ya=;SHh6GYZta}_L;Pkzf@ZESt}doH8e=5_RIey~mW#~TXe ztit1ryk|mk(nECy*WhZzP4HS%gK4pP6NuYPKORRj-48Z7%=y`JT?3Aqmg-QvaWn7J zUD0)?Kon6FV$_h^Lmib)li^z32=8UnaW-^afTfb}qSqkQK)+$hx8E=-*Ht(V!olAp zoG5Z3#c&iludYm8ojiuKEfG83z#t3aNxXzUpw*BBTZ(@`Jl$6hcd4R=LBIy#2ul*i zrAyQnu#4t!Dn(M?!lPE)xDHSMc2E$NPagZHg(*zkXW+rYU>)CTmhx^ek!#q7ONYHX zB5XB&K?Rb4A9yus132Wd6l{bW2wwcw?ck}VvUqxE^96tFTBT*da#t^ggrJ^Vlv{5M zOTi!@cbT4jZpwH_*+~gZr31N^O~L9Fdspjxz6@2g&YQTzs0sJ|y6aZCwj?)nCY6{Y zp^GR5^3dVev;OjqnsEs-d#}r)`Ktbn>cXxO(Y8?%qCw{bV9c+#&p2Ew>}^#Fjvd2X zmNHtO#a|J$BuA4p$_ZxkrpDX-5!>1-7a`rO?b|YyCJxn(R)Bd^C+m=EF4-Rmv`RK> z@tXSeK3{zFGdVwJ=SxTMe4C#~$5%%a_};G3u;Mhu53mb-pL#R#?|UIF z>O&Ry-mT7XRaGJzNXa1A6oJQ%XWgatd!m5RG!(wm`N8NA`?#ye>`KP!8yS=mEVKm8 z{J#ZT{%#>&5iG36@7Y#CtHq@pHP3DOnt!SAPdj-X4`1jEb9w2)s4g%2Z1}1&2 zgqfW|hY~Gp!Yk!Qy!Xa82oMjKtM0rXfVFt>U~HX+oNe8|XAyZRnyxm;=`s5S+DgZt zNQuDT2`Qm@2c!^)doP`3aT^Wg&b+%f^xvUM%5c)Rx;#*G!xg3%B4XPFoUgvF+mSK+ z&(d#>w}62cAhd70{OkHLe46GLwE5)0b@L+BT@;pae+r^?3=D4%flhu+ta-NXO0(f= z^(g_)WTKe99$U?@!{(YePGYFBS4imL=H`9o;9y*2Vh3gtH9aW;@Xw}76BNlO8jKCJ z@Mh4_!S@MmiD*V`&R{E+#2qD~rhYo%2K@oSDD4>W#O{$tBL zS0a))gk*D&mh8{}=)gBaWmo(CSsv)KzBVZV!Ei<~n+LS>m@u>1V_XLd2I6Rq zwp-rKTdG@6nX%Z#9T5tD8E?w{R!c1^1k*4X*OWL^3Jz$D8}jH563C;6`l`^I2mOSI zdo|EtRyakeDuYnCRJ6_EWl8YX2m6@%+dH3j0I3x%pk4(4`^32g0UXqj9QZUR^`Vo4 zIx3Ep`$qAt*X#qcnB>Yn4pi=~T-@LdqrIMtq`!B+SMXmT3;c;Aq91h(%4~ad!RiN8 z5Wz*=^|O)fAtAI(XI8xjMCOP~{nHzE7j9ArZa!#1b;Y6W2Xg(UBbTmZ{YSB@u9G@F zN9sjyunq7o6Hbp_!{3~RMwtx{U+YJo)q&}NM*GP&+zgcj?WC0Y*sbSxeuP80Ld7NuF-m36t{oHSPCnTHLH8{CT^ zKq_yuHFjhn6GZNSUFl+fYCGtowsD%9w>%(p9RfKV&v#uK8CqBy_37>-m-Q#~t^aJ8 z{9UuYZ*B={6RpCqb}>vouUS|2#$6}-_JO+PBRs={<_u0qL(rT>$U@3>Gu zN9*fQX9#agtX^(C(I{w7X5l!I zw>m5LJCD!;ff_|hUqVX%w>wfvZFm9dxiAv@SQ~o_Ym2nKP?QAkIPOr~?_O+j#X^qI zu`?>(N;jjcZ5d%imP(1ud#0?h>(Tpk;Cgulu?t6A)I?vaT$QoMOAAGD)!~<249PXK zveklX9b?n6XM*flITdN;ZDWzYhZ=MgGVT>@eT5$kA6R9}!Mg(l2Don{rA@SeSNXdZxge8$&cdAV*^bNao|I@?=sYCVv zk~#ehIqf|BPYrlsM=FaDTv6EbJXy5maH~CT5yI)`wi>212VlLni_nio4Q|0CFk8=ju zYf|ZY>^1csGq?yu{|;yXPHYpEZKgT48xYY?C-}I|{J25ABJBjg*s66@O*7Hp!Gf5w>zc<-+3b3{ zKBDMol^d?aAryo*Z6&k7cHKJRqsl6j(7CZ&X)h;Cb>jnX?a1>*ihmnCS&C)QJW*{|uRl zN78FwHw77O{ZC_le>xPix~yAvfEWn)<-_1d2F)t%=7XUWm{NY6D-GJrEGJPktBEC` zeC@S8W%K~WyP5T>RQADg6h4{VbeL&)|Ec||667Bsj7(re(*XwuVw8bl^+(RO;;wOt zjH6xYb=_oYJKBeC@aZQ_$b5(?euTu?CU?%WN6)*rZbAkk#B&`5v0gdQe~KGXdWb*Q z$H`k_6VC@JuLdJKk?N8U>3}gp?%sRA1|w`$79bslCfLVXYt1-xS&ufyfnLNYOIlN{ z>Wx1qg5B}!ZW%vl#rk@QP^dXBotERx@_1u!lTMy+69GddH+q-cj#qa}joCuD$k$tX zl%W3Yv5Fe8@zBg#8P`i6>ZNob4b3%w81&>0Uo&Na7iedZ&4r;%R;Ivk>;|koNmb%8<^z*g){gObC&li^i z(MGmX_@VoNe~*lr5p+>|WVY*et|OIotiyW=Y>ooMh@(Z6KnlF<_36`YmD@_Dpk^*B ztM{(2JpO{fM{`Ci3OvocHQO)sc$jdvphzV0XN;RJuczT?b!=f_3<{bL&+R!-LQqdX z#)H9-Dw$z$s(v=C&!MifWP(Ef)NzZm$Iz(n1iF;{kz-VYs||H|Vua}MU^hAN0 zWCW_e@zk$2X~Qo{{O%62QFbqr7c+4l%+cypWQXs~^=9s6Ua|~Caja)UNaRxTVpc0Y zulETQ^PgOt!sKAg;V+vvvPA@F^|@1R`J%4Rrx24`N~63ro{Axro~2UKy@ z1ZnHq_YeoZ&fhaf880x6HDGG3=d6SHrHcaC_>Y<<-CAzqYQF#n>IzsoY5Fc>1qknl z&i6L~E}$k6D3ln~EBMxfbqZEu>{2(kUkgJh#nKL#>}8+L2%Xd4FF@WM*c*(S+MBa2 zy}K@m&7upG7VyM+f^_^Cu+2uOEgRLRHrt*7q4&*^nP3UE-1{JnSq;+3@0Th*nY?=M zE6VpP@rgLa(HSX}e1OB*<1y(@qKZ~){@CCv(!Oh}Go^ooU{cS#DGXH`lz)i}=;uY# zfYnuCeFxH{4?Br-GCc){1xRu-(-SD=lzK(a%WHjgB8sDQ7HKRKO@>elMGYL%yXRYn z)sc=3wCqZA8wP9Mu*AeM_GBK`y*MS{DjXow8XhnoL3M+h+p*7eYE(=e9czO+$zSv% zU?pKjhJeN$!Cg$g_g>z;Op5|l)hmOJltHNDQ7nm}{n4C%7B4X|6ZpglFaDWUrR9~W zz^-vz%Dn^6PG|2IMW#7|;!XVfc#VJZ667VAHoO4v5B(unPPqo;Tmh=X2Z3&gVwl2T zm8Dv>O7MfJ{jxCplTocK8jR)k<=UL*YpBap;^$qtr~W;Zqu6rN zBT?$-vC(~@b=v~tNVSTIu?U4cU8C3Hn=uAdppTcQOy6c7mJkRmr-N4d>Ku*`YOAj(Qy)9$B;!X&|*( zkJ(B^w3N1~T*?4+Zr3~wfeo^p(a)&8ubJ=sfSD5@qCnnshjH@@&1*tb#}fVlE=7cw zX;|vyAW!giRPiikF_p1 z?!6-W(Jkd{qO!7kE`9FFLm$A(+xJT8QtZ6pzZ^k0 z`6Qv4h8%|LYFWzHzmkap)!=qjxC!11!mpU4AS8!x#Q>k(c} z9Sef!;y< zIuHE}7dgGQJ()JytV60VFi(*1w~}un-UVQ47a=4QJzn7m*E1Uyfg zUVJpKEgdoJt#@yu4tjMoiQJ^Q=PMl`(V=HAfD*f4ES_UxZ7Xg3YylAl+vTi&CPJ@W zDXySI4B37_QfIbZExNta%#AyO;@ANggnmBZcUdSkG`A9El6AqBw#I)NqvuZ;LhOp&=@N0fT?d#YPOdU|SR3>0>93=oRq$tuHE z&OK7%52z8&tFjm&udhyeA1bd8<%951qfoDQ!>qv>C#={LqpX=Izm9mH=pk$YCnM7M z_sorXbqir!i)>@MezburaSkBx=7jZq4c8af{cP5*=pIX>8DYsF-mK8{dj`AeSi<-5 zR8mI6TaG>0LXfVA7VeEzJ2!@2)z_1O-mWVugVx`V;%_0tGApGBG&zQ`sO0&O%c5YP>!MxE;5L|Aex`?%~d0%B<&@@fyCI^6(80kGQ5qhI4jT&hoaCO^xXhuPz>s7(u(_2 zH|vN%a~P)r$Z%n!sX$liWq?I^oNY32pNFfs-OPNj=)zD~80esq+YA)+^2vAFZTeY# zE{^Lcnau4!Fge^SB~M_`KQE__-i9V7#M6G<32#O;qOpgDwL;AG;wYRT)lBMMEm4;u z7Gr&NQj2b{W=GkfpqC72=+K2~iWVzq3I9pU@2;PxgPQEe$_Rj|8cAYLJ-hX++g$`+ z*D=)hFs$WLRmubQA1Gog2PvWIRq;L5g3~HrKrFe8jk`DByr@17|NIf{)>jj!pM2l0 zCk0fSN~_FUdK$gD!3h5+^{;ocLA1`@f8eVPjZC!6&#zm*K|A>fHls>2iJfNi42Yow zE@zZ0-mCy!ZP%A)d4F*t>F9CGXIZoxzJrdEf00OViG-SZ;ptjq`h3(DGYl$ijN4GI z{-eP|eaD^=f5)KT_t!9r;9=KQ7@8M62dP0;zLvimPVOGM%{hfLZ&=vEJ zljI0bVXSN)y!JpN^e93o5NCERNuaDvH3nxFpACL`ujZ`3;n3WFQCA9FSv z+;#DN(mxQ{+U8;gr0owLg5nW2C-8bsj7rRuAkEyQHPmF*EK}A24e)qQ^I}<#Jm-ZT z66OxB(P|&O5t96-&@^%oUa{z-A#o1LzjZYaDJ&FY-8VrlHgJy;KL@)ef16niNU3|Z zTK;0>g_~7+HoRE5`>TiW|FlyW<8_ObXtk6Ug_{N1HhWDM5~Kyu03Xqd&NU2NP{jI= zN-1tsa6qB1|B=o9avs7cKV{pjh%Z++!urJ4s37T3nZkQA3XjSSzBno4hW1v0Mmv9QC)) z1~aXU-eOH@&lZ2M#G|74_Q{8XLkN8)(BK_-A|WQ6{mBTlle5-@=2KYf1IFNEw-sav z`rHHQ5w$Av=&%jBudfhyT2FbR=RgHyGf9ROR4-}L;PVD;t`Hf@#g$Ez(xl&T)v)DO zuU)ml`oin9XCw)e31GTD}^`IIIzFjTRJ5){F6HjHCA2Om4Bez~e!4s*l zRRrmZ+7x@SCfA%411;8&gFd+8ji4g}RjnsQY`~N3?{K>JOc&W);ip6m zGkfx)cLp(TJ)Gb1diStzE~B=KwgG=HZr8@T;XXZjY#y=s1U?=1TOj>QggQ?Mvv`tBcO)=dN%8l&15j-x!ixVA z6n#9G1uIgcncD0N{uM)0GWxepfwfY-+~|h+%efU+;lb2oDC`=xfj)3e-gJ3>)#@@Y zNz+h*jh&TH#Rmj`VZv0eK51Pu>YOKKdk~dhPWIraHBiO{t3O0{ug66U$ALOP69%_t zruu9*g9Tg3##&`vo-3*K?*#GsBDFDFW!I`<6z3(4W zil*GPk%r7_UPxGCf^H26{fgF~>=0m;R4@Z?wU1(PeQR-jl@Y7GE4i1K!xj$6lek~R zPxgn(Tpzxc8H|j4C=&O#s+!VaLj-BP#UNrR?&=s7n+y$Y0^~cS+;o_q%B_ipX)$fs z=%GKX)vXaj5fdQg&w^UWY!SUsh zf(HBfZ%1j;AG<*H{UThi9Sb|Y4!gA*HseLbrI?b}pmc)EC)C}T)Fm!swv(dk5>^qjqh!`n%s znao9~oB~J*mFA+!n}tS2l__=hqj4;S{1k8a1YHZeXmeKytWHybbjf@HxO;7Qz~QUB zUsbbY{rtJp7NL;k*OM)%@&#-$W1op(-1cG@w6tBzJlq&SoIM8;U?&ZY@Te0jaU&6W znyrJ-1wY>NM&J|f2ZlPL=VPL(ep@>q@Y`83uI*r2--#o5!t?H3b8Mbi(foVa{};EN zncYiysDq(-lAkcpUoaj2g`pXaK5NT*R_HWpZ_Lwfyto!BMyaw->Be8B|8fZWN3>#I z0P&`Du0VC2Mw8w8?yd}pYeYjC%h(^(sOm7F#3eu+x;ne4_yzOMmzpYlTdz|G^}4j2*wR_^muOzN-joLZyj^&vVq(pk^+rmsdgO(fyvkF{8?6SoiYWeU)jn!u7+U5`L*ICsXd4cwUAerO%hF4_-`xaQj^CUd{suTfW4_# zt-Yyxg1RGaT-Oo{dn;t z+-~QUY_;oE&oYu?OzcVSel+HkV9ycWKpAfZjphX_dgY({Z;Vgkoq;tj6s#r9Etgw zKy$im)ZkNz-V|mz)R-zs8s+3&PDyguqeLB1D9Q^Ir`k?Qu|UPbNR?Y0G@ zYz#pu(3Hnp-e6UYkd0`i1X_om(Z4XwZGRK8kGDfm&hA4H-VXCa4nr7ty9Ra2*52U& z6HBj*K8qakAP3|z0~Xun0_meg-I7R`(N6E!KmS<;CvnE?yDB49Y3bVGFdW?7`p|lf%N4KB#CUlw7cKSkX@^W?Q$mcf5gzJWDw;yz zMas$!Z%Zu|MUng1kIhyRDbdB^tg9Mz0RXknxP5Dt!Mmo~mew}3O2>lF*VO~!9x|KV zPdM3GwJGh1TF_<0_uecJw6H5O={#oI3fcEF_<*p`QOp6KBUi@HolT$8O`q$l=FgQ5 zD^+7jOdZX)Gwnl0xG}O8-V?i{Cn8xR<5dkQi{GK!E3KebkipdVHPKbAm&vvBSg8pR zO9e%?#w8^NTqp|ECy(DKw7+?DXfo2FGl*|poREL5ixwc)@8pe!uc@e^d73jdAG3HZ zuR4Ho65sVcF7}<+$I=jM(4$HP$(`Iy1`G5&fgsA)mVUyJe+kl`Em_OVeS++8n4+mP z(-l-1I|$WXPi$}uE6)v3Y26Mp*%@`a0#jZ(kRb0D8eJ_rNXF8#-in~E*R&+H(yqyC z$vrixuzv-qDJ%Pk1B`frHT3-T`ckFf(XeedL<}J)jaaO#JVLF4KZj!99mFk z49rdjWxM?T(V%@iyWUiDik1|ZjKbrj8s!-EOY>Cq)O%C9g;iOrBau)het)yFWKpz^mjA#mbsdLGKbq{<+QR4NnXK`-UySOy=iw!A%~v36y3}umx^I49u)o zK_;T*J&A6f-BNs9vxJMuDWf+Y)m|=#O+f^Q#)Jh9_jhdr|tX z2PJiT@1t1QFPE`nNDLXr-WLQa4d719%Y;P10E_u`Qli(D~Yc&&^zE}bg;_Dg2M}{^qZvs6} za4t>^!XljZ*j*mkD}gg7rxx3Yq-M?f?&VK*Nog^Uu^*jCXt|YkYSlgSFI>vabiFsw4gMtM}SbVuSwX;!uG_44xJsF3$} zaQ=QhTu>7ndWt$c#DL@vT4eFISdT}ZTF&hrRCGavPh4ZT^iK_y=te)IqPKxVM2ezY zQJRR_aQ1Wy!pV$6Bb-l=@N0-At-Q77H|ga2cq|?XBZZ$X}n?6>aSAsC0bBx5X!4K&iF-X+Qp@DQt$xIR%`3jFIyn?{55P!>NOFJ_^I`hAkcR>q2;+1BgFiLKUO8PJrPXSYy6 zT?~dci5jhK4815i7=>el_#O0iLgmvR8~tu)JpDgRePfI$!4~G&w#_@XZQHhO+qP}n z)*aokZQGvNdGGBeo1E@+RnqBn|EN@-PnBd8W3CTD(>=mdmI62FamAx{)Ta}`P)o_C zZNJ-QRDLVPsj^LaV&A5~r};rcd(zmrE{+VyNc|n#3x<2+Fcr;)6WN}r@^o2B{X0rn z^wzux_t=+S5Uj07$n(k_aaCCtbSv;SF!Z62^VQ~d*!>X5 z>LDmStuCU>!kkwvY1mNdp-hIsNy+6*C>cjyC-c&|VI3$nvwf;8YF(h` z?)*2d&tB75tydOnf+gHPwsKRkg6satx&YA|Pyq&iQ@)Ar1$yNS3xyZI>aM)1e)P@< zcUeqid$|b8PDfeJVLs7r^Y7%>+g)BV|D3capQm8Ylc@?PwNzg;?$0&7o@#hMQrG(7 z@kCwZip}hIj_%-l8N{@Sx^`tkWXfS@2 z?aH*Z`X`E)=|cp4oXujI`6$HlscKoQCF*e0=(b)qnf16=a&0LJj~MxjoP%*Mz{WL- zq?tlJXMYxDX&qIw4df+7*Oi6XPMz#VJtphnUPmNkU$HyCTU=pf>)9GvNW4frCpSrw z+O~8m_x>et%eTbDQW&$<>tFakcWXc`l_oA)?4w;;WdB6|E|v9P0+DyG{jiRPS>PyF zlFRmlcS(hOIEAjvfe2+kh$#&wNsNcetZ_cxxL^31_ zx)5yk+D@%#?Mn>ED9)M!*=~~M)n1e3Lx6hNtR(H0yDRfgQMcq%SMXQgz; zhN5Io7GpHL8rtdWME%{ei=Jel(FNbHglZ5+eK2I7gVz}V>Q;+U$A*vV5>5bEQlVw2s2Vt z=jp$`6bGt^oKa%XTMF$Qzv;kDpYEwI9;rL*>5hJxNx)julTD79Zjp>Inh0HYrE6l5 zV~JK%INiZ~bHsxSFvYYm%_&j-L5N}Gb3UtGmAjZLIk9zb5Jf>R+N9?yNcoWymHOKU z+^)|&WQU}4PhI3e6OM!10+tkvL@|ebQDd^csC(rHciUbk>xd0sm#4|7hohk)1ZJIL z+YE7yAu_WAiUR-0vv6^`=DX6z^hbYH*_NTW;jXUvu#ly>8?813jT>|VD+^h!WZSf0 z--en@j^F1*G^UMoVgKIr3nQK_%?#VMcn%V~_g`NF-SfIcf4^q!m&s2-V7iRdR)0O{ zB-{iY194z>XFKcomzkU00uA)FRPXyEYj8$fOy1D+>HveGIA9u~=`JhCE)==fCxmt| zUy)YGD{eD+=m%`Z;*Ha5KO%=}Yg;^u+)EEJ8%2tUy}u52%8IV{^{4wx2`BdO?N z%HlC!ntxaG&>ibci1B&KBL9Wi7TH)Wj}1~5AZBAs@L2+c+rmr<94$<~IC#Q=+UXp&s5ra8V|U;i(N zb{wEtssooDVp?b_r|>`DT;M(L6~2_Y<9W9uxK2b~FZQpl_Xf9@ot?(!o7k`A?-Gxn z0f<*D|9M|s_>I^Pv!%uXi2~CcBtZfU)sHfTJb~)ZDCOi8OTp=1!wkH+gMts|v$e(e zX?x_J@%UGp=WkpZ3_~$R0SrzaMKj)Jc(FrYLR2YUl3w6mthQe_P(9KV z!%Sd$3_zErN*Z0!(Z%%O_I;|y(y;6iQDJ3$f#(fMH@N&jDa=A9Ca%Mb1Z`Wudg-f`uAHZ6)T*U=dtV_YI#zAFsgo`@~((cIoU!;`nIBt7t zaV{JOl1J$mlvH^aCqQRXU1?WVGKB`NlaAkvxWlN{3&`4chcwcREtAF$rB3g7+nFp_F*4adzm>rHd67io zO2x()?Q+GV>B)A4PyVops&>8p)ny|ZdrL=Mm^~jTpWbVWUxY4nUqi`+BEwdp4r==j zYX#g-ZVc=h0>-b)epCC9#PZL&r7oS4-0sCQ7CSFqZMbFl(ix7BA@5h_yO2wi?I;!Mu055jxT$HGD;{vxd`*g|W}**mT_ zB!X81D<+^@cMAK*v#Kej-mbsan)Ty*B0A&R>|;Yv;A}z|rH%M3yRxV)SJI)+eT7*- z^l2H+dIMize;fxz&K+sOvVh2L3(VKx)ia~>b6_7NSL0b9A1UNfKNpIjmS`yGFm>ZO zMGR<``sYXo*&Z=;A$YBd7loP#^Bxnik?%bHtIpm8Ri=e$kTiH;Y4O=qF~} zHxwPwO)$zdddko*toNJ(5e^mP08C-}-z`Q^x6u=>*^3$4jj{L4lc6=? z`gDIf=ZA|oAq%JK^us2Q$vT{MI5y{hF|l=uFb7DyHtj>=`P>;CjSf<64zdQtb8+U!NelK9Tx-WxZM8y5ImPTsPi$)oZO@C`W%))=mb_o$!h!nL& zGBA}DhMZ)d^KDG)FENK#6A&L&w;%jcr}ib@W;~4FMJzhPNFqkf?0?r=V`jxck`C^) zI@ZuIVbzX{*mksaE(Z-CdYNo@{ltKr)ESZChh`zZjTT&rFe1Orhv#`%Ko-&ut~Ki!*;Y?+1AAE($wW9NEH~$M|)3v+MA0yx#WhdY6ryR zf}W05=W_f6K4AxUVFC?lGvt7I8q^MVC&h3vxTC<2uBaZE?zK(NAn8?^*9`C^y6S&k zTt}XL5^NS<5QN%rGN>`BZDaOAx{P*={Bjkh#mgYQ%-X<}dl#Q)=>Q|kEc3^L@Z zuFsmQ%`dKjKPh9#P*AOLl|&ZAC=o%;-d z_Hyrj?A~l7p!E}6E{0L+f&8Jt#fgr6K?Nkk}VQPu7C5+xnieIirnn%?SO!OxcY#}LG2k0!jO?SX1#jES&o%f4{~36W!S5@ z2|;gMe76K(cmuM-?$E&n=7jy7XZgc)%|k!DBkdLeA;O-xjIsZqVKGv^+!;7>5FJoz zsd40^)ASVDS}J8?%|UTcY0?V1&+z|(<5%E%f!=#a0aRZ+M^Qsg2F_OuY1wag*cPsh zp9bfS9&gvr&hwSsU$Op6Eqo2Mt^Pp4l}9CHH9rIzIdH=hA{6HSnyG6C16x07TDhm1m-GOwtfoNv?6LLma@hbBiJ(HqXKgYnXaY+Xe13*pgEn2An` z%5mll6`R-;ef-bO|-&MHXbtTBA47s)) z1L%5lDH_ck`o`)6_tJD}T!BBl5_9dAoE*)@&`L7l-`pJdbcJ}@HsCc)E#t@m9gTa9 zn-Qd=%fsh!CB7Iu`X>DFy4O6{KZ$mlWxVpwerk9td=qHR95zpf0o3LV2_;dra_93s z4dovp>?yKMn$nV&Pq~woVAjy8Ofi>}aJfmBrVat)_#Adai^~Z7*!7RYzcYHrRyU*m z-I4l<>3)c*YKYe)TZ#<~V^t7x+phY=Akc^#`a7v6(li}-Io_v2>1XU7*_ zjhvf-d_X$vB(o(5)l1<|)X0K=(p^<<@ka;}g9pF+ur-Hi=Bk83S>C1cSQoyp8$`a0-`(Vb*lohsNPCOLy@utUJ@j4x zdmRPLKCP(3vZ*hlA?LLWqQWPyndoMTHwoZf%>LH47H(#c%Rm&t8G#EVfcN$}DDriw z5442r&$HX40B*wPD1rhL9Ecaz3!3{5+_e0_61w`9vjKG89AH|zyUPQgUY_4?ZxqdV zdD@f^o6?x(LZ)}@OS}bv1F1zsSh6r0qj(JB{(K|`7TF-0G(2FV$;j}5O>vXT5N&wr z1*gk#+UdDgE!Y?Xx4?4At$KUy2W5=lKA^;M*dD6mvx(FK$C+gx<$x3Q=oDkeg|mTU zgTmU%2{damtpegUD?@7t-VYt0WR;0~Wx!AjJ6-wmuc+dnW4^!hnvcG%Q(A zE#7wzI)K*bpLfafc*UR0lDsaK^7X5@TXFzm?|3N?iZV5+x0SG6qptciYeR;D2@C#K zZvi@@+qWLhXTWM?j~lm)zKLG0dcULk-V}C?)0dO&l1)KNN>^b5b+KZ)#@ao)Tw+;q z#PftFkb>TNnK=6A;02yy`v|1Fco6V-p*VT}fEh0+N_@#+6%Qi%NRPRiyQPp8U7Spb zS6qMa$Yyd&cTHXhSlT`)O6FK(^~U9wMp;nvt3KW__SQaV!<-mcyCezx#_kS4j|Bq( z!``42x#gNWXaue>A+Wc4mQrtXqnA1AAhYgB&o_WfljzFLg&{c8u7f$5hH-n*5XsZ`8u*ilMUxoA>B2X*rH?d&GrEqJOQidipiW=hm-(Uh}C50{{{ne5RvB5>94i>Gb!+Y!LU^ayylF!!R_eC`+^uf zWP;S|3q$!%j!FAyOqNDkrNrJjn*6(qhGNph(e?sDf!?mTAx{{CDrt^}^j=}(YV-Ng z0sJ#D6s{5>U4IsHwC)F+wj7A-Re*z7UiKSPe7$W+c%Uu&)ELQ*Y0-10aNAdmsIhKL zTD3iQY9P5#VO_W(YA9P?0yb8l$$2e0Cwa4&x0>9ZrwFO$v~wwY#`v4#MbKu=A*!LL z0AK>hsw0nEtI-1gEObS_WlYT`%H+rsKt|EEr8EmPDs17n752x9dhNTe@E}a~0@TX3 zMHFWo&rcA|+edumdww^GFOxW@Z2_aA?y_mB$LimoC7bOVG(?kYZpSlyz2k z+f`|0{43B*{?eRRzk=KWVBui%?5TWx4V1TydKH|(+q0VC->Ss$-okczMb4X>ZIvF`;!^PCaQe329B@dVLpoN*ts|#CZnl zx^t!R-04>6I?|Q7eV0rwYBh5!G?84dv?}G@8NWtgO2D~#reXL@tfY{2*Znn<>|$Er z!&#`D;K=ap(d~WJa|BJ>0D1l?SpX=wl%gEQWB`=?tpwH3fLRz5VG`>0wkH=O9vC0m zd7+QzGJEofdB`=0)gxI(C=)HxC&nG%^mi7dnA=Mtxwp3Y)#tk1Oj%S~C z-v#Qs4r&3fwEdjy<%Y6Zu>!j<*)OZ`R_&b{41_D*kQauLuawAYyqd@eOf{itH zrdk%?ersG#venX6M;0TZZ(zX!25otsn321}Vheb}sa2nJz-3SXRw)5-^+)NAGfn0Tu0TjG|CSB2IAhE>cCi1pKou+cQb+l9iRBNC-1DA>7+x`6O^yn8 z8uYhe9asZPP{A=L(2U2HQClh|N7#1m& zNe_<4eyDk;!v)fx9TYI8lsEQ1dr&LA zjiglU)_PYfcvLH#@y4#$gU4D!tbNx9AUam2xr%6eiaU;~K=5>UQJU;zhuy zO9)o;r3FuYLN};i%~OAEV(ay)c;?NDhg4QJQvwq4xx;e8S*s0-N8;pEQe&bTwyx|L zM}@{;s@!8d;CA=?U|Vu%m=5N$L{!QMu6%g;IYH@V+%nz70)4VB*ZcDDpzhw2KO$_3 z&}%3h6>B>=HToUztq)TqZYo(*@RQqkRRs++Ep?s;wyUTSw(!u_z5#ba);=GC*r zh&mwa;41Lq69ydP*d&ncPR+X?tw_|1zB`*(#ZDpHv=>F2iuEVB9q znLJ~`uYPf&PT7q-Qb@3;?nl$-0hBY z>aV}dp3z2TFp#-U9c!O)rewW3{_IlF9*1;<1f6KHh8(Nxsrh$11lOo8jw?fuNpcBT zMe4BTo6wjZWWU-m78KF96~JYyG?)5zFlnSJ=d6=JK|KLDyfun`R9MV8HYa)blm``O z{GOuYAc|*|16cVW0I47jTYtD&xQn(!@S@9_pfiH! z$o}MgvppR7H;pQKO!r+D{42)D)jxl);t#mZ;GVGXEIv4~tk{{x6LYW9r~}W`$ICEw zrj$r8g|Vv?Z93wEz~xn|D4e+$POGVvA@L~y~ZUf_Cb?)*1_m3U($IX1z z`BOiveHVDn>OAIBXCib{=~k-!+QH5PMEbi#UdG0v#!A;r_0L@f;q@`4N1~1QQcVY`pu*{xZWW7XON=7uDAVF zw4w7VV*-`Kh?8qly@kC=@4d~yi}F9bf2%9U%WcsbvLq3MuBtIikLgN#zgXgC)nS}? zy#&ZnNZE!}{ysS0cG-0Vo5w)NsiyWzAg!4t6~p+5I%|C z;NRqoy8t~Qhiin{t)TCDN|BG}(DG=s%X61zvEkkox5&*^{MMdMVjK%>FB!ihHhM%x zcxXnx=a#UOU7ss1Hp13i-egC%vdpao=B?@8i&ThqfroBW$q@iqfj^a7dnYSuhf*Y7 z?RcLpi{^qlV~O{>#Zv}xdw7VWAXWOLGT-Y9B&p>Jjq9OtGPn&QHF~GOb~L?(tv@%` zG`(4oJC?6D*+WM?yElc|OtxHsihE655x-5?@{sF8lCZkjC73EI9~O>GXyW^pY^S~A zaukOV2d0Ujs&4$J53#Rrp7R$;)U-g^s9Wlq?}F#LBy`Z6Uo8pyWC!C9?D5Lf)JlBB zEQHmG5zN+h10FVX$j#m%wyx;-)FsyqGOZ&MYH4Q+b;Ak~1n0Q{1wE+G#MlPtjBVY9 zalq}Vy3ICfj+&R`=B-;;XUf%MtrBi_&P$HyL2VHBrwYB8KbVT7X}3&dz?eYQ@nQZk zPAqnQd>I4KRZy?0nHBZHt3IW|(%gQusll6P{rJIl>_C!slH^?_@bW=Azmb+I`~w9J zUi6mwG>X&y^8N(AIRN(u0V7j&0?K2XZUXej#caBD_5l$Fr*%%2NBmM-%CQv$Byw};MI1fA&Q_FM>fgF*z#&okf~vFNfPI6G7% zQbdnp@PK=OWJnJrS_4+Wv}(b45abqlQh32w_tW@tlk>2u-2X@Wr(S407Ht5eFQ&i; z3O=xy>Teg^giS5VgF?o3Q5N)$sViaMhZ>*3u?}qH-VKyKFcoGViS}1N=mlXz1UFCUHmD+@Wd`MZ(#i zu2t7AGLKX4;UyUE1%N(%&?S-xGq?Inr2n$b+D4Ob0S?rX^NJ$rfVS1*)YP&}aP|&( zRON0(0jPeWuohx&5ij()YUwRNg#0>m6Gao->+&tK$s)C=z`ZR#f|et z_4h#C%JHF@SE&;D3#e8S>YB7wKYI0Hl|6?D)iLtm=93Z^r?T6+iZ`MoxW0c*x52hOi5uw~5$J z0UB3)NSaKoOiR?AH)xkwur)ejoY`FG)pI~Ts2A+AR5c)0Qu7hw`?R@0gz&~;S|^0A z6tQs+73dA{9HGuiW1~Bq7W3zD2O*pEMh%phpp>9Ud%&Mdu3BN3 z>qXO6zJTFx!$QGEtdr7GpF6uN|V@A^(cM!|_ ziOlvW=0=q#!kR)Z70jN?4Sj;t?}qE%t+v=}+g&w8B-0`r<2h=?p>Y9d@ABulN*iOF z++7=FeQb>^^7KR3jj?s^Ju=078)5f$w0B->;=CvITWb%O2CZX~dHZ!i>sEqZx!(N9 zqr+cNKUQ`oDeHnxH#c(&8g8R1%AV9f2I^SGt-cNp+>lw{rV*`G@TmWihoCkI*?I+0 z!JkEQ;R%5V)s{5Q0oQj)BjIxRN+)9n&vf6xBI%0y#j7JE))1%AAJmU+*sj;d_@Gth z^Z03tvy{d!-^D;-V8$$SiLQOuvcW>x=d#h){J9hsyqL9 zzgc*dEA>}N>O07;-Zx{SfhrB$_y9ctooe^U*Rf6vL!!^SX@1~d@rDlbGUM18P>7p` zwU&&gddrcA2KSQ0s+p=xEKWEcQ)u}3byNLz+yAeFNXfL;=wlv&2rblZjgbl?gRQw# zkg0SGGV33?DM|D0kA4g17XLD3Iy7ap3cZGj7;&=HBZE*XtW zm5G$s1fxb{ssVO65jKs@;AG;_F%(s*t4sT{RK4$9TbK(z+>R}8j8UP62C6e`;SsP{ zRq@R>eG%&1iRhgc>Bp@KwqN* zr`ySjaudg3!MBbqZiPz5YkjSquhfbDYN2Mm?q8dZ<4toUU0?mKRmv@El5YTm6on@9 zteq=|*V3Pr3l18y>l-4EY!=DM`QDEmSgX|)>3>iAfk&{(05xVCwPkL%du%ZX+W&s2 z%T`vE^oeCRQ%781`{g?ot4^B7G6QXMN6{QnkvY&GtTOo0h)&{dnsR4@&O)?M8^V_2 zhA#D&0JblyDZi=9&gC}E&nN3*{?yA+7FzM#hGj$fl$U_-i}noU!0!xxgZ8%matOF#MkSUHJ?1E;&RcHQRGM9dwIt>--%VZG zhiL7L7#&8fC?}@ONeOGywP^7cm%Ly;BBNyAIne?%T%c0Xz7Ue=0gP!@m|h9H=*LLb z(f&aZG)}3y&w8#|5++M8WLtJda844K zih$Y067n@08qM6b^lkdje-JFNN_;*IVPLbI)6|?)jf5G|8Tz5#I{cE2z_>M2+TQYx z9>KmF%WTFdAD1Trpqx0tKV9N>O&c6!ViqG6Qyal)x3|YOu(23%V9m64SS96Y2JlC^ zGwV&4G#Mk#{zUmB^V#eh|nbSW-{UU#Po zte|FzvP>?PjWn4mSt$*I8u~&e2R=Q}b-^>-s>KCTwnxL4aYJB<8_foEwSDP{i9m6J z+FXW24?$^AuoLWtYvNzd4m`!Np5L0QcQ1UoE%dzAZwb@jXrCddFE}2Jy(U+-NM%8% zDohVrzT8=-ovy-FeZw2CFy~roW}9j+uH`Z-7BoNqHf)4{KIrwmpYV+aM`TC;Jk{xa zjUGJMJ#98-=W_HVa!#J(eD7c+pKqGN$)q+@&-dLOjwg}#eLO0?-XxLBf&F|vChhRP zefe>JJ+}3Iy)Nv0U%Tb`-s8*Vet#$Je0}qcCHcrYFDy{VT>Q8fX?#JBOr6J6%$w-qyIkvFxBDyd zC#j{6hegSmx#bg@2HH`v(R2El|DBwueJo@4aN*i4njpjv&3OW95=>Ji$yXO21Me{J z=TUFKy`!2uesZ30OhlELgIMgCBI_zOA?0qi$Nj1yQV#z4YcNi?h6Vz zcD0F>itGoK&@~Gn#$iVMP_XH}gE~|3mF`nV0+2zTae&JfD370N_}`$e|5#O4OP^Lp z;)gL+s!PPL5LRN8T9@#%@=FI`FJPrd?6HK-QS(WsreF~s_K|YV4KX>p;`ujfAjf%; zoaCw1ZWL6yLCSU{sAXcJ#kZU$Zy?1krv8SH@6GSW@42_9!$!-?{%5(YpVN(1Vl>&9 z%fYjU%}sR0b>lNL?Dza7)3(4*LQ+r)q3fS~QM|QQ*Pv&|Hx8#uA^_xlYQlwTmZ?c% zZ-2|lezMCAa$cu*qeFzTdByWnVn-j*NONcNL`EWZYA)of-IHLaj}cqocVI5+r`tnF z`OTS`fUm_;7#G<~FEK>2Pt7E?%gs7!W(g;oe|A1|V0 zH4j{l@$INWM7VNHR^_Oc16VLmOZu2hXSyk184f<}L~W&GFilR>4T2W7f`DQ7hF$Nd6^-UW)!nt z9YxYbCNqeQ{7+h7;wYQ7q*J9Ce_Nf3Uc~MYK&&xNIKH94{PdU&2oNG(72)P0Q$Tzr z**BU?Nf3;lErX)Po0ay`IwpkK>;>$2Wy2S!Xu63Jf>e}nFVACD6V_L*uQLdgO`DOs zSwxIju~C3La#RUY{07-gYcNW+1V*?-|MO7{9*Ecwq5hyQR6R(nLpWcH1ddZwk^g3( zS$o_&(h_FwG(u9@mUnC+0pIkI!iu?!A2SZ4gf6?>!mjJ;_O6z+2-T216G2cVncN@R z;JYWBBw^33GYcD#N(6)en+CoGK!#xv>-fkAxq$N^1t7siZh3wZ0x{17i@cXWwY*!B zt`X^NB5yZ_32Cx*5y(aK13**WVn8SWV*oK|jD1tHt!05EX~ty2ifRuB!hzqG8gxA8 za|%WhCM0k{n98U!gE_hsNl}YAdPQZGpFlJPSpcK3HZ7_EqTqOh~?Sxh!3WiyVdSNofa&r^<9f+>q` zK%bb=oEUFr0$0MqH6(5^b6encNDWY0Ld`YH;LYuw8Ozv@g(@+r9)Ucwtl!4ucFnW` zW-xvRz9?=E7^W1$zKUkhn%PSV*2WTWHjqs4g8^TYQ3!CF@^VI3G5 zfAjmhz-ipwzO_3(thn$uoV)B{&KDLPB=KH`b>9p(IE`zD4a%kVCYV zHb+9FPXkk?2cipZpOh1`&zAd8BOs`-zqF7F48BwYecWyw2IZ;MQ{*~xA@5mN*pa9^ zG9&M~E?!}r`0v#3)p=8ruG{>Dtml?QUCGI0vaS|N<*&`$nZbp10MTBBlMJss_Xr}) z1@5x|bQoic$xed*!z3%b`mX)cbY*$n!6qxw7=?g%=`^y~323}T7DP^20Z+PE6Eol! z2wibZM*D}}c#M2OBT{sS{X-S}n+cg+0xHP!pvhkp1EeDn;=N^Rle5x4Gz9JDRMHrY zLCPcCYsji&ULX2)&HN~`3GX_59%gMd1!}&Psa-<&0;mFrS_Jlt*})k>-b;)etzr z=0<=jt__<1>`D=RqWp;}>t|c(nX$9y|-)09W3 zY=sut;I!z-BdSGNLH#joge{4~hM+3shBsyoq2{lCZRvaokUM5DU{`49yX+pMogMpc zi5Ku!IlLDF#pLglDCLq|ftH=`A8ZED6ke@i8a(q*nq>iRSgO(0uk8K0`kmWXi{zexv-!u?eelL8cj!XMhcS~(~px2BkaE@hQ< zj>2k)LVaUbKaxAv)KqhyG*|~MLNT&=%8yyiU-k7Ee7NegydE-w6i4-)l$a=ewUQW+ zkG0Q-i;s_+b(aSRAFGRZv(IO9ur}fcKR)!g~TIiY&@l`&gb_O zMH;BgU}XiJPNAv3mn|0c%x@Y$bxT=r7e^0^-1|&vXxfi|XJYJaj;d9Th4(K!rR0$J zi?lRdK6^9AKj=E1CY?UwGFp<$7`bPcA##&~#K#MG*TN=X*GR^3`T53ecZQu`&MTff>VQ2jI z25ovP!{7s=(M}Oo)19lYfMK7v(0KQDW@}GU0=HkEm|KlvjhmBhXT^ox-Px(wJg=Gu zdH+=p3HNpjT8X9!hV9kGEF9lV`uuufjizl9Go4n-G$T!BqSv7$ao+}It67_pE0@Ss zvXx_yrD4&P>$q*&XNa4G50mb6!jkWdEU{Gu*l*iC39Xhmdz{u>-q>7VU|DfMMG9W< ztORS&Sg_p6nJ9f1R52qmiHlzB8%8vJZIaDS0QOX7D!XMB1M6Sd#@OFoE$}0m23dyp z634wIoovW~PE&`}eUg4=LLw4C4Fb-Koe5>KW*jrDxGOAuaNHTdq|yIbnH< z=cSJ4T`TNhcev-5?j93 zkP;S57vU~!;%e90wKV}X#?aSCMF$jfW3Y=M5amrc@>FH_C8YuaxxHd;`;Pe%aVpds z#l!n10Xe9MPhFNRf{C2RMI}m-lWkSlmv*tK97ej# z)PGsbkxTA9MO>wU5@4=nBb#}+DDUa$M1bP+A!^%KGASaqr(5!3xNaR0V-95{w2N*4PH%ilmJL$h0Ch7Q3aSF97Sk*IsB2WT0~xE;3#+Q|ZixzdDv zd-GKDm!e9S69P=Rp~~$+oXm;cWTN^)&33Ah9S=-3#!aTD>$uRpzYO)3vuHJ|8`Y;D zAfRBOqD$4Gp~V?+!omS@DsCO92NIf*s6)9KHgWIEEMVWJ1jO-PEZ2`KGu|D72A2QY zRJ#7&Vpi7wI!Q&peuih649#^VU_s%!9+dN}U&bRpBkLvaiP!iHQ0Ghf`RWWlO-&qk zp}O`cYSpg#Jx#GmkQy<_TfoZM_^+qYFG=?TH z)VNqkU84E#%Y&9{qi6kUQR6e77%x-diFq-qfI9}vSO6&nz&Y?kBZ!x$klX<=HSJ^z zIY-pY;{TM-boTGPLahV6&_K!-(`Zo*lQ_iRlj@hC)FHO1zK42RQLqsr4s=8glPEMC z4)cT%A!eEGZ(0_Z(oRpL{j&%BoAxd~Cgl*;qM5G3LNB>uh?$GFp5__3Qta|8 z;HGJ&p)%L(UnMP|t1_`b(&RE%--HUqnvx7sEiq`mXrauSEnak)uMw~);c>8%-PBC- zjFAXxEe5?fT}-qV7Mj=KYJAjbQzBMGXPJV5Zkm8SN`b5tz-hh7p4a(JmE71e!oF#9 zBR-3?n?qS%$J-MGL#A=$F{U0m9gqL#pKRx!xq#E2CW=>4#@WfTU?_}uF2BI3tmmsf zp!ms$x@!|Hl)ZVUhvMmku?J~5o;dfDx&H$j20oN_^y)X17S{FZx8cs~2ZkaV;_qfS ztx`^Ndy>a9^Wd4s7eoR#z=TRv_k;5psm@YpaW?FuE2eVL-u`XQ(#x)8CLpc zgN{GoL@R$Bkh$z&JMuu6Nvd4(Lw|JRO|a0h?GGk1HO>hWF5lkN%ZLJaKe$ zbk^&Ob^24aS5+YK1Fs7k=lbYJB}e(qge%l{69uzw!brfL)qpL%}X1BwNW1U_{M`QBE=B<<-MY?(a#?Qs;!xG(RJdDr6dPs-BVyB@;#N z9J(K;C0oAH5{yP6DS4ag`_yb=l42(M8QwzZuPFvfMkwkWn*oEC8v`w({rHTGx{D#L zKejlV^~cvpm&a$a_b&s)9S*tRBPE~?Sh^s*B(Z-iz}uJ_!9-d~Z)*)Ff+PYo0C0|a z{?Jb%p*A$T>4U~0w2v?{H=?G%Ur4|=G!bu24kwDnO)cnq{0S`H15(f^^)nclMb85B zNDaX#=F;^^P#6b-d;6`zyXbgqABThxIK9Rjm2SgLDB@pDw0da_ah+-}D5?OCBrG@u z-1wIEl|_all+1j5L9JB6Or_+ou8k;yFA^zzv_!ttgj6IMC!?wlm4LEAdzK}%V@Qz& zAH0YjSq`BDu*A}#)rS@pVGFCqLL&Qq_T4$QWHlf#aiGWDiGCn4#=e}RWHjA{B@6tt zuBVZmmY;UdTjt$0`z&iHxNI4Uj6q;+#01@>M!NJ@3mL7rBXoBZIYqxjgq{QNbo~R; zz5~&?$$4<8d7YHVcCmup159Gnn}>2D+bv3g-n{YQUi#>KRPJdy`=Dif~w}xjV6y zZNS`>PhCgq6MJP>%X-9!j)x5=)}L)rA4JGH*SI_83%|eWtFm?ZV3zYg_&7MJPd{RG zajx%qHr!eBKc7;ynK@YEl>y@6$vv^98!W)<3vVrvWu954>XlP?+@O0Cx3cws3}5J+ z+qIXn!K2^or+&4H>N;OL{6Fw

%r5k3XZMbgpmsZTIPrct)wn4^7sPm$argFNUdw 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 I{s5Q^01HG_U;qFB literal 0 HcmV?d00001 diff --git a/keda/Chart.yaml b/keda/Chart.yaml index 00c4e2ed..c970392a 100644 --- a/keda/Chart.yaml +++ b/keda/Chart.yaml @@ -8,11 +8,11 @@ kubeVersion: ">=v1.23.0-0" # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 2.12.1 +version: 2.13.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: 2.12.1 +appVersion: 2.13.0 home: https://github.com/kedacore/keda icon: https://raw.githubusercontent.com/kedacore/keda/main/images/keda-logo-500x500-white.png diff --git a/keda/README.md b/keda/README.md index 13ba4075..15c31fc6 100644 --- a/keda/README.md +++ b/keda/README.md @@ -21,7 +21,7 @@ helm repo add kedacore https://kedacore.github.io/charts helm repo update kubectl create namespace keda -helm install keda kedacore/keda --namespace keda --version 2.12.1 +helm install keda kedacore/keda --namespace keda --version 2.13.0 ``` ## Introduction @@ -36,7 +36,7 @@ To install the chart with the release name `keda`: ```console $ kubectl create namespace keda -$ helm install keda kedacore/keda --namespace keda --version 2.12.1 +$ helm install keda kedacore/keda --namespace keda --version 2.13.0 ``` ## Uninstalling the Chart diff --git a/keda/templates/NOTES.txt b/keda/templates/NOTES.txt index 0e4c8e0a..f143cb2f 100644 --- a/keda/templates/NOTES.txt +++ b/keda/templates/NOTES.txt @@ -53,9 +53,9 @@ WARNING - prometheus.webhooks.serviceMonitor.relabellings is deprecated, please ------------------------------------------------------------------------------------- {{- end }} -{{- if lt .Capabilities.KubeVersion.Minor "26" }} +{{- if lt .Capabilities.KubeVersion.Minor "27" }} ------------------------------------------------------------------------------------- -WARNING - Running on unsupported Kubernetes version "1.{{.Capabilities.KubeVersion.Minor}}". KEDA 2.12 is supported and tested on Kubernetes "1.26" or higher. See https://keda.sh/docs/2.12/operate/cluster/ for details. +WARNING - Running on unsupported Kubernetes version "1.{{.Capabilities.KubeVersion.Minor}}". KEDA 2.13 is supported and tested on Kubernetes "1.27" or higher. See https://keda.sh/docs/2.13/operate/cluster/ for details. ------------------------------------------------------------------------------------- {{- end }} diff --git a/keda/templates/crds/crd-clustertriggerauthentications.yaml b/keda/templates/crds/crd-clustertriggerauthentications.yaml index 4f11d292..a12f398f 100644 --- a/keda/templates/crds/crd-clustertriggerauthentications.yaml +++ b/keda/templates/crds/crd-clustertriggerauthentications.yaml @@ -65,6 +65,127 @@ spec: spec: description: TriggerAuthenticationSpec defines the various ways to authenticate properties: + awsSecretManager: + description: AwsSecretManager is used to authenticate using AwsSecretManager + properties: + credentials: + properties: + accessKey: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + accessSecretKey: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + accessToken: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + required: + - accessKey + - accessSecretKey + type: object + podIdentity: + description: AuthPodIdentity allows users to select the platform + native identity mechanism + properties: + identityId: + type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string + provider: + description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner + type: string + required: + - provider + type: object + region: + type: string + secrets: + items: + properties: + name: + type: string + parameter: + type: string + versionId: + type: string + versionStage: + type: string + required: + - name + - parameter + type: object + type: array + required: + - secrets + type: object azureKeyVault: description: AzureKeyVault is used to authenticate using Azure Key Vault @@ -117,8 +238,27 @@ spec: properties: identityId: type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string provider: description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner type: string required: - provider @@ -143,6 +283,23 @@ spec: - secrets - vaultUri type: object + configMapTargetRef: + items: + description: AuthConfigMapTargetRef is used to authenticate using + a reference to a config map + properties: + key: + type: string + name: + type: string + parameter: + type: string + required: + - key + - name + - parameter + type: object + type: array env: items: description: AuthEnvironment is used to authenticate using environment @@ -159,6 +316,81 @@ spec: - parameter type: object type: array + gcpSecretManager: + properties: + credentials: + properties: + clientSecret: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + required: + - clientSecret + type: object + podIdentity: + description: AuthPodIdentity allows users to select the platform + native identity mechanism + properties: + identityId: + type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string + provider: + description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner + type: string + required: + - provider + type: object + secrets: + items: + properties: + id: + type: string + parameter: + type: string + version: + type: string + required: + - id + - parameter + type: object + type: array + required: + - secrets + type: object hashiCorpVault: description: HashiCorpVault is used to authenticate using Hashicorp Vault @@ -232,8 +464,27 @@ spec: properties: identityId: type: string + identityOwner: + description: IdentityOwner configures which identity has to be + used during auto discovery, keda or the scaled workload. Mutually + exclusive with roleArn + enum: + - keda + - workload + type: string provider: description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner type: string required: - provider diff --git a/keda/templates/crds/crd-triggerauthentications.yaml b/keda/templates/crds/crd-triggerauthentications.yaml index 0df3f515..e52e6be2 100644 --- a/keda/templates/crds/crd-triggerauthentications.yaml +++ b/keda/templates/crds/crd-triggerauthentications.yaml @@ -64,6 +64,127 @@ spec: spec: description: TriggerAuthenticationSpec defines the various ways to authenticate properties: + awsSecretManager: + description: AwsSecretManager is used to authenticate using AwsSecretManager + properties: + credentials: + properties: + accessKey: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + accessSecretKey: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + accessToken: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + required: + - accessKey + - accessSecretKey + type: object + podIdentity: + description: AuthPodIdentity allows users to select the platform + native identity mechanism + properties: + identityId: + type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string + provider: + description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner + type: string + required: + - provider + type: object + region: + type: string + secrets: + items: + properties: + name: + type: string + parameter: + type: string + versionId: + type: string + versionStage: + type: string + required: + - name + - parameter + type: object + type: array + required: + - secrets + type: object azureKeyVault: description: AzureKeyVault is used to authenticate using Azure Key Vault @@ -116,8 +237,27 @@ spec: properties: identityId: type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string provider: description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner type: string required: - provider @@ -142,6 +282,23 @@ spec: - secrets - vaultUri type: object + configMapTargetRef: + items: + description: AuthConfigMapTargetRef is used to authenticate using + a reference to a config map + properties: + key: + type: string + name: + type: string + parameter: + type: string + required: + - key + - name + - parameter + type: object + type: array env: items: description: AuthEnvironment is used to authenticate using environment @@ -158,6 +315,81 @@ spec: - parameter type: object type: array + gcpSecretManager: + properties: + credentials: + properties: + clientSecret: + properties: + valueFrom: + properties: + secretKeyRef: + properties: + key: + type: string + name: + type: string + required: + - key + - name + type: object + required: + - secretKeyRef + type: object + required: + - valueFrom + type: object + required: + - clientSecret + type: object + podIdentity: + description: AuthPodIdentity allows users to select the platform + native identity mechanism + properties: + identityId: + type: string + identityOwner: + description: IdentityOwner configures which identity has to + be used during auto discovery, keda or the scaled workload. + Mutually exclusive with roleArn + enum: + - keda + - workload + type: string + provider: + description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner + type: string + required: + - provider + type: object + secrets: + items: + properties: + id: + type: string + parameter: + type: string + version: + type: string + required: + - id + - parameter + type: object + type: array + required: + - secrets + type: object hashiCorpVault: description: HashiCorpVault is used to authenticate using Hashicorp Vault @@ -231,8 +463,27 @@ spec: properties: identityId: type: string + identityOwner: + description: IdentityOwner configures which identity has to be + used during auto discovery, keda or the scaled workload. Mutually + exclusive with roleArn + enum: + - keda + - workload + type: string provider: description: PodIdentityProvider contains the list of providers + enum: + - azure + - azure-workload + - gcp + - aws + - aws-eks + - aws-kiam + type: string + roleArn: + description: RoleArn sets the AWS RoleArn to be used. Mutually + exclusive with IdentityOwner type: string required: - provider From dcd381e1048a5df3b6659f94d35d2ecf9b35567a Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Fri, 19 Jan 2024 13:55:41 +0100 Subject: [PATCH 38/41] fix: Ship v2.13.1 with missing RoleBinding (#595) Signed-off-by: Jorge Turrado Signed-off-by: Dmytro Kovalenko --- README.md | 2 +- docs/index.yaml | 165 ++++++++++++++---------- docs/keda-2.13.1.tgz | Bin 0 -> 96136 bytes keda/Chart.yaml | 2 +- keda/templates/manager/rolebinding.yaml | 2 - 5 files changed, 96 insertions(+), 75 deletions(-) create mode 100644 docs/keda-2.13.1.tgz diff --git a/README.md b/README.md index 057a14ad..651bb0f6 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ $ helm repo add kedacore https://kedacore.github.io/charts $ helm search repo kedacore NAME CHART VERSION APP VERSION DESCRIPTION kedacore/external-scaler-azure-cosmos-db 0.1.0 0.1.0 Event-based autoscaler for Azure Cosmos DB chan... -kedacore/keda 2.13.0 2.13.0 Event-based autoscaler for workloads on Kubernetes +kedacore/keda 2.13.1 2.13.0 Event-based autoscaler for workloads on Kubernetes kedacore/keda-add-ons-http 0.6.0 0.6.0 Event-based autoscaler for HTTP workloads on Ku... ``` diff --git a/docs/index.yaml b/docs/index.yaml index fbd77298..2c98071d 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2024-01-19T12:32:08.715266053+01:00" + created: "2024-01-19T13:04:59.074924+01:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -24,7 +24,30 @@ entries: keda: - apiVersion: v2 appVersion: 2.13.0 - created: "2024-01-19T12:32:08.905813008+01:00" + created: "2024-01-19T13:04:59.138783+01:00" + description: Event-based autoscaler for workloads on Kubernetes + digest: 00ae78109f89f16b12bb5cf23f7071c6c2fe09294514d4f7fd3850c6ce2b8a57 + home: https://github.com/kedacore/keda + icon: https://raw.githubusercontent.com/kedacore/keda/main/images/keda-logo-500x500-white.png + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zbynek@kedify.io + name: Zbynek Roubalik + name: keda + sources: + - https://github.com/kedacore/keda + urls: + - https://kedacore.github.io/charts/keda-2.13.1.tgz + version: 2.13.1 + - apiVersion: v2 + appVersion: 2.13.0 + created: "2024-01-19T13:04:59.136368+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 0dcc74315d6ca02fbadcfc5e358040580c0ad7919921e07ebf2dcc0b1d2d5f03 home: https://github.com/kedacore/keda @@ -47,7 +70,7 @@ entries: version: 2.13.0 - apiVersion: v2 appVersion: 2.12.1 - created: "2024-01-19T12:32:08.896240745+01:00" + created: "2024-01-19T13:04:59.13369+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ee87da063be94f3f65661656602775c38ab723374c9892ecc73c1cea269e64c0 home: https://github.com/kedacore/keda @@ -70,7 +93,7 @@ entries: version: 2.12.1 - apiVersion: v2 appVersion: 2.12.0 - created: "2024-01-19T12:32:08.885127348+01:00" + created: "2024-01-19T13:04:59.130976+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -93,7 +116,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2024-01-19T12:32:08.876048658+01:00" + created: "2024-01-19T13:04:59.127953+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -116,7 +139,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2024-01-19T12:32:08.866163643+01:00" + created: "2024-01-19T13:04:59.125328+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -139,7 +162,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2024-01-19T12:32:08.856347981+01:00" + created: "2024-01-19T13:04:59.122683+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -162,7 +185,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2024-01-19T12:32:08.846361554+01:00" + created: "2024-01-19T13:04:59.120396+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -185,7 +208,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2024-01-19T12:32:08.836129564+01:00" + created: "2024-01-19T13:04:59.11799+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -208,7 +231,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2024-01-19T12:32:08.825757959+01:00" + created: "2024-01-19T13:04:59.11583+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -231,7 +254,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2024-01-19T12:32:09.062863885+01:00" + created: "2024-01-19T13:04:59.179204+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -254,7 +277,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2024-01-19T12:32:09.055747405+01:00" + created: "2024-01-19T13:04:59.177179+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -277,7 +300,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2024-01-19T12:32:09.04764804+01:00" + created: "2024-01-19T13:04:59.175345+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -300,7 +323,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2024-01-19T12:32:09.040753938+01:00" + created: "2024-01-19T13:04:59.173322+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -323,7 +346,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2024-01-19T12:32:09.032740339+01:00" + created: "2024-01-19T13:04:59.171499+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -346,7 +369,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2024-01-19T12:32:09.025958682+01:00" + created: "2024-01-19T13:04:59.169223+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -369,7 +392,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2024-01-19T12:32:09.018533711+01:00" + created: "2024-01-19T13:04:59.167272+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -392,7 +415,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2024-01-19T12:32:09.010390066+01:00" + created: "2024-01-19T13:04:59.165475+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -415,7 +438,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2024-01-19T12:32:09.002692571+01:00" + created: "2024-01-19T13:04:59.163744+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -438,7 +461,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2024-01-19T12:32:08.99312408+01:00" + created: "2024-01-19T13:04:59.161783+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -461,7 +484,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2024-01-19T12:32:08.987337601+01:00" + created: "2024-01-19T13:04:59.160332+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -484,7 +507,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2024-01-19T12:32:08.981484633+01:00" + created: "2024-01-19T13:04:59.158823+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -507,7 +530,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2024-01-19T12:32:08.974926052+01:00" + created: "2024-01-19T13:04:59.156971+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -530,7 +553,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2024-01-19T12:32:08.969540327+01:00" + created: "2024-01-19T13:04:59.15544+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -552,7 +575,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2024-01-19T12:32:08.963702724+01:00" + created: "2024-01-19T13:04:59.153648+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -574,7 +597,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2024-01-19T12:32:08.958295348+01:00" + created: "2024-01-19T13:04:59.152289+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -596,7 +619,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2024-01-19T12:32:08.953425127+01:00" + created: "2024-01-19T13:04:59.150915+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -618,7 +641,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2024-01-19T12:32:08.94716966+01:00" + created: "2024-01-19T13:04:59.149566+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -638,7 +661,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2024-01-19T12:32:08.942430392+01:00" + created: "2024-01-19T13:04:59.148023+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -658,7 +681,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2024-01-19T12:32:08.93721564+01:00" + created: "2024-01-19T13:04:59.146564+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -678,7 +701,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2024-01-19T12:32:08.930958846+01:00" + created: "2024-01-19T13:04:59.145082+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -698,7 +721,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T12:32:08.925014944+01:00" + created: "2024-01-19T13:04:59.143265+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -718,7 +741,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T12:32:08.919958175+01:00" + created: "2024-01-19T13:04:59.14177+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -738,7 +761,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T12:32:08.914934581+01:00" + created: "2024-01-19T13:04:59.140137+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -758,7 +781,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T12:32:08.817708321+01:00" + created: "2024-01-19T13:04:59.113387+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -778,7 +801,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T12:32:08.812718531+01:00" + created: "2024-01-19T13:04:59.112022+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -798,7 +821,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T12:32:08.807771972+01:00" + created: "2024-01-19T13:04:59.110636+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -818,7 +841,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T12:32:08.802827299+01:00" + created: "2024-01-19T13:04:59.108961+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -838,7 +861,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2024-01-19T12:32:08.797914684+01:00" + created: "2024-01-19T13:04:59.107541+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -858,7 +881,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2024-01-19T12:32:08.792513035+01:00" + created: "2024-01-19T13:04:59.106234+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -878,7 +901,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2024-01-19T12:32:08.788504803+01:00" + created: "2024-01-19T13:04:59.104497+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -898,7 +921,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2024-01-19T12:32:08.784096866+01:00" + created: "2024-01-19T13:04:59.103265+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -919,7 +942,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2024-01-19T12:32:08.779475562+01:00" + created: "2024-01-19T13:04:59.101984+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -939,7 +962,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T12:32:08.775067136+01:00" + created: "2024-01-19T13:04:59.10066+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -959,7 +982,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T12:32:08.769342328+01:00" + created: "2024-01-19T13:04:59.098279+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -979,7 +1002,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T12:32:08.762648323+01:00" + created: "2024-01-19T13:04:59.096074+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -999,7 +1022,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2024-01-19T12:32:08.757576956+01:00" + created: "2024-01-19T13:04:59.094146+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -1019,7 +1042,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2024-01-19T12:32:08.752364719+01:00" + created: "2024-01-19T13:04:59.09239+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -1039,7 +1062,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2024-01-19T12:32:08.747185796+01:00" + created: "2024-01-19T13:04:59.09041+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1055,7 +1078,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2024-01-19T12:32:08.742132728+01:00" + created: "2024-01-19T13:04:59.088734+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1071,7 +1094,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2024-01-19T12:32:08.73844598+01:00" + created: "2024-01-19T13:04:59.08675+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1087,7 +1110,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2024-01-19T12:32:08.736308605+01:00" + created: "2024-01-19T13:04:59.085094+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1103,7 +1126,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2024-01-19T12:32:08.730199876+01:00" + created: "2024-01-19T13:04:59.083037+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1119,7 +1142,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2024-01-19T12:32:08.725555244+01:00" + created: "2024-01-19T13:04:59.081208+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1135,7 +1158,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2024-01-19T12:32:08.723517744+01:00" + created: "2024-01-19T13:04:59.079117+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1151,7 +1174,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2024-01-19T12:32:08.72032415+01:00" + created: "2024-01-19T13:04:59.076939+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1168,7 +1191,7 @@ entries: keda-add-ons-http: - apiVersion: v2 appVersion: 0.6.0 - created: "2024-01-19T12:32:09.089527389+01:00" + created: "2024-01-19T13:04:59.185425+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 home: https://github.com/kedacore/http-add-on @@ -1191,7 +1214,7 @@ entries: version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T12:32:09.0873347+01:00" + created: "2024-01-19T13:04:59.18481+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1214,7 +1237,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T12:32:09.085246145+01:00" + created: "2024-01-19T13:04:59.184204+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1237,7 +1260,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T12:32:09.083318716+01:00" + created: "2024-01-19T13:04:59.183711+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1260,7 +1283,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T12:32:09.081161297+01:00" + created: "2024-01-19T13:04:59.183218+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1283,7 +1306,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2024-01-19T12:32:09.079008278+01:00" + created: "2024-01-19T13:04:59.18272+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1306,7 +1329,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2024-01-19T12:32:09.076665359+01:00" + created: "2024-01-19T13:04:59.182292+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1329,7 +1352,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2024-01-19T12:32:09.074244845+01:00" + created: "2024-01-19T13:04:59.181861+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1354,7 +1377,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2024-01-19T12:32:09.072114385+01:00" + created: "2024-01-19T13:04:59.181427+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1378,7 +1401,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T12:32:09.070101539+01:00" + created: "2024-01-19T13:04:59.180999+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1402,7 +1425,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T12:32:09.068165729+01:00" + created: "2024-01-19T13:04:59.180569+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1426,7 +1449,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T12:32:09.066419261+01:00" + created: "2024-01-19T13:04:59.180129+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1450,7 +1473,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2024-01-19T12:32:09.064734672+01:00" + created: "2024-01-19T13:04:59.179727+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1474,7 +1497,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2024-01-19T12:32:09.063840136+01:00" + created: "2024-01-19T13:04:59.179482+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1496,4 +1519,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2024-01-19T12:32:08.714210531+01:00" +generated: "2024-01-19T13:04:59.074175+01:00" diff --git a/docs/keda-2.13.1.tgz b/docs/keda-2.13.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c076c3bd90e7b5598457880129dc1eceda15d7d3 GIT binary patch literal 96136 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.23.0-0" # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 2.13.0 +version: 2.13.1 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. diff --git a/keda/templates/manager/rolebinding.yaml b/keda/templates/manager/rolebinding.yaml index 0d1381ab..1c2303a3 100644 --- a/keda/templates/manager/rolebinding.yaml +++ b/keda/templates/manager/rolebinding.yaml @@ -1,5 +1,4 @@ {{- if .Values.rbac.create }} -{{- if or (and .Values.certificates.autoGenerated (not .Values.certificates.certManager.enabled)) (.Values.permissions.operator.restrict.secret) }} apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: @@ -21,4 +20,3 @@ subjects: name: {{ .Values.serviceAccount.name }} namespace: {{ .Release.Namespace }} {{- end -}} -{{- end -}} From 4f28e7fe43ccaa57a144c2efd8d68475310d6829 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Mon, 22 Jan 2024 09:40:17 +0100 Subject: [PATCH 39/41] chore(add-on): Apply HTTP Add-on changes on Helm chart (#598) Signed-off-by: Dmytro Kovalenko --- .github/workflows/ci-core.yml | 6 +-- .github/workflows/ci-http-add-on.yml | 6 +-- http-add-on/README.md | 4 +- http-add-on/templates/crd.yaml | 45 ++++++++++--------- .../templates/interceptor/deployment.yaml | 17 ++++--- http-add-on/templates/interceptor/rbac.yml | 4 +- .../templates/interceptor/service-admin.yaml | 5 ++- .../templates/interceptor/service-proxy.yaml | 5 ++- http-add-on/templates/operator/service.yaml | 4 +- http-add-on/templates/scaler/deployment.yaml | 24 +++++++--- http-add-on/templates/scaler/rbac.yml | 8 ---- http-add-on/templates/scaler/service.yaml | 5 +-- http-add-on/values.yaml | 8 ++-- 13 files changed, 76 insertions(+), 65 deletions(-) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 1ef65a51..2ca74656 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -42,7 +42,7 @@ jobs: fail-fast: false matrix: enableAzureWorkloadIdentity: [false, true] - kubernetesVersion: [v1.28, v1.27, v1.26, v1.23] + kubernetesVersion: [v1.29, v1.28, v1.27, v1.23] namespace: ["keda", "not-keda"] enableCertManager: [false, true] include: @@ -55,12 +55,12 @@ jobs: clientId: "" # Images are defined on every Kind release # See https://github.com/kubernetes-sigs/kind/releases + - kubernetesVersion: v1.29 + kindImage: kindest/node:v1.29.0@sha256:eaa1450915475849a73a9227b8f201df25e55e268e5d619312131292e324d570 - kubernetesVersion: v1.28 kindImage: kindest/node:v1.28.0@sha256:b7a4cad12c197af3ba43202d3efe03246b3f0793f162afb40a33c923952d5b31 - kubernetesVersion: v1.27 kindImage: kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72 - - kubernetesVersion: v1.26 - kindImage: kindest/node:v1.26.6@sha256:6e2d8b28a5b601defe327b98bd1c2d1930b49e5d8c512e1895099e4504007adb - kubernetesVersion: v1.23 kindImage: kindest/node:v1.23.17@sha256:59c989ff8a517a93127d4a536e7014d28e235fb3529d9fba91b3951d461edfdb steps: diff --git a/.github/workflows/ci-http-add-on.yml b/.github/workflows/ci-http-add-on.yml index 87907f13..b1eb88a1 100644 --- a/.github/workflows/ci-http-add-on.yml +++ b/.github/workflows/ci-http-add-on.yml @@ -40,16 +40,16 @@ jobs: strategy: fail-fast: false matrix: - kubernetesVersion: [v1.28, v1.27, v1.26, v1.25] + kubernetesVersion: [v1.29, v1.28, v1.27, v1.26] include: + - kubernetesVersion: v1.29 + kindImage: kindest/node:v1.29.0@sha256:eaa1450915475849a73a9227b8f201df25e55e268e5d619312131292e324d570 - kubernetesVersion: v1.28 kindImage: kindest/node:v1.28.0@sha256:b7a4cad12c197af3ba43202d3efe03246b3f0793f162afb40a33c923952d5b31 - kubernetesVersion: v1.27 kindImage: kindest/node:v1.27.3@sha256:3966ac761ae0136263ffdb6cfd4db23ef8a83cba8a463690e98317add2c9ba72 - kubernetesVersion: v1.26 kindImage: kindest/node:v1.26.6@sha256:6e2d8b28a5b601defe327b98bd1c2d1930b49e5d8c512e1895099e4504007adb - - kubernetesVersion: v1.25 - kindImage: kindest/node:v1.25.11@sha256:227fa11ce74ea76a0474eeefb84cb75d8dad1b08638371ecf0e86259b35be0c8 steps: - name: Check out code uses: actions/checkout@v2 diff --git a/http-add-on/README.md b/http-add-on/README.md index 58f2b7e2..08baee26 100644 --- a/http-add-on/README.md +++ b/http-add-on/README.md @@ -128,11 +128,11 @@ their default values. |-----------|------|---------|-------------| | `scaler.affinity` | object | `{}` | Affinity for pod scheduling ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/)) | | `scaler.grpcPort` | int | `9090` | The port for the scaler's gRPC server. This is the server that KEDA will send scaling requests to. | -| `scaler.healthPort` | int | `9091` | The port for the scaler's health check and admin server | | `scaler.imagePullSecrets` | list | `[]` | The image pull secrets for the scaler component | | `scaler.nodeSelector` | object | `{}` | Node selector for pod scheduling ([docs](https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/)) | | `scaler.pendingRequestsInterceptor` | int | `200` | The number of "target requests" that the external scaler will report to KEDA for the interceptor's scaling metrics. See the [KEDA external scaler documentation](https://keda.sh/docs/2.4/concepts/external-scalers/) for details on target requests. | | `scaler.pullPolicy` | string | `"Always"` | The image pull policy for the scaler component | +| `scaler.replicas` | int | `3` | Number of replicas | | `scaler.resources.limits.cpu` | float | `0.5` | | | `scaler.resources.limits.memory` | string | `"64Mi"` | | | `scaler.resources.requests.cpu` | string | `"250m"` | | @@ -148,7 +148,7 @@ their default values. | `interceptor.admin.port` | int | `9090` | The port for the interceptor's admin server to run on | | `interceptor.admin.service` | string | `"interceptor-admin"` | The name of the Kubernetes `Service` for the interceptor's admin service | | `interceptor.affinity` | object | `{}` | Affinity for pod scheduling ([docs](https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes-using-node-affinity/)) | -| `interceptor.deploymentCachePollingIntervalMS` | int | `250` | How often (in milliseconds) the interceptor does a full refresh of its deployment cache. The interceptor will also use Kubernetes events to stay up-to-date with the deployment cache changes. This duration is the maximum time it will take to see changes to the deployment state. | +| `interceptor.endpointsCachePollingIntervalMS` | int | `250` | How often (in milliseconds) the interceptor does a full refresh of its endpoints cache. The interceptor will also use Kubernetes events to stay up-to-date with the endpoints cache changes. This duration is the maximum time it will take to see changes to the endpoints. | | `interceptor.expectContinueTimeout` | string | `"1s"` | Special handling for responses with "Expect: 100-continue" response headers. see https://pkg.go.dev/net/http#Transport under the 'ExpectContinueTimeout' field for more details | | `interceptor.forceHTTP2` | bool | `false` | Whether or not the interceptor should force requests to use HTTP/2 | | `interceptor.idleConnTimeout` | string | `"90s"` | The timeout after which any idle connection is closed and removed from the interceptor's in-memory connection pool. | diff --git a/http-add-on/templates/crd.yaml b/http-add-on/templates/crd.yaml index cae92085..54dcfe47 100644 --- a/http-add-on/templates/crd.yaml +++ b/http-add-on/templates/crd.yaml @@ -17,15 +17,12 @@ spec: scope: Namespaced versions: - additionalPrinterColumns: - - jsonPath: .spec.scaleTargetRef.deploymentName - name: ScaleTargetDeploymentName + - jsonPath: .status.targetWorkload + name: TargetWorkload type: string - - jsonPath: .spec.scaleTargetRef - name: ScaleTargetServiceName + - jsonPath: .status.targetService + name: TargetService type: string - - jsonPath: .spec.scaleTargetRef - name: ScaleTargetPort - type: integer - jsonPath: .spec.replicas.min name: MinReplicas type: integer @@ -58,19 +55,12 @@ spec: spec: description: HTTPScaledObjectSpec defines the desired state of HTTPScaledObject properties: - host: - description: (optional) (deprecated) The host to route. All requests - which the "Host" header matches .spec.host and the Request Target - matches any .spec.pathPrefixes will be routed to the Service and - Port specified in the scaleTargetRef. The .spec.host field is mutually - exclusive with the .spec.hosts field. - type: string hosts: - description: (optional) The hosts to route. All requests which the - "Host" header matches any .spec.hosts and the Request Target matches - any .spec.pathPrefixes will be routed to the Service and Port specified - in the scaleTargetRef. The .spec.hosts field is mutually exclusive - with the .spec.host field. + description: The hosts to route. All requests which the "Host" header + matches any .spec.hosts and the Request Target matches any .spec.pathPrefixes + will be routed to the Service and Port specified in the scaleTargetRef. + The .spec.hosts field is mutually exclusive with the .spec.host + field. items: type: string type: array @@ -102,9 +92,15 @@ spec: description: The name of the deployment to route HTTP requests to (and to autoscale). properties: + apiVersion: + type: string deployment: - description: The name of the deployment to scale according to - HTTP traffic + description: 'Deprecated: The name of the deployment to scale + according to HTTP traffic' + type: string + kind: + type: string + name: type: string port: description: The port to route to @@ -114,7 +110,6 @@ spec: description: The name of the service to route to type: string required: - - deployment - port - service type: object @@ -173,6 +168,12 @@ spec: - type type: object type: array + targetService: + description: TargetService reflects details about the scaled service. + type: string + targetWorkload: + description: TargetWorkload reflects details about the scaled workload. + type: string type: object type: object served: true diff --git a/http-add-on/templates/interceptor/deployment.yaml b/http-add-on/templates/interceptor/deployment.yaml index 9090ed10..79c6b9d8 100644 --- a/http-add-on/templates/interceptor/deployment.yaml +++ b/http-add-on/templates/interceptor/deployment.yaml @@ -7,7 +7,6 @@ metadata: name: {{ .Chart.Name }}-interceptor namespace: {{ .Release.Namespace }} spec: - replicas: {{ .Values.interceptor.replicas.min }} selector: matchLabels: app.kubernetes.io/component: interceptor @@ -51,8 +50,8 @@ spec: value: "{{ .Values.interceptor.responseHeaderTimeout }}" - name: KEDA_CONDITION_WAIT_TIMEOUT value: "{{ .Values.interceptor.replicas.waitTimeout }}" - - name: KEDA_HTTP_DEPLOYMENT_CACHE_POLLING_INTERVAL_MS - value: "{{ .Values.interceptor.deploymentCachePollingIntervalMS }}" + - name: KEDA_HTTP_ENDPOINTS_CACHE_POLLING_INTERVAL_MS + value: "{{ .Values.interceptor.endpointsCachePollingIntervalMS }}" - name: KEDA_HTTP_FORCE_HTTP2 value: "{{ .Values.interceptor.forceHTTP2 }}" - name: KEDA_HTTP_MAX_IDLE_CONNS @@ -65,9 +64,17 @@ spec: value: "{{ .Values.interceptor.expectContinueTimeout }}" ports: - containerPort: {{ .Values.interceptor.admin.port }} - name: inter-admin + name: admin - containerPort: {{ .Values.interceptor.proxy.port }} - name: inter-proxy + name: proxy + livenessProbe: + httpGet: + path: /livez + port: proxy + readinessProbe: + httpGet: + path: /readyz + port: proxy resources: {{- toYaml .Values.interceptor.resources | nindent 10 }} {{- if .Values.securityContext.interceptor }} diff --git a/http-add-on/templates/interceptor/rbac.yml b/http-add-on/templates/interceptor/rbac.yml index 4bf400ea..bfbf1fe7 100644 --- a/http-add-on/templates/interceptor/rbac.yml +++ b/http-add-on/templates/interceptor/rbac.yml @@ -6,9 +6,9 @@ metadata: name: {{ .Chart.Name }}-interceptor rules: - apiGroups: - - apps + - "" resources: - - deployments + - endpoints verbs: - get - list diff --git a/http-add-on/templates/interceptor/service-admin.yaml b/http-add-on/templates/interceptor/service-admin.yaml index 87af6aeb..bea0d586 100644 --- a/http-add-on/templates/interceptor/service-admin.yaml +++ b/http-add-on/templates/interceptor/service-admin.yaml @@ -8,8 +8,9 @@ metadata: namespace: {{ .Release.Namespace }} spec: ports: - - name: https + - name: admin port: {{ default 9091 .Values.interceptor.admin.port }} - targetPort: inter-admin + targetPort: admin selector: app.kubernetes.io/component: interceptor + {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/templates/interceptor/service-proxy.yaml b/http-add-on/templates/interceptor/service-proxy.yaml index 7214c531..422de5ca 100644 --- a/http-add-on/templates/interceptor/service-proxy.yaml +++ b/http-add-on/templates/interceptor/service-proxy.yaml @@ -8,8 +8,9 @@ metadata: namespace: {{ .Release.Namespace }} spec: ports: - - name: http + - name: proxy port: {{ default 9091 .Values.interceptor.proxy.port }} - targetPort: inter-proxy + targetPort: proxy selector: app.kubernetes.io/component: interceptor + {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/templates/operator/service.yaml b/http-add-on/templates/operator/service.yaml index 506a6541..b0b15cba 100644 --- a/http-add-on/templates/operator/service.yaml +++ b/http-add-on/templates/operator/service.yaml @@ -8,9 +8,9 @@ metadata: namespace: {{ .Release.Namespace }} spec: ports: - - name: https + - name: metrics port: {{ default 8443 .Values.operator.port }} - targetPort: https + targetPort: metrics selector: app.kubernetes.io/component: operator {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/templates/scaler/deployment.yaml b/http-add-on/templates/scaler/deployment.yaml index 03413d3d..c5493f1e 100644 --- a/http-add-on/templates/scaler/deployment.yaml +++ b/http-add-on/templates/scaler/deployment.yaml @@ -7,7 +7,7 @@ metadata: name: {{ .Chart.Name }}-external-scaler namespace: {{ .Release.Namespace }} spec: - replicas: 1 + replicas: {{ .Values.scaler.replicas }} selector: matchLabels: app.kubernetes.io/component: scaler @@ -37,17 +37,13 @@ spec: imagePullPolicy: {{ .Values.scaler.pullPolicy | default "Always" }} name: "{{ .Chart.Name }}-external-scaler" ports: - - containerPort: {{ .Values.scaler.healthPort }} - name: scaler-health - containerPort: {{ .Values.scaler.grpcPort }} - name: scaler-grpc + name: grpc env: - name: KEDA_HTTP_SCALER_TARGET_ADMIN_DEPLOYMENT value: "{{ .Chart.Name }}-interceptor" - name: KEDA_HTTP_SCALER_PORT value: "{{ .Values.scaler.grpcPort }}" - - name: KEDA_HTTP_HEALTH_PORT - value: "{{ .Values.scaler.healthPort }}" - name: KEDA_HTTP_SCALER_TARGET_ADMIN_NAMESPACE value: "{{ .Release.Namespace }}" - name: KEDA_HTTP_SCALER_TARGET_ADMIN_SERVICE @@ -58,6 +54,22 @@ spec: value: "{{ .Values.scaler.streamInterval }}" resources: {{- toYaml .Values.scaler.resources | nindent 10 }} + livenessProbe: + grpc: + port: {{ .Values.scaler.grpcPort }} + service: liveness + timeoutSeconds: 5 + periodSeconds: 5 + successThreshold: 1 + failureThreshold: 6 + readinessProbe: + grpc: + port: {{ .Values.scaler.grpcPort }} + service: readiness + timeoutSeconds: 1 + periodSeconds: 5 + successThreshold: 1 + failureThreshold: 3 {{- if .Values.securityContext.scaler }} securityContext: {{- toYaml .Values.securityContext.scaler | nindent 10 }} diff --git a/http-add-on/templates/scaler/rbac.yml b/http-add-on/templates/scaler/rbac.yml index c6e8e064..077f9dfa 100644 --- a/http-add-on/templates/scaler/rbac.yml +++ b/http-add-on/templates/scaler/rbac.yml @@ -13,14 +13,6 @@ rules: - get - list - watch -- apiGroups: - - apps - resources: - - deployments - verbs: - - get - - list - - watch - apiGroups: - http.keda.sh resources: diff --git a/http-add-on/templates/scaler/service.yaml b/http-add-on/templates/scaler/service.yaml index 7dcf3afd..308c9f0c 100644 --- a/http-add-on/templates/scaler/service.yaml +++ b/http-add-on/templates/scaler/service.yaml @@ -10,10 +10,7 @@ spec: ports: - name: grpc port: {{ default 9090 .Values.scaler.grpcPort }} - targetPort: scaler-grpc - - name: health - port: {{ default 9091 .Values.scaler.healthPort }} - targetPort: scaler-health + targetPort: grpc selector: app.kubernetes.io/component: scaler {{- include "keda-http-add-on.labels" . | indent 4 }} diff --git a/http-add-on/values.yaml b/http-add-on/values.yaml index c21d435a..141d56bb 100644 --- a/http-add-on/values.yaml +++ b/http-add-on/values.yaml @@ -81,6 +81,8 @@ operator: memory: 20Mi scaler: + # -- Number of replicas + replicas: 3 # -- The image pull secrets for the scaler component imagePullSecrets: [] # -- The name of the Kubernetes `Service` for the scaler component @@ -89,8 +91,6 @@ scaler: pullPolicy: Always # -- The port for the scaler's gRPC server. This is the server that KEDA will send scaling requests to. grpcPort: 9090 - # -- The port for the scaler's health check and admin server - healthPort: 9091 # -- The number of "target requests" that the external scaler will report to KEDA for the interceptor's scaling metrics. See the [KEDA external scaler documentation](https://keda.sh/docs/2.4/concepts/external-scalers/) for details on target requests. pendingRequestsInterceptor: 200 # -- Interval in ms for communicating IsActive to KEDA @@ -150,8 +150,8 @@ interceptor: keepAlive: 1s # -- How long the interceptor will wait between forwarding a request to a backend and receiving response headers back before failing the request responseHeaderTimeout: 500ms - # -- How often (in milliseconds) the interceptor does a full refresh of its deployment cache. The interceptor will also use Kubernetes events to stay up-to-date with the deployment cache changes. This duration is the maximum time it will take to see changes to the deployment state. - deploymentCachePollingIntervalMS: 250 + # -- How often (in milliseconds) the interceptor does a full refresh of its endpoints cache. The interceptor will also use Kubernetes events to stay up-to-date with the endpoints cache changes. This duration is the maximum time it will take to see changes to the endpoints. + endpointsCachePollingIntervalMS: 250 # -- Whether or not the interceptor should force requests to use HTTP/2 forceHTTP2: false # -- The maximum number of idle connections allowed in the interceptor's in-memory connection pool. Set to 0 to indicate no limit From ec01f012c2f9089d3a6b31b8e981b796a4e50e60 Mon Sep 17 00:00:00 2001 From: Jorge Turrado Ferrero Date: Mon, 22 Jan 2024 12:13:26 +0100 Subject: [PATCH 40/41] chore(add-on): Release v0.7.0 (#599) Signed-off-by: Jorge Turrado Signed-off-by: Dmytro Kovalenko --- README.md | 2 +- docs/index.yaml | 167 ++++++++++++++++++------------- docs/keda-add-ons-http-0.7.0.tgz | Bin 0 -> 12696 bytes http-add-on/Chart.yaml | 4 +- 4 files changed, 98 insertions(+), 75 deletions(-) create mode 100644 docs/keda-add-ons-http-0.7.0.tgz diff --git a/README.md b/README.md index 651bb0f6..44af2cb9 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ $ helm search repo kedacore NAME CHART VERSION APP VERSION DESCRIPTION kedacore/external-scaler-azure-cosmos-db 0.1.0 0.1.0 Event-based autoscaler for Azure Cosmos DB chan... kedacore/keda 2.13.1 2.13.0 Event-based autoscaler for workloads on Kubernetes -kedacore/keda-add-ons-http 0.6.0 0.6.0 Event-based autoscaler for HTTP workloads on Ku... +kedacore/keda-add-ons-http 0.7.0 0.7.0 Event-based autoscaler for HTTP workloads on Ku... ``` ## Releases diff --git a/docs/index.yaml b/docs/index.yaml index 2c98071d..6f9388b9 100644 --- a/docs/index.yaml +++ b/docs/index.yaml @@ -3,7 +3,7 @@ entries: external-scaler-azure-cosmos-db: - apiVersion: v2 appVersion: 0.1.0 - created: "2024-01-19T13:04:59.074924+01:00" + created: "2024-01-22T12:00:44.143089+01:00" description: Event-based autoscaler for Azure Cosmos DB change feed consumer applications digest: a905dedb01db68575cf591eb0b8f6fa1aa1343f0ec239615081e4b57590d8ae9 home: https://github.com/kedacore/external-scaler-azure-cosmos-db @@ -24,7 +24,7 @@ entries: keda: - apiVersion: v2 appVersion: 2.13.0 - created: "2024-01-19T13:04:59.138783+01:00" + created: "2024-01-22T12:00:44.207965+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 00ae78109f89f16b12bb5cf23f7071c6c2fe09294514d4f7fd3850c6ce2b8a57 home: https://github.com/kedacore/keda @@ -47,7 +47,7 @@ entries: version: 2.13.1 - apiVersion: v2 appVersion: 2.13.0 - created: "2024-01-19T13:04:59.136368+01:00" + created: "2024-01-22T12:00:44.205571+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 0dcc74315d6ca02fbadcfc5e358040580c0ad7919921e07ebf2dcc0b1d2d5f03 home: https://github.com/kedacore/keda @@ -70,7 +70,7 @@ entries: version: 2.13.0 - apiVersion: v2 appVersion: 2.12.1 - created: "2024-01-19T13:04:59.13369+01:00" + created: "2024-01-22T12:00:44.202471+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ee87da063be94f3f65661656602775c38ab723374c9892ecc73c1cea269e64c0 home: https://github.com/kedacore/keda @@ -93,7 +93,7 @@ entries: version: 2.12.1 - apiVersion: v2 appVersion: 2.12.0 - created: "2024-01-19T13:04:59.130976+01:00" + created: "2024-01-22T12:00:44.199698+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 5ae5ef24c2e4c38450bb31b7987aea8b19a828c0c6cfa66b8e7ffbc65ebf164d home: https://github.com/kedacore/keda @@ -116,7 +116,7 @@ entries: version: 2.12.0 - apiVersion: v2 appVersion: 2.11.2 - created: "2024-01-19T13:04:59.127953+01:00" + created: "2024-01-22T12:00:44.196513+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1fc274ebf7c405031297166fa3295f13bc9470f3ca688d595b7549d072b062cd home: https://github.com/kedacore/keda @@ -139,7 +139,7 @@ entries: version: 2.11.2 - apiVersion: v2 appVersion: 2.11.1 - created: "2024-01-19T13:04:59.125328+01:00" + created: "2024-01-22T12:00:44.194004+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7d10ab788d363c95f496f28d48a74ab7789a5d04c63d9fa3e5d55967c988c0ed home: https://github.com/kedacore/keda @@ -162,7 +162,7 @@ entries: version: 2.11.1 - apiVersion: v2 appVersion: 2.11.0 - created: "2024-01-19T13:04:59.122683+01:00" + created: "2024-01-22T12:00:44.191457+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8a2100ac1c47053e118b177676fbc07fe427fb9878c31ee7f8b73df0e2a77a06 home: https://github.com/kedacore/keda @@ -185,7 +185,7 @@ entries: version: 2.11.0 - apiVersion: v2 appVersion: 2.10.1 - created: "2024-01-19T13:04:59.120396+01:00" + created: "2024-01-22T12:00:44.189233+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 2e75903cda0780a4a8115dc199541315eaccdbfc3ec3da5ab492c8825080cc99 home: https://github.com/kedacore/keda @@ -208,7 +208,7 @@ entries: version: 2.10.2 - apiVersion: v2 appVersion: 2.10.0 - created: "2024-01-19T13:04:59.11799+01:00" + created: "2024-01-22T12:00:44.186936+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7216ff7cff5567152b895017b97a95b41b788589c4be82169d92906519a24f25 home: https://github.com/kedacore/keda @@ -231,7 +231,7 @@ entries: version: 2.10.1 - apiVersion: v2 appVersion: 2.10.0 - created: "2024-01-19T13:04:59.11583+01:00" + created: "2024-01-22T12:00:44.184494+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 4be1fc8dba9d0e17ff475ca3dcb1183b07164ccaddfc48c67f6369a56f1b1777 home: https://github.com/kedacore/keda @@ -254,7 +254,7 @@ entries: version: 2.10.0 - apiVersion: v2 appVersion: 2.9.3 - created: "2024-01-19T13:04:59.179204+01:00" + created: "2024-01-22T12:00:44.248927+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c455dc8d908b6e8575fe0dbe8275861355cb242a5768f23cd909e543fe077438 home: https://github.com/kedacore/keda @@ -277,7 +277,7 @@ entries: version: 2.9.4 - apiVersion: v2 appVersion: 2.9.2 - created: "2024-01-19T13:04:59.177179+01:00" + created: "2024-01-22T12:00:44.247107+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 52a5de6f5585fb2cfe44ba9ddadcf4cd4208138795313e25ee654d82a424faef home: https://github.com/kedacore/keda @@ -300,7 +300,7 @@ entries: version: 2.9.3 - apiVersion: v2 appVersion: 2.9.2 - created: "2024-01-19T13:04:59.175345+01:00" + created: "2024-01-22T12:00:44.245007+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a1f14048f1788cde92a42412fa789e34d48bb4a8e94d4b43e0c70c8b8c326e43 home: https://github.com/kedacore/keda @@ -323,7 +323,7 @@ entries: version: 2.9.2 - apiVersion: v2 appVersion: 2.9.1 - created: "2024-01-19T13:04:59.173322+01:00" + created: "2024-01-22T12:00:44.243179+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 004f2f37845a324badc7228585755ddfd8f5feea957cdca7de9b39499ce1a8d8 home: https://github.com/kedacore/keda @@ -346,7 +346,7 @@ entries: version: 2.9.1 - apiVersion: v2 appVersion: 2.9.0 - created: "2024-01-19T13:04:59.171499+01:00" + created: "2024-01-22T12:00:44.241034+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e0f84de35c0378027f43a732f12a164db05e45947687203020c0031baeee5826 home: https://github.com/kedacore/keda @@ -369,7 +369,7 @@ entries: version: 2.9.0 - apiVersion: v2 appVersion: 2.8.2 - created: "2024-01-19T13:04:59.169223+01:00" + created: "2024-01-22T12:00:44.238954+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bbd9f4f9312781de5363145d5a937d7c084ea1139f12f5e7f153b3f174332517 home: https://github.com/kedacore/keda @@ -392,7 +392,7 @@ entries: version: 2.8.4 - apiVersion: v2 appVersion: 2.8.2 - created: "2024-01-19T13:04:59.167272+01:00" + created: "2024-01-22T12:00:44.236814+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 04934ca1e41970ca687de13db697cc7fdc24d367af570eba47bed01ad981e1b1 home: https://github.com/kedacore/keda @@ -415,7 +415,7 @@ entries: version: 2.8.3 - apiVersion: v2 appVersion: 2.8.1 - created: "2024-01-19T13:04:59.165475+01:00" + created: "2024-01-22T12:00:44.23479+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e7bc80a5dde861a5f62b73e9d5c4ce139339b07438344668485fdc435f3109b4 home: https://github.com/kedacore/keda @@ -438,7 +438,7 @@ entries: version: 2.8.2 - apiVersion: v2 appVersion: 2.8.0 - created: "2024-01-19T13:04:59.163744+01:00" + created: "2024-01-22T12:00:44.233042+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: df15ce1a4a27df2f3eb85c7cc803de53dec526bcad92d732a0944bd5288f4845 home: https://github.com/kedacore/keda @@ -461,7 +461,7 @@ entries: version: 2.8.1 - apiVersion: v2 appVersion: 2.8.0 - created: "2024-01-19T13:04:59.161783+01:00" + created: "2024-01-22T12:00:44.231061+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: afa9410e4e6e805979e5c22a17db6dc7dc2720c28b3f176d2eef2708ef0d0a32 home: https://github.com/kedacore/keda @@ -484,7 +484,7 @@ entries: version: 2.8.0 - apiVersion: v2 appVersion: 2.7.1 - created: "2024-01-19T13:04:59.160332+01:00" + created: "2024-01-22T12:00:44.229588+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: eec27b3d7075a8c51cce1fb8d456ac3d458b3bf72fde1cda67c4b554df1e9838 home: https://github.com/kedacore/keda @@ -507,7 +507,7 @@ entries: version: 2.7.2 - apiVersion: v2 appVersion: 2.7.1 - created: "2024-01-19T13:04:59.158823+01:00" + created: "2024-01-22T12:00:44.228146+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: aa1644eb53ec44294993d0611169bd863db39f2bedca1d9ed64b05fbef74087c home: https://github.com/kedacore/keda @@ -530,7 +530,7 @@ entries: version: 2.7.1 - apiVersion: v2 appVersion: 2.7.0 - created: "2024-01-19T13:04:59.156971+01:00" + created: "2024-01-22T12:00:44.226339+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f23894c1c4403f36797a0f2ccb497a3b4f2fe761e00b841cc7e1c8ce110d6dc5 home: https://github.com/kedacore/keda @@ -553,7 +553,7 @@ entries: version: 2.7.0 - apiVersion: v2 appVersion: 2.6.1 - created: "2024-01-19T13:04:59.15544+01:00" + created: "2024-01-22T12:00:44.22485+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: af7ec480a66e9f033ab44d28b3df518c0def8ea289996c413dae34e307a0a033 home: https://github.com/kedacore/keda @@ -575,7 +575,7 @@ entries: version: 2.6.2 - apiVersion: v2 appVersion: 2.6.0 - created: "2024-01-19T13:04:59.153648+01:00" + created: "2024-01-22T12:00:44.223119+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6cf54875f34e8cda992f1ccfe7d594a2f75d25b573a8149721e69ab5ebe3d1d home: https://github.com/kedacore/keda @@ -597,7 +597,7 @@ entries: version: 2.6.1 - apiVersion: v2 appVersion: 2.6.0 - created: "2024-01-19T13:04:59.152289+01:00" + created: "2024-01-22T12:00:44.221741+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1788eb5f7febdff68275ec5446d30f7f51d0259f343a024639ab1d46228fa00c home: https://github.com/kedacore/keda @@ -619,7 +619,7 @@ entries: version: 2.6.0 - apiVersion: v2 appVersion: 2.5.0 - created: "2024-01-19T13:04:59.150915+01:00" + created: "2024-01-22T12:00:44.220393+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b23ffc14ff517dbf1e892593364a0b9e660afe2cd49c2e11e8589e0f271ef254 home: https://github.com/kedacore/keda @@ -641,7 +641,7 @@ entries: version: 2.5.1 - apiVersion: v2 appVersion: 2.5.0 - created: "2024-01-19T13:04:59.149566+01:00" + created: "2024-01-22T12:00:44.219054+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a8c62e7b9e38adf3ef1837e2828cbd29dfd6c7633e8260bd2aa68c70307c8149 home: https://github.com/kedacore/keda @@ -661,7 +661,7 @@ entries: version: 2.5.0 - apiVersion: v2 appVersion: 2.4.0 - created: "2024-01-19T13:04:59.148023+01:00" + created: "2024-01-22T12:00:44.217331+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 41a092fcda3518068d27cf7b86afa5ea2577c8435055ee214bfba11f3a86ef7b home: https://github.com/kedacore/keda @@ -681,7 +681,7 @@ entries: version: 2.4.0 - apiVersion: v2 appVersion: 2.3.0 - created: "2024-01-19T13:04:59.146564+01:00" + created: "2024-01-22T12:00:44.215872+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 8f9d78fb5d090e9887f7914ec8db637344361a8881bb4d8f4c1a9225964b72e0 home: https://github.com/kedacore/keda @@ -701,7 +701,7 @@ entries: version: 2.3.2 - apiVersion: v2 appVersion: 2.3.0 - created: "2024-01-19T13:04:59.145082+01:00" + created: "2024-01-22T12:00:44.214418+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: c36eef4718068eee2ac8d3d54e10b15c6ca2b4d1970c84797387152393804578 home: https://github.com/kedacore/keda @@ -721,7 +721,7 @@ entries: version: 2.3.0 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T13:04:59.143265+01:00" + created: "2024-01-22T12:00:44.212593+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6b6b25799c11e01d2a7edb34d8cf3fb6f82393e7c4e9faa07c38271afad49704 home: https://github.com/kedacore/keda @@ -741,7 +741,7 @@ entries: version: 2.2.2 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T13:04:59.14177+01:00" + created: "2024-01-22T12:00:44.211205+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 7ec5c403d0ad315d2eb9ec0c9d73b36c0baced870f397884d467d46014f24631 home: https://github.com/kedacore/keda @@ -761,7 +761,7 @@ entries: version: 2.2.1 - apiVersion: v2 appVersion: 2.2.0 - created: "2024-01-19T13:04:59.140137+01:00" + created: "2024-01-22T12:00:44.209787+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 42b530656687cabb1408abcb137a5d7515243465b65a3a6006927987441fadc0 home: https://github.com/kedacore/keda @@ -781,7 +781,7 @@ entries: version: 2.2.0 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T13:04:59.113387+01:00" + created: "2024-01-22T12:00:44.182452+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 65e2fb98c55740251d7ffa1680ef0edeb42954576deac3856dd468473e321747 home: https://github.com/kedacore/keda @@ -801,7 +801,7 @@ entries: version: 2.1.3 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T13:04:59.112022+01:00" + created: "2024-01-22T12:00:44.181117+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f336ab24d5ebf96d28da95a03931f2701bb44ce6bb7c30991e3ad14959e2e7e4 home: https://github.com/kedacore/keda @@ -821,7 +821,7 @@ entries: version: 2.1.2 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T13:04:59.110636+01:00" + created: "2024-01-22T12:00:44.179555+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: b6e752d05797cd50ce95a96ae1b6cf8b2b87fc10c27391172beb1acd9fcb18a2 home: https://github.com/kedacore/keda @@ -841,7 +841,7 @@ entries: version: 2.1.1 - apiVersion: v2 appVersion: 2.1.0 - created: "2024-01-19T13:04:59.108961+01:00" + created: "2024-01-22T12:00:44.178219+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 91998f9165176f972b954ef9d4077942979cb5e863bb7d76ed29c48f63533531 home: https://github.com/kedacore/keda @@ -861,7 +861,7 @@ entries: version: 2.1.0 - apiVersion: v2 appVersion: 2.0.0 - created: "2024-01-19T13:04:59.107541+01:00" + created: "2024-01-22T12:00:44.176805+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: ce2e848f5d7a067d74feb3745da5a834cccdfaa665b5b59d43ad06baa4cdfd04 home: https://github.com/kedacore/keda @@ -881,7 +881,7 @@ entries: version: 2.0.1 - apiVersion: v1 appVersion: 2.0.0 - created: "2024-01-19T13:04:59.106234+01:00" + created: "2024-01-22T12:00:44.175272+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: dba8b0e793085165c7d155f9393c5ff112d4714dbce0201404ceb0e67d1b2deb home: https://github.com/kedacore/keda @@ -901,7 +901,7 @@ entries: version: 2.0.0 - apiVersion: v1 appVersion: 2.0.0-rc2 - created: "2024-01-19T13:04:59.104497+01:00" + created: "2024-01-22T12:00:44.173671+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: bad82c28c5ca1d5e69fac4bfcc7a999d5d2b2afd9b19ff6deb9a48811110eb0d home: https://github.com/kedacore/keda @@ -921,7 +921,7 @@ entries: version: 2.0.0-rc3 - apiVersion: v2 appVersion: 2.0.0-rc2 - created: "2024-01-19T13:04:59.103265+01:00" + created: "2024-01-22T12:00:44.172356+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: a4042ba14e595a8e82c9a39d8987625b89292aa86029686a3603b724fda36ca0 home: https://github.com/kedacore/keda @@ -942,7 +942,7 @@ entries: version: 2.0.0-rc2 - apiVersion: v1 appVersion: 2.0.0-rc - created: "2024-01-19T13:04:59.101984+01:00" + created: "2024-01-22T12:00:44.170966+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 3a952f2aaa0ea35ee4335f0b168f44fcf37c5c5ab7e9b9bba7e731c42f04ad61 home: https://github.com/kedacore/keda @@ -962,7 +962,7 @@ entries: version: 2.0.0-rc - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T13:04:59.10066+01:00" + created: "2024-01-22T12:00:44.16938+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: fbafc7ae564c13a0eab7062667759f6e93595c97125731a27e8290574e1d570c home: https://github.com/kedacore/keda @@ -982,7 +982,7 @@ entries: version: 2.0.0-beta1.2 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T13:04:59.098279+01:00" + created: "2024-01-22T12:00:44.167106+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: db9e7d2423423463285f2e9d5b940a63b41d6555ba9fcab8fda0e6a757ccefa9 home: https://github.com/kedacore/keda @@ -1002,7 +1002,7 @@ entries: version: 2.0.0-beta1.1 - apiVersion: v1 appVersion: 2.0.0-beta - created: "2024-01-19T13:04:59.096074+01:00" + created: "2024-01-22T12:00:44.164641+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f0a8f0b854246ee2258ec8f10528f2811681ad2e41946dc455586f1ba9818e01 home: https://github.com/kedacore/keda @@ -1022,7 +1022,7 @@ entries: version: 2.0.0-beta - apiVersion: v1 appVersion: 1.5.0 - created: "2024-01-19T13:04:59.094146+01:00" + created: "2024-01-22T12:00:44.162946+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 07b15ddae4f1c40747de063100a668ac15d504cd0548eac0e1a04381fcaa3b37 home: https://github.com/kedacore/keda @@ -1042,7 +1042,7 @@ entries: version: 1.5.0 - apiVersion: v1 appVersion: 1.4.1 - created: "2024-01-19T13:04:59.09239+01:00" + created: "2024-01-22T12:00:44.160797+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: f8bf80186ac3343998021a1721d06a67fdacd1dab92e4a4992620903b52004a4 home: https://github.com/kedacore/keda @@ -1062,7 +1062,7 @@ entries: version: 1.4.2 - apiVersion: v1 appVersion: 1.4.1 - created: "2024-01-19T13:04:59.09041+01:00" + created: "2024-01-22T12:00:44.159044+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 97a2e5c0beff93bb71ff861da0f29d09dcf988e724784f8b7c56ac9872c37a81 home: https://github.com/kedacore/keda @@ -1078,7 +1078,7 @@ entries: version: 1.4.1 - apiVersion: v1 appVersion: 1.4.0 - created: "2024-01-19T13:04:59.088734+01:00" + created: "2024-01-22T12:00:44.157233+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 1c4dbc502b935898ecaa178b5f0a172be5d75302c729dd96224a19f0dfe7964f home: https://github.com/kedacore/keda @@ -1094,7 +1094,7 @@ entries: version: 1.4.0 - apiVersion: v1 appVersion: 1.4.0 - created: "2024-01-19T13:04:59.08675+01:00" + created: "2024-01-22T12:00:44.15515+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: 6fccc45972ba1e3e9b2a6d3a20d4c6da4e8e1707e28cbf9f52114811628e7498 home: https://github.com/kedacore/keda @@ -1110,7 +1110,7 @@ entries: version: 1.3.2 - apiVersion: v1 appVersion: 1.3.0 - created: "2024-01-19T13:04:59.085094+01:00" + created: "2024-01-22T12:00:44.153486+01:00" description: Event-based autoscaler for workloads on Kubernetes digest: e13bcb65816ed59b10b32fa6db8f61668635459d56c2d599bb3c0bcc5dcc1368 home: https://github.com/kedacore/keda @@ -1126,7 +1126,7 @@ entries: version: 1.3.1 - apiVersion: v1 appVersion: 1.3.0 - created: "2024-01-19T13:04:59.083037+01:00" + created: "2024-01-22T12:00:44.1514+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: 28fed67bbc6ee61357743991f6c66a88b3749d9d7e9d26322f4f9116d038acb8 home: https://github.com/kedacore/keda @@ -1142,7 +1142,7 @@ entries: version: 1.3.0 - apiVersion: v1 appVersion: 1.2.0 - created: "2024-01-19T13:04:59.081208+01:00" + created: "2024-01-22T12:00:44.149634+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: e041dbed2455fef34f2908594a42fc8a7f163a1f48be46c2f93dea46e36fc733 home: https://github.com/kedacore/keda @@ -1158,7 +1158,7 @@ entries: version: 1.2.0 - apiVersion: v1 appVersion: 1.1.0 - created: "2024-01-19T13:04:59.079117+01:00" + created: "2024-01-22T12:00:44.147227+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: c624e6620a9a6f265f51a82ee0d8267dcb2637dd3777306afbb271746234ff2d home: https://github.com/kedacore/keda @@ -1174,7 +1174,7 @@ entries: version: 1.1.0 - apiVersion: v1 appVersion: 1.0.0 - created: "2024-01-19T13:04:59.076939+01:00" + created: "2024-01-22T12:00:44.145417+01:00" description: Event based autoscaler for Azure Functions deployments on Kubernetes digest: ef934588dce70d874ea69692e082b8a70ad19095090b8d4fa7b5cb69b2cecaf6 home: https://github.com/kedacore/keda @@ -1189,9 +1189,32 @@ entries: - https://kedacore.github.io/charts/keda-1.0.0.tgz version: 1.0.0 keda-add-ons-http: + - apiVersion: v2 + appVersion: 0.7.0 + created: "2024-01-22T12:00:44.256201+01:00" + description: Event-based autoscaler for HTTP workloads on Kubernetes + digest: 11df2793e3f5c12e6558a77e67e850472d5e3dcb489a764194c69fcb81ab3100 + home: https://github.com/kedacore/http-add-on + kubeVersion: '>=v1.23.0-0' + maintainers: + - email: ahmels@microsoft.com + name: Ahmed ElSayed + - email: jorge_turrado@hotmail.es + name: Jorge Turrado + - email: kerkhove.tom@gmail.com + name: Tom Kerkhove + - email: zbynek@kedify.io + name: Zbynek Roubalik + name: keda-add-ons-http + sources: + - https://github.com/kedacore/http-add-on + type: application + urls: + - https://kedacore.github.io/charts/keda-add-ons-http-0.7.0.tgz + version: 0.7.0 - apiVersion: v2 appVersion: 0.6.0 - created: "2024-01-19T13:04:59.185425+01:00" + created: "2024-01-22T12:00:44.255671+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 435c6c9c221b8e98774c662250a091b872222584510e3b7f1df2a838afa81252 home: https://github.com/kedacore/http-add-on @@ -1214,7 +1237,7 @@ entries: version: 0.6.0 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T13:04:59.18481+01:00" + created: "2024-01-22T12:00:44.255042+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2f7a41ea8fbed944ea789e5811edcb263275452d6c8928a4647d78d0d9895b15 home: https://github.com/kedacore/http-add-on @@ -1237,7 +1260,7 @@ entries: version: 0.5.3 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T13:04:59.184204+01:00" + created: "2024-01-22T12:00:44.25443+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: cc4459e84407bc2b29203ad02ddcea31471ce3b3d1c4a91c0d7f6be212725c38 home: https://github.com/kedacore/http-add-on @@ -1260,7 +1283,7 @@ entries: version: 0.5.2 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T13:04:59.183711+01:00" + created: "2024-01-22T12:00:44.25392+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 802dd7fa808a092b1c3669e217b6295c600929351fd7ad9ff6485b5ffa7ac87d home: https://github.com/kedacore/http-add-on @@ -1283,7 +1306,7 @@ entries: version: 0.5.1 - apiVersion: v2 appVersion: 0.5.0 - created: "2024-01-19T13:04:59.183218+01:00" + created: "2024-01-22T12:00:44.253402+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 436f37e50c6a2cb406b13144778163070b3903a77750ac2afd71a13c07edd7d3 home: https://github.com/kedacore/http-add-on @@ -1306,7 +1329,7 @@ entries: version: 0.5.0 - apiVersion: v2 appVersion: 0.4.0 - created: "2024-01-19T13:04:59.18272+01:00" + created: "2024-01-22T12:00:44.252891+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ed7e2d31de0f5afff393e1c8857968b68777ff2e29678351ae6e85dfeb54e2f1 home: https://github.com/kedacore/http-add-on @@ -1329,7 +1352,7 @@ entries: version: 0.4.1 - apiVersion: v2 appVersion: 0.4.0 - created: "2024-01-19T13:04:59.182292+01:00" + created: "2024-01-22T12:00:44.252432+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 63a58740d9a528b16cff62eb78ab7c33ac1bb00c1f5d4802cd3de1229f24b1c8 home: https://github.com/kedacore/http-add-on @@ -1352,7 +1375,7 @@ entries: version: 0.4.0 - apiVersion: v2 appVersion: 0.3.0 - created: "2024-01-19T13:04:59.181861+01:00" + created: "2024-01-22T12:00:44.251864+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 79ace4c4fa1521f9e072c34917155db49047b024f77054df2a089aca9a686b14 home: https://github.com/kedacore/http-add-on @@ -1377,7 +1400,7 @@ entries: version: 0.3.1 - apiVersion: v2 appVersion: 0.3.0 - created: "2024-01-19T13:04:59.181427+01:00" + created: "2024-01-22T12:00:44.251218+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: e48c9139df0d83cea4b1faed0094d87707243dbfe620eab2254c7d810ed0f4c2 home: https://github.com/kedacore/http-add-on @@ -1401,7 +1424,7 @@ entries: version: 0.3.0 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T13:04:59.180999+01:00" + created: "2024-01-22T12:00:44.250775+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: ba2bc1bc4445a0aca8e71726f5e0797941a67f5d98764c56be300f6b2c5c008b home: https://github.com/kedacore/http-add-on @@ -1425,7 +1448,7 @@ entries: version: 0.2.2 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T13:04:59.180569+01:00" + created: "2024-01-22T12:00:44.25031+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0dc118417aad98e528e499fdd5e4e8a43465d071dd954612ff5d0289756d372c home: https://github.com/kedacore/http-add-on @@ -1449,7 +1472,7 @@ entries: version: 0.2.1 - apiVersion: v2 appVersion: 0.2.0 - created: "2024-01-19T13:04:59.180129+01:00" + created: "2024-01-22T12:00:44.249853+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 2c209e2a1287a54934cd7e1345fddc5b2b6c2a51c92d07a314f3e08e304af321 home: https://github.com/kedacore/http-add-on @@ -1473,7 +1496,7 @@ entries: version: 0.2.0 - apiVersion: v2 appVersion: 0.1.0 - created: "2024-01-19T13:04:59.179727+01:00" + created: "2024-01-22T12:00:44.249457+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 51bc31412a28fe78a0d0b2cdb76aae1af9eda9707ceecdfdde7106b7a2ceb8cb home: https://github.com/kedacore/http-add-on @@ -1497,7 +1520,7 @@ entries: version: 0.1.0 - apiVersion: v2 appVersion: 0.0.1 - created: "2024-01-19T13:04:59.179482+01:00" + created: "2024-01-22T12:00:44.249199+01:00" description: Event-based autoscaler for HTTP workloads on Kubernetes digest: 0cbcd436721095d7f40750a917ed22d7c83883bdb256edfd43a40a5a0b4f5c17 home: https://github.com/kedacore/http-add-on @@ -1519,4 +1542,4 @@ entries: urls: - https://kedacore.github.io/charts/keda-add-ons-http-0.0.1.tgz version: 0.0.1 -generated: "2024-01-19T13:04:59.074175+01:00" +generated: "2024-01-22T12:00:44.142482+01:00" diff --git a/docs/keda-add-ons-http-0.7.0.tgz b/docs/keda-add-ons-http-0.7.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1841bbe551bb623b961d962144e61ded8f8127c3 GIT binary patch literal 12696 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.23.0-0" # to the chart and its templates, including the app version. This is incremented at chart release time and does not need # to be included in any PRs to main. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.6.0 +version: 0.7.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. -appVersion: 0.6.0 +appVersion: 0.7.0 home: https://github.com/kedacore/http-add-on sources: - https://github.com/kedacore/http-add-on From 8acf125aebfd347cde584ed8c7b3f9cb6ef13dae Mon Sep 17 00:00:00 2001 From: Dmytro Kovalenko Date: Wed, 24 Jan 2024 17:26:51 +0200 Subject: [PATCH 41/41] refactor: Unify cert-manager annotations Signed-off-by: Dmytro Kovalenko --- keda/templates/metrics-server/apiservice.yaml | 8 +++----- .../webhooks/validatingconfiguration.yaml | 8 +++----- keda/values.yaml | 20 +++++++++---------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/keda/templates/metrics-server/apiservice.yaml b/keda/templates/metrics-server/apiservice.yaml index 77d88137..ec44d6b2 100644 --- a/keda/templates/metrics-server/apiservice.yaml +++ b/keda/templates/metrics-server/apiservice.yaml @@ -4,12 +4,10 @@ metadata: {{- if or .Values.certificates.certManager.enabled .Values.additionalAnnotations }} annotations: {{- if .Values.certificates.certManager.enabled }} - {{- if .Values.certificates.certManager.generateCA }} - cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca - {{- else if not .Values.certificates.certManager.issuer.generate }} - cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates - {{- else }} + {{- if and (not .Values.certificates.certManager.generateCA) .Values.certificates.certManager.issuer.generate }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} + {{- else }} + cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- end }} {{- end }} {{- if .Values.additionalAnnotations }} diff --git a/keda/templates/webhooks/validatingconfiguration.yaml b/keda/templates/webhooks/validatingconfiguration.yaml index ae7947c7..0b462309 100644 --- a/keda/templates/webhooks/validatingconfiguration.yaml +++ b/keda/templates/webhooks/validatingconfiguration.yaml @@ -5,12 +5,10 @@ metadata: {{- if or .Values.certificates.certManager.enabled .Values.additionalAnnotations }} annotations: {{- if .Values.certificates.certManager.enabled }} - {{- if .Values.certificates.certManager.generateCA }} - cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-ca - {{- else if not .Values.certificates.certManager.issuer.generate }} - cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates - {{- else }} + {{- if and (not .Values.certificates.certManager.generateCA) .Values.certificates.certManager.issuer.generate }} cert-manager.io/inject-ca-from-secret: {{ .Release.Namespace }}/{{ .Values.certificates.certManager.caSecretName }} + {{- else }} + cert-manager.io/inject-ca-from: {{ .Release.Namespace }}/{{ .Values.operator.name }}-tls-certificates {{- end }} {{- end }} {{- if .Values.additionalAnnotations }} diff --git a/keda/values.yaml b/keda/values.yaml index 9f2459dd..1e915135 100644 --- a/keda/values.yaml +++ b/keda/values.yaml @@ -736,16 +736,6 @@ certificates: # If generateCA is false, the secret with the CA # has to be annotated with `cert-manager.io/allow-direct-injection: "true"` generateCA: true - # -- Reference to custom Issuer. - issuer: - # -- Generates an Issuer resource with Cert-manager - generate: true - # -- Custom Issuer name. Required when generate: false - name: foo-org-ca - # -- Custom Issuer kind. Required when generate: false - kind: ClusterIssuer - # -- Custom Issuer group. Required when generate: false - group: cert-manager.io # -- Secret name where the CA is stored (generatedby cert-manager or user given) caSecretName: "kedaorg-ca" # -- Add labels/annotations to secrets created by Certificate resources @@ -756,6 +746,16 @@ certificates: # my-secret-annotation-2: "bar" # labels: # my-secret-label: foo + # -- Reference to custom Issuer. + issuer: + # -- Generates an Issuer resource with Cert-manager + generate: true + # -- Custom Issuer name. Required when generate: false + name: foo-org-ca + # -- Custom Issuer kind. Required when generate: false + kind: ClusterIssuer + # -- Custom Issuer group. Required when generate: false + group: cert-manager.io permissions: metricServer: