From d4272c0c1f68ebf5b1965b87c8a8b7c75293682a Mon Sep 17 00:00:00 2001
From: Guillermo Facundo Colunga <guillermo.facundo.colunga@cern.ch>
Date: Tue, 1 Oct 2024 15:23:56 +0200
Subject: [PATCH] [MONIT-4003] metrics: add default node selector option

This chart includes some components that are composed of a single pod, like:
prometheus and fluentbit to collect and forward metrics or kube state to
expose internal kubernetes api metrics.

This commit adds a new configuration field (merics.defaultNodeSelector) that
allows to set a common nodeSelector for all those components. In case that
any of those components adds a nodeSelector that one will have more priority.

Signed-off-by: Guillermo Facundo Colunga <guillermo.facundo.colunga@cern.ch>
---
 README.md                                     |  1 +
 templates/fluentbit-metrics/statefulset.yaml  | 11 +++++++++--
 templates/kube_state/deployment.yaml          |  8 +++++++-
 templates/prometheus/prometheus.yaml          | 13 ++++++++++---
 templates/prometheus_operator/deployment.yaml | 10 ++++++++--
 values.yaml                                   |  8 +++++++-
 6 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/README.md b/README.md
index 5066b02..33eff95 100644
--- a/README.md
+++ b/README.md
@@ -37,6 +37,7 @@ At `docs/installation_guide.md` you will find the initial setup and installation
 | logs.fluentbit.scrapeInterval | string | `"15s"` | interval used by the local prometheus (if installed) to scrape metrics from logs fluentbits |
 | logs.fluentbit.service | string | Daemon mode off listening on port 2020. See `values.yaml`. | fluentbit service configuration options in a multiline string |
 | metrics.enabled | bool | `true` | indicates if all metrics components should be enabled or not. If set to false no metrics component will be installed nor configured |
+| metrics.defaultNodeSelector | map | `{}` | if set will be used as `nodeSelector` for those components that allow one |
 | metrics.fluentbit.enable | bool | `true` | if true fluentbit daemon set will be installed |
 | metrics.fluentbit.nodeSelector | hash | `"nil"` | fluentbit statefulset node selectors |
 | metrics.fluentbit.filters | string | `"nil"` | fluentbit filters as a yaml list in a multiline string |
diff --git a/templates/fluentbit-metrics/statefulset.yaml b/templates/fluentbit-metrics/statefulset.yaml
index ef74671..393fb6d 100644
--- a/templates/fluentbit-metrics/statefulset.yaml
+++ b/templates/fluentbit-metrics/statefulset.yaml
@@ -36,10 +36,17 @@ spec:
           {{- if .Values.metrics.fluentbit.extraVolumeMounts }}
             {{- toYaml .Values.metrics.fluentbit.extraVolumeMounts | nindent 6 }}
           {{- end }}
-      {{- with .Values.metrics.fluentbit.nodeSelector }}
+      {{- with .Values.metrics.defaultNodeSelector }}
       nodeSelector:
+        {{- if .Values.metrics.fluentbit.nodeSelector }}
+        {{- with .Values.metrics.fluentbit.nodeSelector }}
         {{- toYaml . | nindent 8 }}
-      {{- end }}      
+        {{- end }}
+        {{- else }}
+        {{- with .Values.metrics.defaultNodeSelector }}
+        {{- toYaml . | nindent 8 }}
+        {{- end }}
+        {{- end }}
       volumes:
         - name: config
           configMap: 
diff --git a/templates/kube_state/deployment.yaml b/templates/kube_state/deployment.yaml
index f23cba5..d25faa9 100644
--- a/templates/kube_state/deployment.yaml
+++ b/templates/kube_state/deployment.yaml
@@ -49,8 +49,14 @@ spec:
             type: RuntimeDefault
       nodeSelector:
         kubernetes.io/os: linux
+      {{- if .Values.metrics.kubeState.nodeSelector }}
       {{- with .Values.metrics.kubeState.nodeSelector }}
         {{- toYaml . | nindent 8 }}
-      {{- end }} 
+      {{- end }}
+      {{- else }}
+      {{- with .Values.metrics.defaultNodeSelector }}
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- end }}
       serviceAccountName: it-monit-metrics-collector-kubestate
 {{- end -}}
diff --git a/templates/prometheus/prometheus.yaml b/templates/prometheus/prometheus.yaml
index b72f99d..3c9aaf4 100644
--- a/templates/prometheus/prometheus.yaml
+++ b/templates/prometheus/prometheus.yaml
@@ -11,10 +11,17 @@ spec:
   retention: {{ .Values.metrics.prometheus.server.retention }}
   externalLabels:
     k8s_cluster_name: {{ .Values.kubernetes.clusterName }}
-  {{- with .Values.metrics.prometheus.server.nodeSelector }}
+  
   nodeSelector:
-    {{- toYaml . | nindent 6 }}
-  {{- end }} 
+  {{- if .Values.metrics.prometheus.server.nodeSelector }}
+  {{- with .Values.metrics.prometheus.server.nodeSelector }}
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  {{- else }}
+  {{- with .Values.metrics.defaultNodeSelector }}
+    {{- toYaml . | nindent 4 }}
+  {{- end }}
+  {{- end }}
   serviceAccountName: it-monit-metrics-collector-prometheus
   resources:
     requests:
diff --git a/templates/prometheus_operator/deployment.yaml b/templates/prometheus_operator/deployment.yaml
index c19a742..083321b 100644
--- a/templates/prometheus_operator/deployment.yaml
+++ b/templates/prometheus_operator/deployment.yaml
@@ -44,13 +44,19 @@ spec:
           readOnlyRootFilesystem: true
       nodeSelector:
         kubernetes.io/os: linux
+      {{- if .Values.metrics.prometheus.operator.nodeSelector}}
       {{- with .Values.metrics.prometheus.operator.nodeSelector }}
         {{- toYaml . | nindent 8 }}
-      {{- end }} 
+      {{- end }}
+      {{- else }}
+      {{- with .Values.metrics.defaultNodeSelector }}
+        {{- toYaml . | nindent 8 }}
+      {{- end }}
+      {{- end }}
       securityContext:
         runAsNonRoot: true
         runAsUser: 65534
         seccompProfile:
           type: RuntimeDefault
       serviceAccountName: it-monit-metrics-operator-prometheus
-{{- end -}}
+{{- end -}}
\ No newline at end of file
diff --git a/values.yaml b/values.yaml
index d2e33ec..f6d0a62 100644
--- a/values.yaml
+++ b/values.yaml
@@ -24,6 +24,9 @@ metrics:
   # -- indicates if all metrics components should be enabled or not. If set to false no metrics component will be installed nor configured
   enabled: true
 
+  # -- the default node selector will be applied when possible. In to the following components: metrics collectors (prometheus and fluentbit), metrics exporters (kube state).
+  defaultNodeSelector: {}
+
   # Node exporter is used to scrape node resources metrics like cpu, memory
   # or network.
   nodeExporter:
@@ -40,7 +43,7 @@ metrics:
         memory: "25Mi"
 
   # Kube state is used to scrape metrics from kubernetes api, like limits
-  # and resources.
+  # and resources. If set it will override the metrics.defaultNodeSelector.
   kubeState:
     nodeSelector: {}
     # -- if true kube state will be installed together with a service monitor
@@ -62,6 +65,7 @@ metrics:
     enabled: true
     # -- specific configuration for the prometheus operator
     operator:
+      # If set it will override the metrics.defaultNodeSelector.
       nodeSelector: {}
       resources:
         requests:
@@ -71,6 +75,7 @@ metrics:
           cpu: "100m"
           memory: "100Mi"
     server:
+      # If set it will override the metrics.defaultNodeSelector.
       nodeSelector: {}
       # -- prometheus version to use by the local cluster prometheus
       version: "v2.50.0"
@@ -118,6 +123,7 @@ metrics:
   fluentbit:
     # -- if true fluentbit metrics forwarder will be installed
     enabled: true
+    # If set it will override the metrics.defaultNodeSelector.
     nodeSelector: {}
     resources:
       requests:
-- 
GitLab