diff --git a/.helm/templates/_helpers.tpl b/.helm/templates/_helpers.tpl index 3863568c..b9fe5dd3 100644 --- a/.helm/templates/_helpers.tpl +++ b/.helm/templates/_helpers.tpl @@ -56,6 +56,13 @@ Generage image reference based on image repository and tag {{- printf "%s:%s" .Values.image.repository (default (printf "%s" .Chart.AppVersion) .Values.image.tag) }} {{- end }} +{{/* +Generate garbage collector image reference based on image repository and tag +*/}} +{{- define "app.garbageCollectorImage" -}} +{{- printf "%s:%s" .Values.garbageCollector.image.repository (default (printf "%s" .Chart.AppVersion) .Values.garbageCollector.image.tag) }} +{{- end }} + {{/* Generage common labels */}} diff --git a/.helm/templates/cron-job-garbage-collector.yaml b/.helm/templates/cron-job-garbage-collector.yaml new file mode 100644 index 00000000..a8a4274a --- /dev/null +++ b/.helm/templates/cron-job-garbage-collector.yaml @@ -0,0 +1,98 @@ +{{- if .Values.garbageCollector.enabled }} +apiVersion: batch/v1 +kind: CronJob +metadata: + name: {{ include "app.name" . }}-garbage-collector + labels: + {{- include "app.labels" $ | nindent 4 }} + app.kubernetes.io/component: garbage-collector + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + schedule: {{ .Values.garbageCollector.schedule | quote }} + concurrencyPolicy: Forbid + successfulJobsHistoryLimit: {{ .Values.garbageCollector.successfulJobsHistoryLimit | default 3 }} + failedJobsHistoryLimit: {{ .Values.garbageCollector.failedJobsHistoryLimit | default 1 }} + jobTemplate: + metadata: + labels: + {{- include "app.labels" $ | nindent 8 }} + app.kubernetes.io/component: garbage-collector + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + spec: + backoffLimit: {{ .Values.garbageCollector.backoffLimit | default 3 }} + template: + metadata: + labels: + {{- include "app.labels" $ | nindent 12 }} + app.kubernetes.io/component: garbage-collector + {{- with .Values.additionalAnnotations }} + annotations: + {{- toYaml . | nindent 12 }} + {{- end }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 12 }} + {{- end }} + serviceAccountName: {{ include "app.serviceAccountName" . }} + restartPolicy: {{ .Values.garbageCollector.restartPolicy | default "OnFailure" }} + {{- with .Values.securityContext }} + securityContext: + {{- toYaml . | nindent 12 }} + {{- end }} + containers: + - name: garbage-collector + {{- with .Values.securityContext }} + securityContext: + {{- toYaml . | nindent 14 }} + {{- end }} + image: "{{ include "app.garbageCollectorImage" . }}" + imagePullPolicy: "{{ .Values.garbageCollector.image.pullPolicy }}" + command: + - /bin/sh + - -c + - | + kubectl get backfillrequests --all-namespaces \ + --field-selector spec.completed=true \ + --sort-by=metadata.creationTimestamp \ + --no-headers \ + --output custom-columns="NAMESPACE:.metadata.namespace,NAME:.metadata.name" \ + | head -n $HISTORY_LIMIT \ + | xargs --no-run-if-empty -n2 kubectl delete backfillrequests --namespace + env: + - name: HISTORY_LIMIT + value: "{{ .Values.garbageCollector.historyLimit }}" + {{- if .Values.extraEnvFrom }} + envFrom: + {{- with .Values.extraEnvFrom }} + {{- toYaml . | nindent 14 }} + {{- end }} + {{- end }} + volumeMounts: + {{- with .Values.extraVolumeMounts }} + {{- toYaml . | nindent 14 }} + {{- end }} + {{- with .Values.garbageCollector.resources }} + resources: + {{- toYaml . | nindent 14 }} + {{- end }} + volumes: + {{- with .Values.extraVolumes }} + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.garbageCollector.tolerations }} + tolerations: + {{- toYaml . | nindent 12 }} + {{- end }} + {{- with .Values.garbageCollector.affinity }} + affinity: + {{- toYaml . | nindent 12 }} + {{- end }} +{{- end }} + diff --git a/.helm/values.yaml b/.helm/values.yaml index 95de0e07..ead72229 100644 --- a/.helm/values.yaml +++ b/.helm/values.yaml @@ -261,4 +261,59 @@ datadog: disable_vendor_telemetry: true # service environment tag - service_env: development \ No newline at end of file + service_env: development + +# Garbage collector configuration +garbageCollector: + + # Enable garbage collector CronJob + enabled: false + + # Image configuration for garbage collector + image: + # Repository to pull the image from + # Note: This image should contain the kubectl binary to allow the garbage collector to delete old BackfillRequest resources + # By default it is set to snd-cli-go, which is a lightweight image containing the kubectl binary and the SND CLI + # tool, but it can be overridden to use a custom image if needed + repository: "public.ecr.aws/ecco-sneaks-and-data/snd-cli-go" + + # Tag to pull + tag: "1.3.4" + + # Image pull policy + pullPolicy: "IfNotPresent" + + # Cron schedule for the garbage collector (e.g., "0 2 * * *" for daily at 2 AM) + schedule: "0 2 * * *" + + # Number of successful finished jobs to retain + successfulJobsHistoryLimit: 3 + + # Number of failed finished jobs to retain + failedJobsHistoryLimit: 1 + + # Number of retries before considering a job as failed + backoffLimit: 3 + + # Restart policy for the job (OnFailure, Never) + restartPolicy: "OnFailure" + + # Maximum length of the BackfillRequest deletion history + historyLimit: 300 + + # Resource constraints for the garbage collector job + resources: {} + # Example: + # + # requests: + # cpu: 100m + # memory: 128Mi + # limits: + # cpu: 500m + # memory: 512Mi + + # Node labels for pod assignment + tolerations: { } + + # Node labels for pod assignment + affinity: { }