diff --git a/jsonnet/kube-prometheus/kube-prometheus.libsonnet b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
index 58392cc018a58d2472375c1e1574a7e74a21d4ba..d5811aef43520c26b76fa09ee90f6dc0753bc88a 100644
--- a/jsonnet/kube-prometheus/kube-prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
@@ -5,16 +5,15 @@ local blackboxExporter = import './blackbox-exporter/blackbox-exporter.libsonnet
 local kubeStateMetrics = import './kube-state-metrics/kube-state-metrics.libsonnet';
 local nodeExporter = import './node-exporter/node-exporter.libsonnet';
 local prometheusAdapter = import './prometheus-adapter/prometheus-adapter.libsonnet';
+local prometheus = import './prometheus/prometheus.libsonnet';
 
 local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
 
 (import 'github.com/brancz/kubernetes-grafana/grafana/grafana.libsonnet') +
 (import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet') +
-(import './prometheus/prometheus.libsonnet') +
-
 {
   alertmanager: alertmanager({
-    name: 'main',
+    name: $._config.alertmanagerName,
     namespace: $._config.namespace,
     version: '0.21.0',
     image: 'quay.io/prometheus/alertmanager:v0.21.0',
@@ -34,6 +33,14 @@ local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
     version: '1.0.1',
     image: 'quay.io/prometheus/node-exporter:v1.0.1',
   }),
+  prometheus: prometheus({
+    namespace: $._config.namespace,
+    version: '2.24.0',
+    image: 'quay.io/prometheus/prometheus:v2.24.0',
+    name: $._config.prometheusName,
+    alertmanagerName: $._config.alertmanagerName,
+    rules: $.allRules,
+  }),
   prometheusAdapter: prometheusAdapter({
     namespace: $._config.namespace,
     version: '0.8.2',
@@ -42,9 +49,24 @@ local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
   }),
   mixins+:: monitoringMixins({
     namespace: $._config.namespace,
-    alertmanagerName: 'main',
-    prometheusName: 'k8s',
+    alertmanagerName: $._config.alertmanagerName,
+    prometheusName: $._config.prometheusName,
   }),
+
+  // FIXME(paulfantom) Remove this variable by moving each mixin to its own component
+  // Example: node_exporter mixin could be added in ./node-exporter/node-exporter.libsonnet
+  allRules::
+    $.mixins.nodeExporter.prometheusRules +
+    $.mixins.kubernetes.prometheusRules +
+    $.mixins.base.prometheusRules +
+    $.mixins.kubeStateMetrics.prometheusAlerts +
+    $.mixins.nodeExporter.prometheusAlerts +
+    $.mixins.alertmanager.prometheusAlerts +
+    $.mixins.prometheusOperator.prometheusAlerts +
+    $.mixins.kubernetes.prometheusAlerts +
+    $.mixins.prometheus.prometheusAlerts +
+    $.mixins.base.prometheusAlerts,
+
   kubePrometheus+:: {
     namespace: {
       apiVersion: 'v1',
@@ -143,6 +165,8 @@ local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
 } + {
   _config+:: {
     namespace: 'default',
+    prometheusName: 'k8s',
+    alertmanagerName: 'main',
 
     versions+:: { grafana: '7.3.5', kubeRbacProxy: 'v0.8.0' },
     imageRepos+:: { kubeRbacProxy: 'quay.io/brancz/kube-rbac-proxy' },
@@ -187,24 +211,6 @@ local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
       },
     },
 
-    local allRules =
-      $.mixins.nodeExporter.prometheusRules +
-      $.mixins.kubernetes.prometheusRules +
-      $.mixins.base.prometheusRules +
-      $.mixins.kubeStateMetrics.prometheusAlerts +
-      $.mixins.nodeExporter.prometheusAlerts +
-      $.mixins.alertmanager.prometheusAlerts +
-      $.mixins.prometheusOperator.prometheusAlerts +
-      $.mixins.kubernetes.prometheusAlerts +
-      $.mixins.prometheus.prometheusAlerts +
-      $.mixins.base.prometheusAlerts,
-
-    local allDashboards =
-      $.mixins.nodeExporter.grafanaDashboards +
-      $.mixins.kubernetes.grafanaDashboards +
-      $.mixins.prometheus.grafanaDashboards,
-
-    prometheus+:: { rules: allRules },
     grafana+:: {
       labels: {
         'app.kubernetes.io/name': 'grafana',
@@ -212,7 +218,12 @@ local monitoringMixins = import './mixins/monitoring-mixins.libsonnet';
         'app.kubernetes.io/component': 'grafana',
         'app.kubernetes.io/part-of': 'kube-prometheus',
       },
-      dashboards: allDashboards,
+      // FIXME(paulfantom): Same as with rules and alerts.
+      // This should be gathering all dashboards from components without having to enumerate all dashboards.
+      dashboards:
+        $.mixins.nodeExporter.grafanaDashboards +
+        $.mixins.kubernetes.grafanaDashboards +
+        $.mixins.prometheus.grafanaDashboards,
     },
   },
 }
diff --git a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
index fc99add3a95bd86b739c8824367a101b9ababbaa..e1b669234753844869bf538dcefdf4be17d1a464 100644
--- a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
@@ -1,488 +1,484 @@
 local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabelings.libsonnet';
 
-{
-  _config+:: {
-    namespace: 'default',
-
-    versions+:: { prometheus: 'v2.22.1' },
-    imageRepos+:: { prometheus: 'quay.io/prometheus/prometheus' },
-    alertmanager+:: { name: 'main' },
+local defaults = {
+  local defaults = self,
+  namespace: error 'must provide namespace',
+  version: error 'must provide version',
+  image: error 'must provide image',
+  resources: {
+    requests: { memory: '400Mi' },
+  },
 
-    prometheus+:: {
-      name: 'k8s',
-      replicas: 2,
-      rules: {},
-      namespaces: ['default', 'kube-system', $._config.namespace],
-      labels: {
-        'app.kubernetes.io/name': 'prometheus',
-        'app.kubernetes.io/version': $._config.versions.prometheus,
-        'app.kubernetes.io/component': 'prometheus',
-        'app.kubernetes.io/part-of': 'kube-prometheus',
-      },
-      selectorLabels: {
-        [labelName]: $._config.prometheus.labels[labelName]
-        for labelName in std.objectFields($._config.prometheus.labels)
-        if !std.setMember(labelName, ['app.kubernetes.io/version'])
-      },
-    },
+  name: error 'must provide name',
+  alertmanagerName: error 'must provide alertmanagerName',
+  namespaces: ['default', 'kube-system', defaults.namespace],
+  replicas: 2,
+  rules: {
+    groups: [],
+  },
+  commonLabels:: {
+    'app.kubernetes.io/name': 'prometheus',
+    'app.kubernetes.io/version': defaults.version,
+    'app.kubernetes.io/component': 'prometheus',
+    'app.kubernetes.io/part-of': 'kube-prometheus',
   },
+  selectorLabels:: {
+    [labelName]: defaults.commonLabels[labelName]
+    for labelName in std.objectFields(defaults.commonLabels)
+    if !std.setMember(labelName, ['app.kubernetes.io/version'])
+  } + { prometheus: defaults.name },
+};
 
-  prometheus+:: {
-    local p = self,
 
-    name:: $._config.prometheus.name,
-    namespace:: $._config.namespace,
-    roleBindingNamespaces:: $._config.prometheus.namespaces,
-    replicas:: $._config.prometheus.replicas,
-    prometheusRules:: $._config.prometheus.rules,
-    alertmanagerName:: $.alertmanager.service.metadata.name,
+function(params) {
+  local p = self,
+  config:: defaults + params,
+  // Safety check
+  assert std.isObject(p.config.resources),
 
-    serviceAccount: {
-      apiVersion: 'v1',
-      kind: 'ServiceAccount',
-      metadata: {
-        name: 'prometheus-' + p.name,
-        namespace: p.namespace,
-        labels: $._config.prometheus.labels,
-      },
-    },
-
-    service: {
-      apiVersion: 'v1',
-      kind: 'Service',
-      metadata: {
-        name: 'prometheus-' + p.name,
-        namespace: p.namespace,
-        labels: { prometheus: p.name } + $._config.prometheus.labels,
-      },
-      spec: {
-        ports: [
-          { name: 'web', targetPort: 'web', port: 9090 },
-        ],
-        selector: { app: 'prometheus', prometheus: p.name } + $._config.prometheus.selectorLabels,
-        sessionAffinity: 'ClientIP',
-      },
+  serviceAccount: {
+    apiVersion: 'v1',
+    kind: 'ServiceAccount',
+    metadata: {
+      name: 'prometheus-' + p.config.name,
+      namespace: p.config.namespace,
+      labels: p.config.commonLabels,
     },
+  },
 
-    rules: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'PrometheusRule',
-      metadata: {
-        labels: {
-          prometheus: p.name,
-          role: 'alert-rules',
-        } + $._config.prometheus.labels,
-        name: 'prometheus-' + p.name + '-rules',
-        namespace: p.namespace,
-      },
-      spec: {
-        groups: p.prometheusRules.groups,
-      },
+  service: {
+    apiVersion: 'v1',
+    kind: 'Service',
+    metadata: {
+      name: 'prometheus-' + p.config.name,
+      namespace: p.config.namespace,
+      labels: { prometheus: p.config.name } + p.config.commonLabels,
     },
-
-    roleBindingSpecificNamespaces:
-      local newSpecificRoleBinding(namespace) = {
-        apiVersion: 'rbac.authorization.k8s.io/v1',
-        kind: 'RoleBinding',
-        metadata: {
-          name: 'prometheus-' + p.name,
-          namespace: namespace,
-          labels: $._config.prometheus.labels,
-        },
-        roleRef: {
-          apiGroup: 'rbac.authorization.k8s.io',
-          kind: 'Role',
-          name: 'prometheus-' + p.name,
-        },
-        subjects: [{
-          kind: 'ServiceAccount',
-          name: 'prometheus-' + p.name,
-          namespace: p.namespace,
-        }],
-      };
-      {
-        apiVersion: 'rbac.authorization.k8s.io/v1',
-        kind: 'RoleBindingList',
-        items: [newSpecificRoleBinding(x) for x in p.roleBindingNamespaces],
-      },
-
-    clusterRole: {
-      apiVersion: 'rbac.authorization.k8s.io/v1',
-      kind: 'ClusterRole',
-      metadata: {
-        name: 'prometheus-' + p.name,
-        labels: $._config.prometheus.labels,
-      },
-      rules: [
-        {
-          apiGroups: [''],
-          resources: ['nodes/metrics'],
-          verbs: ['get'],
-        },
-        {
-          nonResourceURLs: ['/metrics'],
-          verbs: ['get'],
-        },
+    spec: {
+      ports: [
+        { name: 'web', targetPort: 'web', port: 9090 },
       ],
+      selector: { app: 'prometheus' } + p.config.selectorLabels,
+      sessionAffinity: 'ClientIP',
     },
+  },
 
-    roleConfig: {
-      apiVersion: 'rbac.authorization.k8s.io/v1',
-      kind: 'Role',
-      metadata: {
-        name: 'prometheus-' + p.name + '-config',
-        namespace: p.namespace,
-        labels: $._config.prometheus.labels,
-      },
-      rules: [{
-        apiGroups: [''],
-        resources: ['configmaps'],
-        verbs: ['get'],
-      }],
+  rules: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'PrometheusRule',
+    metadata: {
+      labels: {
+        prometheus: p.config.name,
+        role: 'alert-rules',
+      } + p.config.commonLabels,
+      name: 'prometheus-' + p.config.name + '-rules',
+      namespace: p.config.namespace,
+    },
+    spec: {
+      groups: p.config.rules.groups,
     },
+  },
 
-    roleBindingConfig: {
+  roleBindingSpecificNamespaces:
+    local newSpecificRoleBinding(namespace) = {
       apiVersion: 'rbac.authorization.k8s.io/v1',
       kind: 'RoleBinding',
       metadata: {
-        name: 'prometheus-' + p.name + '-config',
-        namespace: p.namespace,
-        labels: $._config.prometheus.labels,
+        name: 'prometheus-' + p.config.name,
+        namespace: namespace,
+        labels: p.config.commonLabels,
       },
       roleRef: {
         apiGroup: 'rbac.authorization.k8s.io',
         kind: 'Role',
-        name: 'prometheus-' + p.name + '-config',
+        name: 'prometheus-' + p.config.name,
       },
       subjects: [{
         kind: 'ServiceAccount',
-        name: 'prometheus-' + p.name,
-        namespace: p.namespace,
+        name: 'prometheus-' + p.config.name,
+        namespace: p.config.namespace,
       }],
+    };
+    {
+      apiVersion: 'rbac.authorization.k8s.io/v1',
+      kind: 'RoleBindingList',
+      items: [newSpecificRoleBinding(x) for x in p.config.namespaces],
     },
 
-    clusterRoleBinding: {
-      apiVersion: 'rbac.authorization.k8s.io/v1',
-      kind: 'ClusterRoleBinding',
-      metadata: {
-        name: 'prometheus-' + p.name,
-        labels: $._config.prometheus.labels,
+  clusterRole: {
+    apiVersion: 'rbac.authorization.k8s.io/v1',
+    kind: 'ClusterRole',
+    metadata: {
+      name: 'prometheus-' + p.config.name,
+      labels: p.config.commonLabels,
+    },
+    rules: [
+      {
+        apiGroups: [''],
+        resources: ['nodes/metrics'],
+        verbs: ['get'],
       },
-      roleRef: {
-        apiGroup: 'rbac.authorization.k8s.io',
-        kind: 'ClusterRole',
-        name: 'prometheus-' + p.name,
+      {
+        nonResourceURLs: ['/metrics'],
+        verbs: ['get'],
       },
-      subjects: [{
-        kind: 'ServiceAccount',
-        name: 'prometheus-' + p.name,
-        namespace: p.namespace,
-      }],
+    ],
+  },
+
+  roleConfig: {
+    apiVersion: 'rbac.authorization.k8s.io/v1',
+    kind: 'Role',
+    metadata: {
+      name: 'prometheus-' + p.config.name + '-config',
+      namespace: p.config.namespace,
+      labels: p.config.commonLabels,
     },
+    rules: [{
+      apiGroups: [''],
+      resources: ['configmaps'],
+      verbs: ['get'],
+    }],
+  },
 
-    roleSpecificNamespaces:
-      local newSpecificRole(namespace) = {
-        apiVersion: 'rbac.authorization.k8s.io/v1',
-        kind: 'Role',
-        metadata: {
-          name: 'prometheus-' + p.name,
-          namespace: namespace,
-          labels: $._config.prometheus.labels,
-        },
-        rules: [
-          {
-            apiGroups: [''],
-            resources: ['services', 'endpoints', 'pods'],
-            verbs: ['get', 'list', 'watch'],
-          },
-          {
-            apiGroups: ['extensions'],
-            resources: ['ingresses'],
-            verbs: ['get', 'list', 'watch'],
-          },
-        ],
-      };
-      {
-        apiVersion: 'rbac.authorization.k8s.io/v1',
-        kind: 'RoleList',
-        items: [newSpecificRole(x) for x in p.roleBindingNamespaces],
-      },
+  roleBindingConfig: {
+    apiVersion: 'rbac.authorization.k8s.io/v1',
+    kind: 'RoleBinding',
+    metadata: {
+      name: 'prometheus-' + p.config.name + '-config',
+      namespace: p.config.namespace,
+      labels: p.config.commonLabels,
+    },
+    roleRef: {
+      apiGroup: 'rbac.authorization.k8s.io',
+      kind: 'Role',
+      name: 'prometheus-' + p.config.name + '-config',
+    },
+    subjects: [{
+      kind: 'ServiceAccount',
+      name: 'prometheus-' + p.config.name,
+      namespace: p.config.namespace,
+    }],
+  },
 
-    prometheus: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'Prometheus',
+  clusterRoleBinding: {
+    apiVersion: 'rbac.authorization.k8s.io/v1',
+    kind: 'ClusterRoleBinding',
+    metadata: {
+      name: 'prometheus-' + p.config.name,
+      labels: p.config.commonLabels,
+    },
+    roleRef: {
+      apiGroup: 'rbac.authorization.k8s.io',
+      kind: 'ClusterRole',
+      name: 'prometheus-' + p.config.name,
+    },
+    subjects: [{
+      kind: 'ServiceAccount',
+      name: 'prometheus-' + p.config.name,
+      namespace: p.config.namespace,
+    }],
+  },
+
+  roleSpecificNamespaces:
+    local newSpecificRole(namespace) = {
+      apiVersion: 'rbac.authorization.k8s.io/v1',
+      kind: 'Role',
       metadata: {
-        name: p.name,
-        namespace: p.namespace,
-        labels: { prometheus: p.name } + $._config.prometheus.labels,
+        name: 'prometheus-' + p.config.name,
+        namespace: namespace,
+        labels: p.config.commonLabels,
       },
-      spec: {
-        replicas: p.replicas,
-        version: $._config.versions.prometheus,
-        image: $._config.imageRepos.prometheus + ':' + $._config.versions.prometheus,
-        podMetadata: {
-          labels: $._config.prometheus.labels,
-        },
-        serviceAccountName: 'prometheus-' + p.name,
-        serviceMonitorSelector: {},
-        podMonitorSelector: {},
-        probeSelector: {},
-        serviceMonitorNamespaceSelector: {},
-        podMonitorNamespaceSelector: {},
-        probeNamespaceSelector: {},
-        nodeSelector: { 'kubernetes.io/os': 'linux' },
-        ruleSelector: {
-          matchLabels: {
-            role: 'alert-rules',
-            prometheus: p.name,
-          },
-        },
-        resources: {
-          requests: { memory: '400Mi' },
-        },
-        alerting: {
-          alertmanagers: [{
-            namespace: p.namespace,
-            name: p.alertmanagerName,
-            port: 'web',
-          }],
+      rules: [
+        {
+          apiGroups: [''],
+          resources: ['services', 'endpoints', 'pods'],
+          verbs: ['get', 'list', 'watch'],
         },
-        securityContext: {
-          runAsUser: 1000,
-          runAsNonRoot: true,
-          fsGroup: 2000,
+        {
+          apiGroups: ['extensions'],
+          resources: ['ingresses'],
+          verbs: ['get', 'list', 'watch'],
         },
-      },
+      ],
+    };
+    {
+      apiVersion: 'rbac.authorization.k8s.io/v1',
+      kind: 'RoleList',
+      items: [newSpecificRole(x) for x in p.config.namespaces],
     },
 
-    serviceMonitor: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'prometheus',
-        namespace: p.namespace,
-        labels: $._config.prometheus.labels,
+  prometheus: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'Prometheus',
+    metadata: {
+      name: p.config.name,
+      namespace: p.config.namespace,
+      labels: { prometheus: p.config.name } + p.config.commonLabels,
+    },
+    spec: {
+      replicas: p.config.replicas,
+      version: p.config.version,
+      image: p.config.image,
+      podMetadata: {
+        labels: p.config.commonLabels,
       },
-      spec: {
-        selector: {
-          matchLabels: { prometheus: p.name } + $._config.prometheus.selectorLabels,
+      serviceAccountName: 'prometheus-' + p.config.name,
+      serviceMonitorSelector: {},
+      podMonitorSelector: {},
+      probeSelector: {},
+      serviceMonitorNamespaceSelector: {},
+      podMonitorNamespaceSelector: {},
+      probeNamespaceSelector: {},
+      nodeSelector: { 'kubernetes.io/os': 'linux' },
+      ruleSelector: {
+        matchLabels: {
+          role: 'alert-rules',
+          prometheus: p.config.name,
         },
-        endpoints: [{
+      },
+      resources: p.config.resources,
+      alerting: {
+        alertmanagers: [{
+          namespace: p.config.namespace,
+          name: 'alertmanager-' + p.config.alertmanagerName,
           port: 'web',
-          interval: '30s',
         }],
       },
+      securityContext: {
+        runAsUser: 1000,
+        runAsNonRoot: true,
+        fsGroup: 2000,
+      },
     },
+  },
 
-    serviceMonitorKubeScheduler: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'kube-scheduler',
-        namespace: p.namespace,
-        labels: { 'app.kubernetes.io/name': 'kube-scheduler' },
-      },
-      spec: {
-        jobLabel: 'app.kubernetes.io/name',
-        endpoints: [{
-          port: 'https-metrics',
-          interval: '30s',
-          scheme: 'https',
-          bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-          tlsConfig: { insecureSkipVerify: true },
-        }],
-        selector: {
-          matchLabels: { 'app.kubernetes.io/name': 'kube-scheduler' },
-        },
-        namespaceSelector: {
-          matchNames: ['kube-system'],
-        },
+  serviceMonitor: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'prometheus',
+      namespace: p.config.namespace,
+      labels: p.config.commonLabels,
+    },
+    spec: {
+      selector: {
+        matchLabels: p.config.selectorLabels,
       },
+      endpoints: [{
+        port: 'web',
+        interval: '30s',
+      }],
     },
+  },
 
-    serviceMonitorKubelet: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'kubelet',
-        namespace: p.namespace,
-        labels: { 'app.kubernetes.io/name': 'kubelet' },
+  serviceMonitorKubeScheduler: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-scheduler',
+      namespace: p.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'kube-scheduler' },
+    },
+    spec: {
+      jobLabel: 'app.kubernetes.io/name',
+      endpoints: [{
+        port: 'https-metrics',
+        interval: '30s',
+        scheme: 'https',
+        bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+        tlsConfig: { insecureSkipVerify: true },
+      }],
+      selector: {
+        matchLabels: { 'app.kubernetes.io/name': 'kube-scheduler' },
       },
-      spec: {
-        jobLabel: 'k8s-app',
-        endpoints: [
-          {
-            port: 'https-metrics',
-            scheme: 'https',
-            interval: '30s',
-            honorLabels: true,
-            tlsConfig: { insecureSkipVerify: true },
-            bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-            metricRelabelings: relabelings,
-            relabelings: [{
-              sourceLabels: ['__metrics_path__'],
-              targetLabel: 'metrics_path',
-            }],
-          },
-          {
-            port: 'https-metrics',
-            scheme: 'https',
-            path: '/metrics/cadvisor',
-            interval: '30s',
-            honorLabels: true,
-            honorTimestamps: false,
-            tlsConfig: {
-              insecureSkipVerify: true,
-            },
-            bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-            relabelings: [{
-              sourceLabels: ['__metrics_path__'],
-              targetLabel: 'metrics_path',
-            }],
-            metricRelabelings: [
-              // Drop a bunch of metrics which are disabled but still sent, see
-              // https://github.com/google/cadvisor/issues/1925.
-              {
-                sourceLabels: ['__name__'],
-                regex: 'container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s)',
-                action: 'drop',
-              },
-            ],
-          },
-          {
-            port: 'https-metrics',
-            scheme: 'https',
-            path: '/metrics/probes',
-            interval: '30s',
-            honorLabels: true,
-            tlsConfig: { insecureSkipVerify: true },
-            bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-            relabelings: [{
-              sourceLabels: ['__metrics_path__'],
-              targetLabel: 'metrics_path',
-            }],
-          },
-        ],
-        selector: {
-          matchLabels: { 'k8s-app': 'kubelet' },
-        },
-        namespaceSelector: {
-          matchNames: ['kube-system'],
-        },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
       },
     },
+  },
 
-    serviceMonitorKubeControllerManager: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'kube-controller-manager',
-        namespace: p.namespace,
-        labels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
-      },
-      spec: {
-        jobLabel: 'app.kubernetes.io/name',
-        endpoints: [{
+  serviceMonitorKubelet: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kubelet',
+      namespace: p.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'kubelet' },
+    },
+    spec: {
+      jobLabel: 'k8s-app',
+      endpoints: [
+        {
           port: 'https-metrics',
-          interval: '30s',
           scheme: 'https',
+          interval: '30s',
+          honorLabels: true,
+          tlsConfig: { insecureSkipVerify: true },
           bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+          metricRelabelings: relabelings,
+          relabelings: [{
+            sourceLabels: ['__metrics_path__'],
+            targetLabel: 'metrics_path',
+          }],
+        },
+        {
+          port: 'https-metrics',
+          scheme: 'https',
+          path: '/metrics/cadvisor',
+          interval: '30s',
+          honorLabels: true,
+          honorTimestamps: false,
           tlsConfig: {
             insecureSkipVerify: true,
           },
-          metricRelabelings: relabelings + [
+          bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+          relabelings: [{
+            sourceLabels: ['__metrics_path__'],
+            targetLabel: 'metrics_path',
+          }],
+          metricRelabelings: [
+            // Drop a bunch of metrics which are disabled but still sent, see
+            // https://github.com/google/cadvisor/issues/1925.
             {
               sourceLabels: ['__name__'],
-              regex: 'etcd_(debugging|disk|request|server).*',
+              regex: 'container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s)',
               action: 'drop',
             },
           ],
-        }],
-        selector: {
-          matchLabels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
         },
-        namespaceSelector: {
-          matchNames: ['kube-system'],
+        {
+          port: 'https-metrics',
+          scheme: 'https',
+          path: '/metrics/probes',
+          interval: '30s',
+          honorLabels: true,
+          tlsConfig: { insecureSkipVerify: true },
+          bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+          relabelings: [{
+            sourceLabels: ['__metrics_path__'],
+            targetLabel: 'metrics_path',
+          }],
         },
+      ],
+      selector: {
+        matchLabels: { 'k8s-app': 'kubelet' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
       },
     },
+  },
 
-    serviceMonitorApiserver: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'kube-apiserver',
-        namespace: p.namespace,
-        labels: { 'app.kubernetes.io/name': 'apiserver' },
-      },
-      spec: {
-        jobLabel: 'component',
-        selector: {
-          matchLabels: {
-            component: 'apiserver',
-            provider: 'kubernetes',
-          },
-        },
-        namespaceSelector: {
-          matchNames: ['default'],
+  serviceMonitorKubeControllerManager: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-controller-manager',
+      namespace: p.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
+    },
+    spec: {
+      jobLabel: 'app.kubernetes.io/name',
+      endpoints: [{
+        port: 'https-metrics',
+        interval: '30s',
+        scheme: 'https',
+        bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+        tlsConfig: {
+          insecureSkipVerify: true,
         },
-        endpoints: [{
-          port: 'https',
-          interval: '30s',
-          scheme: 'https',
-          tlsConfig: {
-            caFile: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
-            serverName: 'kubernetes',
+        metricRelabelings: relabelings + [
+          {
+            sourceLabels: ['__name__'],
+            regex: 'etcd_(debugging|disk|request|server).*',
+            action: 'drop',
           },
-          bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-          metricRelabelings: relabelings + [
-            {
-              sourceLabels: ['__name__'],
-              regex: 'etcd_(debugging|disk|server).*',
-              action: 'drop',
-            },
-            {
-              sourceLabels: ['__name__'],
-              regex: 'apiserver_admission_controller_admission_latencies_seconds_.*',
-              action: 'drop',
-            },
-            {
-              sourceLabels: ['__name__'],
-              regex: 'apiserver_admission_step_admission_latencies_seconds_.*',
-              action: 'drop',
-            },
-            {
-              sourceLabels: ['__name__', 'le'],
-              regex: 'apiserver_request_duration_seconds_bucket;(0.15|0.25|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2.5|3|3.5|4.5|6|7|8|9|15|25|30|50)',
-              action: 'drop',
-            },
-          ],
-        }],
+        ],
+      }],
+      selector: {
+        matchLabels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
       },
     },
+  },
 
-    serviceMonitorCoreDNS: {
-      apiVersion: 'monitoring.coreos.com/v1',
-      kind: 'ServiceMonitor',
-      metadata: {
-        name: 'coredns',
-        namespace: p.namespace,
-        labels: { 'app.kubernetes.io/name': 'coredns' },
-      },
-      spec: {
-        jobLabel: 'app.kubernetes.io/name',
-        selector: {
-          matchLabels: { 'app.kubernetes.io/name': 'kube-dns' },
+  serviceMonitorApiserver: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-apiserver',
+      namespace: p.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'apiserver' },
+    },
+    spec: {
+      jobLabel: 'component',
+      selector: {
+        matchLabels: {
+          component: 'apiserver',
+          provider: 'kubernetes',
         },
-        namespaceSelector: {
-          matchNames: ['kube-system'],
+      },
+      namespaceSelector: {
+        matchNames: ['default'],
+      },
+      endpoints: [{
+        port: 'https',
+        interval: '30s',
+        scheme: 'https',
+        tlsConfig: {
+          caFile: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
+          serverName: 'kubernetes',
         },
-        endpoints: [{
-          port: 'metrics',
-          interval: '15s',
-          bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-        }],
+        bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+        metricRelabelings: relabelings + [
+          {
+            sourceLabels: ['__name__'],
+            regex: 'etcd_(debugging|disk|server).*',
+            action: 'drop',
+          },
+          {
+            sourceLabels: ['__name__'],
+            regex: 'apiserver_admission_controller_admission_latencies_seconds_.*',
+            action: 'drop',
+          },
+          {
+            sourceLabels: ['__name__'],
+            regex: 'apiserver_admission_step_admission_latencies_seconds_.*',
+            action: 'drop',
+          },
+          {
+            sourceLabels: ['__name__', 'le'],
+            regex: 'apiserver_request_duration_seconds_bucket;(0.15|0.25|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2.5|3|3.5|4.5|6|7|8|9|15|25|30|50)',
+            action: 'drop',
+          },
+        ],
+      }],
+    },
+  },
+
+  serviceMonitorCoreDNS: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'coredns',
+      namespace: p.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'coredns' },
+    },
+    spec: {
+      jobLabel: 'app.kubernetes.io/name',
+      selector: {
+        matchLabels: { 'app.kubernetes.io/name': 'kube-dns' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
       },
+      endpoints: [{
+        port: 'metrics',
+        interval: '15s',
+        bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
+      }],
     },
   },
 }
diff --git a/manifests/prometheus-clusterRole.yaml b/manifests/prometheus-clusterRole.yaml
index b5f080604d703c6cc3129c58cc87c9084c011d81..3ba90defa0dc034cd1c3e1e185ce69c0d15ccd19 100644
--- a/manifests/prometheus-clusterRole.yaml
+++ b/manifests/prometheus-clusterRole.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus-k8s
 rules:
 - apiGroups:
diff --git a/manifests/prometheus-clusterRoleBinding.yaml b/manifests/prometheus-clusterRoleBinding.yaml
index a52cf1e899e6fa618a905d50ada2a19f66a19e1a..edb326984264c1e6b440cc8c6cb986c595ec0e73 100644
--- a/manifests/prometheus-clusterRoleBinding.yaml
+++ b/manifests/prometheus-clusterRoleBinding.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus-k8s
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff --git a/manifests/prometheus-prometheus.yaml b/manifests/prometheus-prometheus.yaml
index 2b7dd14086d501cc7d19e65cc03037dd57555e8d..36fd374f9f5d42b36a2fa2d68383322a7ba53af0 100644
--- a/manifests/prometheus-prometheus.yaml
+++ b/manifests/prometheus-prometheus.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
     prometheus: k8s
   name: k8s
   namespace: monitoring
@@ -15,7 +15,7 @@ spec:
     - name: alertmanager-main
       namespace: monitoring
       port: web
-  image: quay.io/prometheus/prometheus:v2.22.1
+  image: quay.io/prometheus/prometheus:v2.24.0
   nodeSelector:
     kubernetes.io/os: linux
   podMetadata:
@@ -23,7 +23,7 @@ spec:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
   podMonitorNamespaceSelector: {}
   podMonitorSelector: {}
   probeNamespaceSelector: {}
@@ -43,4 +43,4 @@ spec:
   serviceAccountName: prometheus-k8s
   serviceMonitorNamespaceSelector: {}
   serviceMonitorSelector: {}
-  version: v2.22.1
+  version: 2.24.0
diff --git a/manifests/prometheus-roleBindingConfig.yaml b/manifests/prometheus-roleBindingConfig.yaml
index feaf95e58dc0133dbd45efa0be2cdaf19d35f8e2..f0a88d7dd751991080b99d3460fc0739fe2eeeda 100644
--- a/manifests/prometheus-roleBindingConfig.yaml
+++ b/manifests/prometheus-roleBindingConfig.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus-k8s-config
   namespace: monitoring
 roleRef:
diff --git a/manifests/prometheus-roleBindingSpecificNamespaces.yaml b/manifests/prometheus-roleBindingSpecificNamespaces.yaml
index ed2ac384424c21876dadd16709b26b94f36dd83e..d4d922cb64c9ec9378ff1bba8e7f439987784b5f 100644
--- a/manifests/prometheus-roleBindingSpecificNamespaces.yaml
+++ b/manifests/prometheus-roleBindingSpecificNamespaces.yaml
@@ -7,7 +7,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: default
   roleRef:
@@ -25,7 +25,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: kube-system
   roleRef:
@@ -43,7 +43,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: monitoring
   roleRef:
diff --git a/manifests/prometheus-roleConfig.yaml b/manifests/prometheus-roleConfig.yaml
index 2b94cc720d2a302072d0fffe55ad565cfb74c78d..2a7494633244838c51673f1753e2d566ad8f5637 100644
--- a/manifests/prometheus-roleConfig.yaml
+++ b/manifests/prometheus-roleConfig.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus-k8s-config
   namespace: monitoring
 rules:
diff --git a/manifests/prometheus-roleSpecificNamespaces.yaml b/manifests/prometheus-roleSpecificNamespaces.yaml
index b7c962c017dfed986fa8274eb503b42c09d0c6b9..a11ce701cfbf179b5962592f04595a1b9ebfc0be 100644
--- a/manifests/prometheus-roleSpecificNamespaces.yaml
+++ b/manifests/prometheus-roleSpecificNamespaces.yaml
@@ -7,7 +7,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: default
   rules:
@@ -36,7 +36,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: kube-system
   rules:
@@ -65,7 +65,7 @@ items:
       app.kubernetes.io/component: prometheus
       app.kubernetes.io/name: prometheus
       app.kubernetes.io/part-of: kube-prometheus
-      app.kubernetes.io/version: v2.22.1
+      app.kubernetes.io/version: 2.24.0
     name: prometheus-k8s
     namespace: monitoring
   rules:
diff --git a/manifests/prometheus-rules.yaml b/manifests/prometheus-rules.yaml
index cd9c2019e17e4be9455d3596937bd715cd1caaf4..fd56b0aa1b8209f614834704422f52af3f0829e0 100644
--- a/manifests/prometheus-rules.yaml
+++ b/manifests/prometheus-rules.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
     prometheus: k8s
     role: alert-rules
   name: prometheus-k8s-rules
diff --git a/manifests/prometheus-service.yaml b/manifests/prometheus-service.yaml
index ff66c8927636fa1612279cf470a63b66f4954f1c..7ae91474b224498d59cba29a3df0cd0c5b925eb4 100644
--- a/manifests/prometheus-service.yaml
+++ b/manifests/prometheus-service.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
     prometheus: k8s
   name: prometheus-k8s
   namespace: monitoring
diff --git a/manifests/prometheus-serviceAccount.yaml b/manifests/prometheus-serviceAccount.yaml
index a4157e78d8ed714366209137e9c91e4622b5a706..283b0821c633b3c8fa198da4095a4edc2728f423 100644
--- a/manifests/prometheus-serviceAccount.yaml
+++ b/manifests/prometheus-serviceAccount.yaml
@@ -5,6 +5,6 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus-k8s
   namespace: monitoring
diff --git a/manifests/prometheus-serviceMonitor.yaml b/manifests/prometheus-serviceMonitor.yaml
index 38622d374635f1426605283b7c372f44bab3376b..a36e394176e2078ae85a8b3bc125360bb8d0e7a7 100644
--- a/manifests/prometheus-serviceMonitor.yaml
+++ b/manifests/prometheus-serviceMonitor.yaml
@@ -5,7 +5,7 @@ metadata:
     app.kubernetes.io/component: prometheus
     app.kubernetes.io/name: prometheus
     app.kubernetes.io/part-of: kube-prometheus
-    app.kubernetes.io/version: v2.22.1
+    app.kubernetes.io/version: 2.24.0
   name: prometheus
   namespace: monitoring
 spec: