diff --git a/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet b/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
index 6c9acdaed438ca786d55cd80219f559252167105..c857344df97dbfb2e43fd076ad74333d4813fec5 100644
--- a/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
+++ b/jsonnet/kube-prometheus/alertmanager/alertmanager.libsonnet
@@ -51,6 +51,17 @@
         ],
       },
       replicas: 3,
+      labels: {
+        'app.kubernetes.io/name': 'alertmanager-' + $._config.alertmanager.name,
+        'app.kubernetes.io/version': $._config.versions.alertmanager,
+        'app.kubernetes.io/component': 'router',
+        'app.kubernetes.io/part-of': 'kube-prometheus',
+      },
+      selectorLabels: {
+        [labelName]: $._config.alertmanager.labels[labelName]
+        for labelName in std.objectFields($._config.alertmanager.labels)
+        if !std.setMember(labelName, ['app.kubernetes.io/version'])
+      },
     },
   },
 
@@ -87,13 +98,16 @@
       metadata: {
         name: 'alertmanager-' + $._config.alertmanager.name,
         namespace: $._config.namespace,
-        labels: { alertmanager: $._config.alertmanager.name },
+        labels: { alertmanager: $._config.alertmanager.name } + $._config.alertmanager.labels,
       },
       spec: {
         ports: [
           { name: 'web', targetPort: 'web', port: 9093 },
         ],
-        selector: { app: 'alertmanager', alertmanager: $._config.alertmanager.name },
+        selector: {
+          app: 'alertmanager',
+          alertmanager: $._config.alertmanager.name
+        } + $._config.alertmanager.selectorLabels,
         sessionAffinity: 'ClientIP',
       },
     },
@@ -104,15 +118,13 @@
       metadata: {
         name: 'alertmanager',
         namespace: $._config.namespace,
-        labels: {
-          'k8s-app': 'alertmanager',
-        },
+        labels: $._config.alertmanager.labels,
       },
       spec: {
         selector: {
           matchLabels: {
             alertmanager: $._config.alertmanager.name,
-          },
+          } + $._config.alertmanager.selectorLabels,
         },
         endpoints: [
           { port: 'web', interval: '30s' },
@@ -128,12 +140,15 @@
         namespace: $._config.namespace,
         labels: {
           alertmanager: $._config.alertmanager.name,
-        },
+        } + $._config.alertmanager.labels,
       },
       spec: {
         replicas: $._config.alertmanager.replicas,
         version: $._config.versions.alertmanager,
         image: $._config.imageRepos.alertmanager + ':' + $._config.versions.alertmanager,
+        podMetadata: {
+          labels: $._config.alertmanager.labels,
+        },
         nodeSelector: { 'kubernetes.io/os': 'linux' },
         serviceAccountName: 'alertmanager-' + $._config.alertmanager.name,
         securityContext: {
diff --git a/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet b/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
index f3a0e0d9e3f458c30be98083ffedd2ebf7697169..4e1709dd57fef362627af17aca79b458f21c9933 100644
--- a/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
+++ b/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
@@ -12,6 +12,17 @@ local ksm = import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-
     kubeStateMetrics+:: {
       scrapeInterval: '30s',
       scrapeTimeout: '30s',
+      labels: {
+        'app.kubernetes.io/name': 'kube-state-metrics',
+        'app.kubernetes.io/version': $._config.versions.kubeStateMetrics,
+        'app.kubernetes.io/component': 'exporter',
+        'app.kubernetes.io/part-of': 'kube-prometheus',
+      },
+      selectorLabels: {
+        [labelName]: $._config.kubeStateMetrics.labels[labelName]
+        for labelName in std.objectFields($._config.kubeStateMetrics.labels)
+        if !std.setMember(labelName, ['app.kubernetes.io/version'])
+      },
     },
   },
   kubeStateMetrics+::
@@ -21,6 +32,8 @@ local ksm = import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-
       namespace:: $._config.namespace,
       version:: $._config.versions.kubeStateMetrics,
       image:: $._config.imageRepos.kubeStateMetrics + ':v' + $._config.versions.kubeStateMetrics,
+      commonLabels:: $._config.kubeStateMetrics.labels,
+      podLabels:: $._config.kubeStateMetrics.selectorLabels,
       service+: {
         spec+: {
           ports: [
@@ -58,18 +71,11 @@ local ksm = import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-
           metadata: {
             name: 'kube-state-metrics',
             namespace: $._config.namespace,
-            labels: {
-              'app.kubernetes.io/name': 'kube-state-metrics',
-              'app.kubernetes.io/version': version,
-            },
+            labels: $._config.kubeStateMetrics.labels,
           },
           spec: {
             jobLabel: 'app.kubernetes.io/name',
-            selector: {
-              matchLabels: {
-                'app.kubernetes.io/name': 'kube-state-metrics',
-              },
-            },
+            selector: { matchLabels: $._config.kubeStateMetrics.selectorLabels },
             endpoints: [
               {
                 port: 'https-main',
diff --git a/jsonnet/kube-prometheus/node-exporter/node-exporter.libsonnet b/jsonnet/kube-prometheus/node-exporter/node-exporter.libsonnet
index c2288ce7a64ed4261185264570ed49d3890da8bd..44cc2edd11494e17a3b7934daca5b63d0602197f 100644
--- a/jsonnet/kube-prometheus/node-exporter/node-exporter.libsonnet
+++ b/jsonnet/kube-prometheus/node-exporter/node-exporter.libsonnet
@@ -10,6 +10,8 @@
       labels: {
         'app.kubernetes.io/name': 'node-exporter',
         'app.kubernetes.io/version': $._config.versions.nodeExporter,
+        'app.kubernetes.io/component': 'exporter',
+        'app.kubernetes.io/part-of': 'kube-prometheus',
       },
       selectorLabels: {
         [labelName]: $._config.nodeExporter.labels[labelName]
diff --git a/jsonnet/kube-prometheus/prometheus-adapter/prometheus-adapter.libsonnet b/jsonnet/kube-prometheus/prometheus-adapter/prometheus-adapter.libsonnet
index 5863367f6efb2090fc7e867600cfef51de47cf9c..e4ba99e388dea6a242308e48e2a5f5a3a1ad1cf8 100644
--- a/jsonnet/kube-prometheus/prometheus-adapter/prometheus-adapter.libsonnet
+++ b/jsonnet/kube-prometheus/prometheus-adapter/prometheus-adapter.libsonnet
@@ -8,7 +8,17 @@
     prometheusAdapter+:: {
       name: 'prometheus-adapter',
       namespace: $._config.namespace,
-      labels: { name: $._config.prometheusAdapter.name },
+      labels: {
+        'app.kubernetes.io/name': $._config.prometheusAdapter.name,
+        'app.kubernetes.io/version': $._config.versions.prometheusAdapter,
+        'app.kubernetes.io/component': 'metrics-adapter',
+        'app.kubernetes.io/part-of': 'kube-prometheus',
+      },
+      selectorLabels: {
+        [labelName]: $._config.prometheusAdapter.labels[labelName]
+        for labelName in std.objectFields($._config.prometheusAdapter.labels)
+        if !std.setMember(labelName, ['app.kubernetes.io/version'])
+      },
       prometheusURL: 'http://prometheus-' + $._config.prometheus.name + '.' + $._config.namespace + '.svc.cluster.local:9090/',
       config: {
         resourceRules: {
@@ -82,7 +92,7 @@
       },
       spec: {
         selector: {
-          matchLabels: $._config.prometheusAdapter.labels,
+          matchLabels: $._config.prometheusAdapter.selectorLabels,
         },
         endpoints: [
           {
@@ -110,7 +120,7 @@
         ports: [
           { name: 'https', targetPort: 6443, port: 443 },
         ],
-        selector: $._config.prometheusAdapter.labels,
+        selector: $._config.prometheusAdapter.selectorLabels,
       },
     },
 
@@ -143,7 +153,7 @@
         },
         spec: {
           replicas: 1,
-          selector: { matchLabels: $._config.prometheusAdapter.labels },
+          selector: { matchLabels: $._config.prometheusAdapter.selectorLabels },
           strategy: {
             rollingUpdate: {
               maxSurge: 1,
diff --git a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
index 1545b697693bc4d8bf47ef5cb70de0de878eafbc..3e7e4e96f0b8f5d0976abf5d9d7aee094067ba2d 100644
--- a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
@@ -13,6 +13,17 @@ local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabeli
       replicas: 2,
       rules: {},
       namespaces: ['default', 'kube-system', $._config.namespace],
+      labels: {
+        'app.kubernetes.io/name': 'prometheus-' + $._config.prometheus.name,
+        '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'])
+      },
     },
   },
 
@@ -41,13 +52,13 @@ local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabeli
       metadata: {
         name: 'prometheus-' + p.name,
         namespace: p.namespace,
-        labels: { prometheus: p.name },
+        labels: { prometheus: p.name } + $._config.prometheus.labels,
       },
       spec: {
         ports: [
           { name: 'web', targetPort: 'web', port: 9090 },
         ],
-        selector: { app: 'prometheus', prometheus: p.name },
+        selector: { app: 'prometheus', prometheus: p.name } + $._config.prometheus.selectorLabels,
         sessionAffinity: 'ClientIP',
       },
     },
@@ -192,12 +203,15 @@ local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabeli
       metadata: {
         name: p.name,
         namespace: p.namespace,
-        labels: { prometheus: p.name },
+        labels: { prometheus: p.name } + $._config.prometheus.labels,
       },
       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: {},
@@ -236,11 +250,11 @@ local relabelings = import 'kube-prometheus/dropping-deprecated-metrics-relabeli
       metadata: {
         name: 'prometheus',
         namespace: p.namespace,
-        labels: { 'k8s-app': 'prometheus' },
+        labels: { 'k8s-app': 'prometheus' } + $._config.prometheus.labels,
       },
       spec: {
         selector: {
-          matchLabels: { prometheus: p.name },
+          matchLabels: { prometheus: p.name } + $._config.prometheus.selectorLabels,
         },
         endpoints: [{
           port: 'web',