Kube-prometheus: how to override nodeSelector?

Created on 12 Sep 2019  路  4Comments  路  Source: prometheus-operator/kube-prometheus

When compiling the manifests using jb, I would like to set a NodeSelector within the prometheus-operator, prometheus, grafana and alertmanager pods. Is there a documented way to do this?

Apologies if this is something I missed in the docs. I'm a jsonnet newb.

Most helpful comment

Here's an example that overwrites the nodeSelector for Prometheus, node-exporter and kube-state-metrics:

diff --git example.jsonnet example.jsonnet
index 7002eff..bd4bd6f 100644
--- example.jsonnet
+++ example.jsonnet
@@ -1,22 +1,47 @@
+local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet';
+
 local kp =
   (import 'kube-prometheus/kube-prometheus.libsonnet') +
   // Uncomment the following imports to enable its patches
   // (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') +
   {
     _config+:: {
       namespace: 'monitoring',
     },
+
+    // As Prometheus is a Custom Resource, we need to use that object's way of overwriting the nodeSelector
+    prometheus+:: {
+      prometheus+: {
+        spec+: {
+          nodeSelector: { 'kubernetes.io/os': 'my-other-operatingsystem' },
+        },
+      },
+    },
+
+    nodeExporter+:: {
+      local daemonset = k.apps.v1.daemonSet,
+
+      daemonset+:
+        daemonset.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'my-other-operatingsystem' }),
+    },
+
+    kubeStateMetrics+:: {
+      local deployment = k.apps.v1.deployment,
+
+      deployment+:
+        deployment.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'my-other-operatingsystem' }),
+    },
   };

 { ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
 { ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
 { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
 { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
 { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
 { ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
 { ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
 { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }

All 4 comments

Here's an example that overwrites the nodeSelector for Prometheus, node-exporter and kube-state-metrics:

diff --git example.jsonnet example.jsonnet
index 7002eff..bd4bd6f 100644
--- example.jsonnet
+++ example.jsonnet
@@ -1,22 +1,47 @@
+local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet';
+
 local kp =
   (import 'kube-prometheus/kube-prometheus.libsonnet') +
   // Uncomment the following imports to enable its patches
   // (import 'kube-prometheus/kube-prometheus-anti-affinity.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-managed-cluster.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-node-ports.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-static-etcd.libsonnet') +
   // (import 'kube-prometheus/kube-prometheus-thanos-sidecar.libsonnet') +
   {
     _config+:: {
       namespace: 'monitoring',
     },
+
+    // As Prometheus is a Custom Resource, we need to use that object's way of overwriting the nodeSelector
+    prometheus+:: {
+      prometheus+: {
+        spec+: {
+          nodeSelector: { 'kubernetes.io/os': 'my-other-operatingsystem' },
+        },
+      },
+    },
+
+    nodeExporter+:: {
+      local daemonset = k.apps.v1.daemonSet,
+
+      daemonset+:
+        daemonset.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'my-other-operatingsystem' }),
+    },
+
+    kubeStateMetrics+:: {
+      local deployment = k.apps.v1.deployment,
+
+      deployment+:
+        deployment.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'my-other-operatingsystem' }),
+    },
   };

 { ['00namespace-' + name]: kp.kubePrometheus[name] for name in std.objectFields(kp.kubePrometheus) } +
 { ['0prometheus-operator-' + name]: kp.prometheusOperator[name] for name in std.objectFields(kp.prometheusOperator) } +
 { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
 { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
 { ['alertmanager-' + name]: kp.alertmanager[name] for name in std.objectFields(kp.alertmanager) } +
 { ['prometheus-' + name]: kp.prometheus[name] for name in std.objectFields(kp.prometheus) } +
 { ['prometheus-adapter-' + name]: kp.prometheusAdapter[name] for name in std.objectFields(kp.prometheusAdapter) } +
 { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }

@metalmatze do you happen to have an example for how to do this for alertmanager? I stumbled around but couldn't get it to work.

@ryangilbert this worked for me:

    alertmanager+:: {
      alertmanager+: {
        spec+: {
          nodeSelector: { 'beta.kubernetes.io/os': 'linux' },
        },
      },
    },

Closing due to staleness. Please reopen if you think this is still relevant.

Was this page helpful?
0 / 5 - 0 ratings