diff --git a/README.md b/README.md
index dfaea1062cb26bda422325057d1235ee2636c47e..592a0d35ed41fad3fdda9264f9fa945ab8e3e24e 100644
--- a/README.md
+++ b/README.md
@@ -243,7 +243,7 @@ local kp =
 { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
 { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
 { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
-{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
+{ ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) }
 { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
 { ['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) }
@@ -586,7 +586,7 @@ In the above example the configuration has been inlined, but can just as well be
 [embedmd]:# (examples/alertmanager-config-external.jsonnet)
 ```jsonnet
 ((import 'kube-prometheus/main.libsonnet') + {
-   _config+:: {
+   values+:: {
      alertmanager+: {
        config: importstr 'alertmanager-config.yaml',
      },
@@ -606,7 +606,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
 
-    prometheus+:: {
+    prometheus+: {
       namespaces+: ['my-namespace', 'my-second-namespace'],
     },
   },
@@ -640,7 +640,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespaces+: ['my-namespace', 'my-second-namespace'],
     },
   },
-  prometheus+: {
+  exampleApplication: {
     serviceMonitorMyNamespace: {
       apiVersion: 'monitoring.coreos.com/v1',
       kind: 'ServiceMonitor',
@@ -672,7 +672,8 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) } +
-{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
 ```
 
 > NOTE: make sure your service resources have the right labels (eg. `'app': 'myapp'`) applied. Prometheus uses kubernetes labels to discover resources inside the namespaces.
diff --git a/docs/EKS-cni-support.md b/docs/EKS-cni-support.md
index 4cb36bc975ea9b4351a403eb34f9fb8233ac219b..266d5fcbab1e7402765c8b4f142283b6ba25ca1c 100644
--- a/docs/EKS-cni-support.md
+++ b/docs/EKS-cni-support.md
@@ -14,7 +14,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') +
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
+  kubernetesControlPlane+: {
     prometheusRuleEksCNI+: {
       spec+: {
         groups+: [
diff --git a/docs/developing-prometheus-rules-and-grafana-dashboards.md b/docs/developing-prometheus-rules-and-grafana-dashboards.md
index 59447941982c00d799f0a7f1ae9f8f7ffc147747..814ccf88815e1f257800bedcdc33fd780550ffee 100644
--- a/docs/developing-prometheus-rules-and-grafana-dashboards.md
+++ b/docs/developing-prometheus-rules-and-grafana-dashboards.md
@@ -41,7 +41,7 @@ local kp =
 { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
 { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
 { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
-{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
+{ ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) }
 { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
 { ['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) }
@@ -65,10 +65,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: [
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: [
           {
             name: 'example-group',
             rules: [
@@ -97,7 +103,8 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
 ```
 
 ### Recording rules
@@ -114,10 +121,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: [
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: [
           {
             name: 'example-group',
             rules: [
@@ -140,7 +153,8 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
 ```
 
 ### Pre-rendered rules
@@ -167,10 +181,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: (import 'existingrule.json').groups,
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: (import 'existingrule.json').groups,
       },
     },
   },
@@ -183,7 +203,8 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
 ```
 ### Changing default rules
 
diff --git a/docs/weave-net-support.md b/docs/weave-net-support.md
index 8766bfc8388bf77e8ad5d6813895286166028621..e8c2dfce4109a155fefaa254251a9ccc9149a684 100644
--- a/docs/weave-net-support.md
+++ b/docs/weave-net-support.md
@@ -24,7 +24,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') +
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
+  kubernetesControlPlane+: {
     prometheusRuleWeaveNet+: {
       spec+: {
         groups: std.map(
diff --git a/example.jsonnet b/example.jsonnet
index 2568be96826783214cb50e4903e2c6895ee69575..00737df14a98c1fe594a450cabebe9fbee9eddfa 100644
--- a/example.jsonnet
+++ b/example.jsonnet
@@ -29,7 +29,7 @@ local kp =
 { ['blackbox-exporter-' + name]: kp.blackboxExporter[name] for name in std.objectFields(kp.blackboxExporter) } +
 { ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
 { ['kube-state-metrics-' + name]: kp.kubeStateMetrics[name] for name in std.objectFields(kp.kubeStateMetrics) } +
-{ ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) }
+{ ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) }
 { ['node-exporter-' + name]: kp.nodeExporter[name] for name in std.objectFields(kp.nodeExporter) } +
 { ['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) }
diff --git a/examples/additional-namespaces-servicemonitor.jsonnet b/examples/additional-namespaces-servicemonitor.jsonnet
index 6cfe37dbd337aa85815e0660a09d0cb6e964ce8e..ec978da7806e058fab93070d2547f558893798dd 100644
--- a/examples/additional-namespaces-servicemonitor.jsonnet
+++ b/examples/additional-namespaces-servicemonitor.jsonnet
@@ -7,7 +7,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespaces+: ['my-namespace', 'my-second-namespace'],
     },
   },
-  prometheus+: {
+  exampleApplication: {
     serviceMonitorMyNamespace: {
       apiVersion: 'monitoring.coreos.com/v1',
       kind: 'ServiceMonitor',
@@ -39,4 +39,5 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) } +
-{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
diff --git a/examples/additional-namespaces.jsonnet b/examples/additional-namespaces.jsonnet
index 85cae475e97f772c11e77e488ea4d6f2b455b848..45c606a6022487ca5076a11a9342a07f8220eb85 100644
--- a/examples/additional-namespaces.jsonnet
+++ b/examples/additional-namespaces.jsonnet
@@ -4,7 +4,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
 
-    prometheus+:: {
+    prometheus+: {
       namespaces+: ['my-namespace', 'my-second-namespace'],
     },
   },
diff --git a/examples/alertmanager-config-external.jsonnet b/examples/alertmanager-config-external.jsonnet
index 5d96d23dec49fc7918f0ddc10f6d13d03cc8ecc7..49f6b558dd87e9ecf843e636aec878efe8ead8ad 100644
--- a/examples/alertmanager-config-external.jsonnet
+++ b/examples/alertmanager-config-external.jsonnet
@@ -1,5 +1,5 @@
 ((import 'kube-prometheus/main.libsonnet') + {
-   _config+:: {
+   values+:: {
      alertmanager+: {
        config: importstr 'alertmanager-config.yaml',
      },
diff --git a/examples/eks-cni-example.jsonnet b/examples/eks-cni-example.jsonnet
index 77fa5d0bed42b5d564a3eb47b5bdd8a75b155d71..c92236fe4810a5cbd343e40dd94652cd4209ba1f 100644
--- a/examples/eks-cni-example.jsonnet
+++ b/examples/eks-cni-example.jsonnet
@@ -5,7 +5,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') +
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
+  kubernetesControlPlane+: {
     prometheusRuleEksCNI+: {
       spec+: {
         groups+: [
diff --git a/examples/etcd.jsonnet b/examples/etcd.jsonnet
index e494b6ad20ffe94f5713b2b49f43b9d0911be864..7126ee314b330a418790056ca1b2ed5453c92193 100644
--- a/examples/etcd.jsonnet
+++ b/examples/etcd.jsonnet
@@ -6,7 +6,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') +
     },
 
     // Reference info: https://github.com/coreos/kube-prometheus/blob/master/README.md#static-etcd-configuration
-    etcd+:: {
+    etcd+: {
       // Configure this to be the IP(s) to scrape - i.e. your etcd node(s) (use commas to separate multiple values).
       ips: ['127.0.0.1'],
 
diff --git a/examples/kustomize.jsonnet b/examples/kustomize.jsonnet
index ab548b05f37088b364ccdc5f022ac1304cd24052..455b38bd77eb1ef1a912801cc8cc3cdb1ff2cb6b 100644
--- a/examples/kustomize.jsonnet
+++ b/examples/kustomize.jsonnet
@@ -26,7 +26,7 @@ local manifests =
   { ['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) } +
-  { ['kubernetes-' + name]: kp.kubernetesMixin[name] for name in std.objectFields(kp.kubernetesMixin) };
+  { ['kubernetes-' + name]: kp.kubernetesControlPlane[name] for name in std.objectFields(kp.kubernetesControlPlane) };
 
 local kustomizationResourceFile(name) = './manifests/' + name + '.yaml';
 local kustomization = {
diff --git a/examples/minikube.jsonnet b/examples/minikube.jsonnet
index dd2f77b42dc9987f48ee8b44c89c4d1f0fdcf0be..87b88d6963625c5c5a03fb2304f4de217e418cff 100644
--- a/examples/minikube.jsonnet
+++ b/examples/minikube.jsonnet
@@ -8,10 +8,10 @@ local kp =
       common+: {
         namespace: 'monitoring',
       },
-      alertmanager+:: {
+      alertmanager+: {
         config: importstr 'alertmanager-config.yaml',
       },
-      grafana+:: {
+      grafana+: {
         config: {  // http://docs.grafana.org/installation/configuration/
           sections: {
             // Do not require grafana users to login/authenticate
@@ -40,7 +40,7 @@ local kp =
         },
       },
     },
-    alertmanager+:: {
+    alertmanager+: {
       alertmanager+: {
         // Reference info: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#alertmanagerspec
         spec+: {
diff --git a/examples/prometheus-additional-alert-rule-example.jsonnet b/examples/prometheus-additional-alert-rule-example.jsonnet
index 63ec2ea740944ba0f8f6526a54e583067d8c3a51..483b9cb1f656411909d0672a5077817f1018ec5a 100644
--- a/examples/prometheus-additional-alert-rule-example.jsonnet
+++ b/examples/prometheus-additional-alert-rule-example.jsonnet
@@ -4,10 +4,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: [
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: [
           {
             name: 'example-group',
             rules: [
@@ -36,4 +42,5 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
diff --git a/examples/prometheus-additional-recording-rule-example.jsonnet b/examples/prometheus-additional-recording-rule-example.jsonnet
index c2abc4d39c9b669b2deba19518cce8e59ae2fc1c..5e67b03f018e95b2afad9a2f0e40ef62af4e3d99 100644
--- a/examples/prometheus-additional-recording-rule-example.jsonnet
+++ b/examples/prometheus-additional-recording-rule-example.jsonnet
@@ -4,10 +4,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: [
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: [
           {
             name: 'example-group',
             rules: [
@@ -30,4 +36,5 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
diff --git a/examples/prometheus-additional-rendered-rule-example.jsonnet b/examples/prometheus-additional-rendered-rule-example.jsonnet
index 296768512d59e88cbee858833a52e7425cc5b5e1..66c7937c15bdbdc12cf4106fb594aee8431877c3 100644
--- a/examples/prometheus-additional-rendered-rule-example.jsonnet
+++ b/examples/prometheus-additional-rendered-rule-example.jsonnet
@@ -4,10 +4,16 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
-    prometheusRule+: {
-      spec+: {
-        groups+: (import 'existingrule.json').groups,
+  exampleApplication: {
+    prometheusRuleExample: {
+      apiVersion: 'monitoring.coreos.com/v1',
+      kind: 'PrometheusRule',
+      metadata: {
+        name: 'my-prometheus-rule',
+        namespace: $.values.common.namespace,
+      },
+      spec: {
+        groups: (import 'existingrule.json').groups,
       },
     },
   },
@@ -20,4 +26,5 @@ local kp = (import 'kube-prometheus/main.libsonnet') + {
 { ['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) }
+{ ['grafana-' + name]: kp.grafana[name] for name in std.objectFields(kp.grafana) } +
+{ ['example-application-' + name]: kp.exampleApplication[name] for name in std.objectFields(kp.exampleApplication) }
diff --git a/examples/weave-net-example.jsonnet b/examples/weave-net-example.jsonnet
index a7eca242c2402e53190d6d8906ed87785c519480..eeeb622df0ed30eab3a985f5302f1aa588b7f317 100644
--- a/examples/weave-net-example.jsonnet
+++ b/examples/weave-net-example.jsonnet
@@ -5,7 +5,7 @@ local kp = (import 'kube-prometheus/main.libsonnet') +
       namespace: 'monitoring',
     },
   },
-  prometheus+: {
+  kubernetesControlPlane+: {
     prometheusRuleWeaveNet+: {
       spec+: {
         groups: std.map(
diff --git a/jsonnet/kube-prometheus/components/k8s-control-plane.libsonnet b/jsonnet/kube-prometheus/components/k8s-control-plane.libsonnet
new file mode 100644
index 0000000000000000000000000000000000000000..dd2282db59c31cd8aa330241e3a6b63ace72875e
--- /dev/null
+++ b/jsonnet/kube-prometheus/components/k8s-control-plane.libsonnet
@@ -0,0 +1,262 @@
+local relabelings = import '../addons/dropping-deprecated-metrics-relabelings.libsonnet';
+
+local defaults = {
+  namespace: error 'must provide namespace',
+  commonLabels:: {
+    'app.kubernetes.io/name': 'kube-prometheus',
+    'app.kubernetes.io/part-of': 'kube-prometheus',
+  },
+  mixin: {
+    ruleLabels: {},
+    _config: {
+      cadvisorSelector: 'job="kubelet", metrics_path="/metrics/cadvisor"',
+      kubeletSelector: 'job="kubelet", metrics_path="/metrics"',
+      kubeStateMetricsSelector: 'job="kube-state-metrics"',
+      nodeExporterSelector: 'job="node-exporter"',
+      kubeSchedulerSelector: 'job="kube-scheduler"',
+      kubeControllerManagerSelector: 'job="kube-controller-manager"',
+      kubeApiserverSelector: 'job="apiserver"',
+      podLabel: 'pod',
+      runbookURLPattern: 'https://github.com/prometheus-operator/kube-prometheus/wiki/%s',
+      diskDeviceSelector: 'device=~"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+"',
+      hostNetworkInterfaceSelector: 'device!~"veth.+"',
+    },
+  },
+};
+
+function(params) {
+  local k8s = self,
+  config:: defaults + params,
+
+  mixin:: (import 'github.com/kubernetes-monitoring/kubernetes-mixin/mixin.libsonnet') {
+    _config+:: k8s.config.mixin._config,
+  },
+
+  prometheusRule: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'PrometheusRule',
+    metadata: {
+      labels: k8s.config.commonLabels + k8s.config.mixin.ruleLabels,
+      name: 'kubernetes-monitoring-rules',
+      namespace: k8s.config.namespace,
+    },
+    spec: {
+      local r = if std.objectHasAll(k8s.mixin, 'prometheusRules') then k8s.mixin.prometheusRules.groups else {},
+      local a = if std.objectHasAll(k8s.mixin, 'prometheusAlerts') then k8s.mixin.prometheusAlerts.groups else {},
+      groups: a + r,
+    },
+  },
+
+  serviceMonitorKubeScheduler: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-scheduler',
+      namespace: k8s.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' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
+      },
+    },
+  },
+
+  serviceMonitorKubelet: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kubelet',
+      namespace: k8s.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'kubelet' },
+    },
+    spec: {
+      jobLabel: 'app.kubernetes.io/name',
+      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: { 'app.kubernetes.io/name': 'kubelet' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
+      },
+    },
+  },
+
+  serviceMonitorKubeControllerManager: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-controller-manager',
+      namespace: k8s.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,
+        },
+        metricRelabelings: relabelings + [
+          {
+            sourceLabels: ['__name__'],
+            regex: 'etcd_(debugging|disk|request|server).*',
+            action: 'drop',
+          },
+        ],
+      }],
+      selector: {
+        matchLabels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
+      },
+      namespaceSelector: {
+        matchNames: ['kube-system'],
+      },
+    },
+  },
+
+  serviceMonitorApiserver: {
+    apiVersion: 'monitoring.coreos.com/v1',
+    kind: 'ServiceMonitor',
+    metadata: {
+      name: 'kube-apiserver',
+      namespace: k8s.config.namespace,
+      labels: { 'app.kubernetes.io/name': 'apiserver' },
+    },
+    spec: {
+      jobLabel: 'component',
+      selector: {
+        matchLabels: {
+          component: 'apiserver',
+          provider: 'kubernetes',
+        },
+      },
+      namespaceSelector: {
+        matchNames: ['default'],
+      },
+      endpoints: [{
+        port: 'https',
+        interval: '30s',
+        scheme: 'https',
+        tlsConfig: {
+          caFile: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
+          serverName: 'kubernetes',
+        },
+        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: k8s.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/jsonnet/kube-prometheus/components/mixin/kubernetes.libsonnet b/jsonnet/kube-prometheus/components/mixin/kubernetes.libsonnet
deleted file mode 100644
index f9e5791fdf262d850d8e9c44ebadf45d475a1ba6..0000000000000000000000000000000000000000
--- a/jsonnet/kube-prometheus/components/mixin/kubernetes.libsonnet
+++ /dev/null
@@ -1,49 +0,0 @@
-local defaults = {
-  name: 'kubernetes',
-  namespace: error 'must provide namespace',
-  commonLabels:: {
-    'app.kubernetes.io/name': 'kube-prometheus',
-    'app.kubernetes.io/component': 'exporter',
-    'app.kubernetes.io/part-of': 'kube-prometheus',
-  },
-  mixin: {
-    ruleLabels: {},
-    _config: {
-      cadvisorSelector: 'job="kubelet", metrics_path="/metrics/cadvisor"',
-      kubeletSelector: 'job="kubelet", metrics_path="/metrics"',
-      kubeStateMetricsSelector: 'job="kube-state-metrics"',
-      nodeExporterSelector: 'job="node-exporter"',
-      kubeSchedulerSelector: 'job="kube-scheduler"',
-      kubeControllerManagerSelector: 'job="kube-controller-manager"',
-      kubeApiserverSelector: 'job="apiserver"',
-      podLabel: 'pod',
-      runbookURLPattern: 'https://github.com/prometheus-operator/kube-prometheus/wiki/%s',
-      diskDeviceSelector: 'device=~"mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|dasd.+"',
-      hostNetworkInterfaceSelector: 'device!~"veth.+"',
-    },
-  },
-};
-
-function(params) {
-  local m = self,
-  config:: defaults + params,
-
-  mixin:: (import 'github.com/kubernetes-monitoring/kubernetes-mixin/mixin.libsonnet') {
-    _config+:: m.config.mixin._config,
-  },
-
-  prometheusRule: {
-    apiVersion: 'monitoring.coreos.com/v1',
-    kind: 'PrometheusRule',
-    metadata: {
-      labels: m.config.commonLabels + m.config.mixin.ruleLabels,
-      name: m.config.name + '-rules',
-      namespace: m.config.namespace,
-    },
-    spec: {
-      local r = if std.objectHasAll(m.mixin, 'prometheusRules') then m.mixin.prometheusRules.groups else {},
-      local a = if std.objectHasAll(m.mixin, 'prometheusAlerts') then m.mixin.prometheusAlerts.groups else {},
-      groups: a + r,
-    },
-  },
-}
diff --git a/jsonnet/kube-prometheus/components/prometheus.libsonnet b/jsonnet/kube-prometheus/components/prometheus.libsonnet
index 58b8e517211549fb80cf5ea0a2f7b10a7718c893..9bbefd47f16db6e0810d78f423b80fde954a0a36 100644
--- a/jsonnet/kube-prometheus/components/prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/components/prometheus.libsonnet
@@ -1,5 +1,3 @@
-local relabelings = import '../addons/dropping-deprecated-metrics-relabelings.libsonnet';
-
 local defaults = {
   local defaults = self,
   namespace: error 'must provide namespace',
@@ -297,217 +295,6 @@ function(params) {
     },
   },
 
-  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' },
-      },
-      namespaceSelector: {
-        matchNames: ['kube-system'],
-      },
-    },
-  },
-
-  serviceMonitorKubelet: {
-    apiVersion: 'monitoring.coreos.com/v1',
-    kind: 'ServiceMonitor',
-    metadata: {
-      name: 'kubelet',
-      namespace: p.config.namespace,
-      labels: { 'app.kubernetes.io/name': 'kubelet' },
-    },
-    spec: {
-      jobLabel: 'app.kubernetes.io/name',
-      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: { 'app.kubernetes.io/name': 'kubelet' },
-      },
-      namespaceSelector: {
-        matchNames: ['kube-system'],
-      },
-    },
-  },
-
-  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,
-        },
-        metricRelabelings: relabelings + [
-          {
-            sourceLabels: ['__name__'],
-            regex: 'etcd_(debugging|disk|request|server).*',
-            action: 'drop',
-          },
-        ],
-      }],
-      selector: {
-        matchLabels: { 'app.kubernetes.io/name': 'kube-controller-manager' },
-      },
-      namespaceSelector: {
-        matchNames: ['kube-system'],
-      },
-    },
-  },
-
-  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: ['default'],
-      },
-      endpoints: [{
-        port: 'https',
-        interval: '30s',
-        scheme: 'https',
-        tlsConfig: {
-          caFile: '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
-          serverName: 'kubernetes',
-        },
-        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',
-      }],
-    },
-  },
-
   // Include thanos sidecar Service only if thanos config was passed by user
   [if std.objectHas(params, 'thanos') && std.length(params.thanos) > 0 then 'serviceThanosSidecar']: {
     apiVersion: 'v1',
diff --git a/jsonnet/kube-prometheus/main.libsonnet b/jsonnet/kube-prometheus/main.libsonnet
index bd2a60b321289c94631e3411011436dae4361f63..aa684c8df883161009c07710137495d8a0a6cc88 100644
--- a/jsonnet/kube-prometheus/main.libsonnet
+++ b/jsonnet/kube-prometheus/main.libsonnet
@@ -1,9 +1,9 @@
 local alertmanager = import './components/alertmanager.libsonnet';
 local blackboxExporter = import './components/blackbox-exporter.libsonnet';
 local grafana = import './components/grafana.libsonnet';
+local kubernetesControlPlane = import './components/k8s-control-plane.libsonnet';
 local kubeStateMetrics = import './components/kube-state-metrics.libsonnet';
 local customMixin = import './components/mixin/custom.libsonnet';
-local kubernetesMixin = import './components/mixin/kubernetes.libsonnet';
 local nodeExporter = import './components/node-exporter.libsonnet';
 local prometheusAdapter = import './components/prometheus-adapter.libsonnet';
 local prometheusOperator = import './components/prometheus-operator.libsonnet';
@@ -58,7 +58,7 @@ local prometheus = import './components/prometheus.libsonnet';
       image: $.values.common.images.grafana,
       prometheusName: $.values.prometheus.name,
       // TODO(paulfantom) This should be done by iterating over all objects and looking for object.mixin.grafanaDashboards
-      dashboards: $.nodeExporter.mixin.grafanaDashboards + $.prometheus.mixin.grafanaDashboards + $.kubernetesMixin.mixin.grafanaDashboards,
+      dashboards: $.nodeExporter.mixin.grafanaDashboards + $.prometheus.mixin.grafanaDashboards + $.kubernetesControlPlane.mixin.grafanaDashboards,
     },
     kubeStateMetrics: {
       namespace: $.values.common.namespace,
@@ -96,7 +96,7 @@ local prometheus = import './components/prometheus.libsonnet';
       },
       mixin+: { ruleLabels: $.values.common.ruleLabels },
     },
-    kubernetesMixin: {
+    kubernetesControlPlane: {
       namespace: $.values.common.namespace,
       mixin+: { ruleLabels: $.values.common.ruleLabels },
     },
@@ -114,7 +114,7 @@ local prometheus = import './components/prometheus.libsonnet';
   prometheus: prometheus($.values.prometheus),
   prometheusAdapter: prometheusAdapter($.values.prometheusAdapter),
   prometheusOperator: prometheusOperator($.values.prometheusOperator),
-  kubernetesMixin: kubernetesMixin($.values.kubernetesMixin),
+  kubernetesControlPlane: kubernetesControlPlane($.values.kubernetesControlPlane),
   kubePrometheus: customMixin($.values.kubePrometheus) + {
     namespace: {
       apiVersion: 'v1',
diff --git a/jsonnet/kube-prometheus/platforms/aws.libsonnet b/jsonnet/kube-prometheus/platforms/aws.libsonnet
index 04d67d0055e0faee5dfcb878c70cb95ce44f61c2..27a61c2b87bc25e67c29bad4c4d88041a27d3fc3 100644
--- a/jsonnet/kube-prometheus/platforms/aws.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/aws.libsonnet
@@ -14,7 +14,7 @@ local service(name, namespace, labels, selector, ports) = {
 };
 
 {
-  prometheus+: {
+  kubernetesControlPlane+: {
     kubeControllerManagerPrometheusDiscoveryService: service(
       'kube-controller-manager-prometheus-discovery',
       'kube-system',
diff --git a/jsonnet/kube-prometheus/platforms/bootkube.libsonnet b/jsonnet/kube-prometheus/platforms/bootkube.libsonnet
index 8e73509dd8e469b35a8256271ef90ff26b9ab01b..e4651ae92c14ab6df95ec37d0e906ec432187614 100644
--- a/jsonnet/kube-prometheus/platforms/bootkube.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/bootkube.libsonnet
@@ -14,7 +14,7 @@ local service(name, namespace, labels, selector, ports) = {
 };
 
 {
-  prometheus+:: {
+  kubernetesControlPlane+: {
     kubeControllerManagerPrometheusDiscoveryService: service(
       'kube-controller-manager-prometheus-discovery',
       'kube-system',
diff --git a/jsonnet/kube-prometheus/platforms/eks.libsonnet b/jsonnet/kube-prometheus/platforms/eks.libsonnet
index c72e5c8ba219964e72396b945669e10f44969181..815c1234d1b6bc6e61c981b06dbb70d7d904269a 100644
--- a/jsonnet/kube-prometheus/platforms/eks.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/eks.libsonnet
@@ -5,7 +5,7 @@
       minimumAvailableIPsTime: '10m',
     },
   },
-  prometheus+: {
+  kubernetesControlPlane+: {
     serviceMonitorCoreDNS+: {
       spec+: {
         endpoints: [
diff --git a/jsonnet/kube-prometheus/platforms/gke.libsonnet b/jsonnet/kube-prometheus/platforms/gke.libsonnet
index b8b83c28b471466c21c8ee6a662b68cc84f35f5b..973eeffb86d4d05262b1ecfb5b8e81d2e372de98 100644
--- a/jsonnet/kube-prometheus/platforms/gke.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/gke.libsonnet
@@ -1,6 +1,6 @@
 (import '../addons/managed-cluster.libsonnet') + {
-  _config+:: {
-    prometheusAdapter+:: {
+  values+:: {
+    prometheusAdapter+: {
       config+: {
         resourceRules:: null,
       },
diff --git a/jsonnet/kube-prometheus/platforms/kops-coredns.libsonnet b/jsonnet/kube-prometheus/platforms/kops-coredns.libsonnet
index 749e937c4ff72d02a5a67fc52e887327eeec5b78..b9688173f19fa10291c9c89452c0310843d38ae3 100644
--- a/jsonnet/kube-prometheus/platforms/kops-coredns.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/kops-coredns.libsonnet
@@ -1,5 +1,5 @@
 {
-  prometheus+:: {
+  kubernetesControlPlane+: {
     kubeDnsPrometheusDiscoveryService: {
       apiVersion: 'v1',
       kind: 'Service',
diff --git a/jsonnet/kube-prometheus/platforms/kops.libsonnet b/jsonnet/kube-prometheus/platforms/kops.libsonnet
index 54be338ebc92cce58bf0f5cae6236573b8654ab8..914ffb029902890348bed3f3894913c788d09d2b 100644
--- a/jsonnet/kube-prometheus/platforms/kops.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/kops.libsonnet
@@ -14,7 +14,7 @@ local service(name, namespace, labels, selector, ports) = {
 };
 
 {
-  prometheus+:: {
+  kubernetesControlPlane+: {
     kubeControllerManagerPrometheusDiscoveryService: service(
       'kube-controller-manager-prometheus-discovery',
       'kube-system',
diff --git a/jsonnet/kube-prometheus/platforms/kubeadm.libsonnet b/jsonnet/kube-prometheus/platforms/kubeadm.libsonnet
index 3621c2aac5d9493ef2ae2f12e6f8a24759ea333e..dec785d9de9000d45687a84fe9ae936b16b664c3 100644
--- a/jsonnet/kube-prometheus/platforms/kubeadm.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/kubeadm.libsonnet
@@ -14,7 +14,7 @@ local service(name, namespace, labels, selector, ports) = {
 };
 
 {
-  prometheus+: {
+  kubernetesControlPlane+: {
     kubeControllerManagerPrometheusDiscoveryService: service(
       'kube-controller-manager-prometheus-discovery',
       'kube-system',
diff --git a/jsonnet/kube-prometheus/platforms/kubespray.libsonnet b/jsonnet/kube-prometheus/platforms/kubespray.libsonnet
index f34cab677c51d99611827dcebc8786d98ea255e1..3b35e8e10526692ad7a5ddb165075f1f87a964fa 100644
--- a/jsonnet/kube-prometheus/platforms/kubespray.libsonnet
+++ b/jsonnet/kube-prometheus/platforms/kubespray.libsonnet
@@ -15,7 +15,7 @@ local service(name, namespace, labels, selector, ports) = {
 
 {
 
-  prometheus+: {
+  kubernetesControlPlane+: {
     kubeControllerManagerPrometheusDiscoveryService: service(
       'kube-controller-manager-prometheus-discovery',
       'kube-system',
diff --git a/kustomization.yaml b/kustomization.yaml
index 2ebd021b9be4b6317fb4029991d9443ed42059df..8cc445727d50f2be813a802abde8161681ac13fb 100644
--- a/kustomization.yaml
+++ b/kustomization.yaml
@@ -30,6 +30,11 @@ resources:
 - ./manifests/kube-state-metrics-serviceAccount.yaml
 - ./manifests/kube-state-metrics-serviceMonitor.yaml
 - ./manifests/kubernetes-prometheusRule.yaml
+- ./manifests/kubernetes-serviceMonitorApiserver.yaml
+- ./manifests/kubernetes-serviceMonitorCoreDNS.yaml
+- ./manifests/kubernetes-serviceMonitorKubeControllerManager.yaml
+- ./manifests/kubernetes-serviceMonitorKubeScheduler.yaml
+- ./manifests/kubernetes-serviceMonitorKubelet.yaml
 - ./manifests/node-exporter-clusterRole.yaml
 - ./manifests/node-exporter-clusterRoleBinding.yaml
 - ./manifests/node-exporter-daemonset.yaml
@@ -62,11 +67,6 @@ resources:
 - ./manifests/prometheus-service.yaml
 - ./manifests/prometheus-serviceAccount.yaml
 - ./manifests/prometheus-serviceMonitor.yaml
-- ./manifests/prometheus-serviceMonitorApiserver.yaml
-- ./manifests/prometheus-serviceMonitorCoreDNS.yaml
-- ./manifests/prometheus-serviceMonitorKubeControllerManager.yaml
-- ./manifests/prometheus-serviceMonitorKubeScheduler.yaml
-- ./manifests/prometheus-serviceMonitorKubelet.yaml
 - ./manifests/setup/0namespace-namespace.yaml
 - ./manifests/setup/prometheus-operator-0alertmanagerConfigCustomResourceDefinition.yaml
 - ./manifests/setup/prometheus-operator-0alertmanagerCustomResourceDefinition.yaml
diff --git a/manifests/kubernetes-prometheusRule.yaml b/manifests/kubernetes-prometheusRule.yaml
index d3ee9527b90e186425129efcc5fbaf2bd0f31a2b..4dc01f2f49d9561a9ae3d4b54c0a5617eb50e0a1 100644
--- a/manifests/kubernetes-prometheusRule.yaml
+++ b/manifests/kubernetes-prometheusRule.yaml
@@ -2,12 +2,11 @@ apiVersion: monitoring.coreos.com/v1
 kind: PrometheusRule
 metadata:
   labels:
-    app.kubernetes.io/component: exporter
     app.kubernetes.io/name: kube-prometheus
     app.kubernetes.io/part-of: kube-prometheus
     prometheus: k8s
     role: alert-rules
-  name: kubernetes-rules
+  name: kubernetes-monitoring-rules
   namespace: monitoring
 spec:
   groups:
diff --git a/manifests/prometheus-serviceMonitorApiserver.yaml b/manifests/kubernetes-serviceMonitorApiserver.yaml
similarity index 100%
rename from manifests/prometheus-serviceMonitorApiserver.yaml
rename to manifests/kubernetes-serviceMonitorApiserver.yaml
diff --git a/manifests/prometheus-serviceMonitorCoreDNS.yaml b/manifests/kubernetes-serviceMonitorCoreDNS.yaml
similarity index 100%
rename from manifests/prometheus-serviceMonitorCoreDNS.yaml
rename to manifests/kubernetes-serviceMonitorCoreDNS.yaml
diff --git a/manifests/prometheus-serviceMonitorKubeControllerManager.yaml b/manifests/kubernetes-serviceMonitorKubeControllerManager.yaml
similarity index 100%
rename from manifests/prometheus-serviceMonitorKubeControllerManager.yaml
rename to manifests/kubernetes-serviceMonitorKubeControllerManager.yaml
diff --git a/manifests/prometheus-serviceMonitorKubeScheduler.yaml b/manifests/kubernetes-serviceMonitorKubeScheduler.yaml
similarity index 100%
rename from manifests/prometheus-serviceMonitorKubeScheduler.yaml
rename to manifests/kubernetes-serviceMonitorKubeScheduler.yaml
diff --git a/manifests/prometheus-serviceMonitorKubelet.yaml b/manifests/kubernetes-serviceMonitorKubelet.yaml
similarity index 100%
rename from manifests/prometheus-serviceMonitorKubelet.yaml
rename to manifests/kubernetes-serviceMonitorKubelet.yaml