diff --git a/jsonnet/kube-prometheus/blackbox-exporter/blackbox-exporter.libsonnet b/jsonnet/kube-prometheus/blackbox-exporter/blackbox-exporter.libsonnet
index 9c76ff349e3857bd7544746ad9af39ff7f501b6c..769b1beed50afa1989782f2d732f83046be9d9e4 100644
--- a/jsonnet/kube-prometheus/blackbox-exporter/blackbox-exporter.libsonnet
+++ b/jsonnet/kube-prometheus/blackbox-exporter/blackbox-exporter.libsonnet
@@ -1,109 +1,107 @@
-local kubeRbacProxyContainer = import '../kube-rbac-proxy/containerMixin.libsonnet';
+local krp = import '../kube-rbac-proxy/container.libsonnet';
 
-{
-  _config+:: {
-    namespace: 'default',
+local defaults = {
+  local defaults = self,
+  namespace: error 'must provide namespace',
+  version: error 'must provide version',
+  image: error 'must provide version',
+  resources: {
+    requests: { cpu: '10m', memory: '20Mi' },
+    limits: { cpu: '20m', memory: '40Mi' },
+  },
+  commonLabels:: {
+    'app.kubernetes.io/name': 'blackbox-exporter',
+    'app.kubernetes.io/version': defaults.version,
+    'app.kubernetes.io/component': 'exporter',
+    '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'])
+  },
+  configmapReloaderImage: 'jimmidyson/configmap-reload:v0.4.0',
 
-    versions+:: {
-      blackboxExporter: 'v0.18.0',
-      configmapReloader: 'v0.4.0',
+  port: 9115,
+  internalPort: 19115,
+  replicas: 1,
+  modules: {
+    http_2xx: {
+      prober: 'http',
+      http: {
+        preferred_ip_protocol: 'ip4',
+      },
     },
-
-    imageRepos+:: {
-      blackboxExporter: 'quay.io/prometheus/blackbox-exporter',
-      configmapReloader: 'jimmidyson/configmap-reload',
+    http_post_2xx: {
+      prober: 'http',
+      http: {
+        method: 'POST',
+        preferred_ip_protocol: 'ip4',
+      },
     },
-
-    resources+:: {
-      'blackbox-exporter': {
-        requests: { cpu: '10m', memory: '20Mi' },
-        limits: { cpu: '20m', memory: '40Mi' },
+    tcp_connect: {
+      prober: 'tcp',
+      tcp: {
+        preferred_ip_protocol: 'ip4',
       },
     },
-
-    blackboxExporter: {
-      port: 9115,
-      internalPort: 19115,
-      replicas: 1,
-      matchLabels: {
-        'app.kubernetes.io/name': 'blackbox-exporter',
+    pop3s_banner: {
+      prober: 'tcp',
+      tcp: {
+        query_response: [
+          { expect: '^+OK' },
+        ],
+        tls: true,
+        tls_config: {
+          insecure_skip_verify: false,
+        },
+        preferred_ip_protocol: 'ip4',
       },
-      assignLabels: self.matchLabels {
-        'app.kubernetes.io/version': $._config.versions.blackboxExporter,
+    },
+    ssh_banner: {
+      prober: 'tcp',
+      tcp: {
+        query_response: [
+          { expect: '^SSH-2.0-' },
+        ],
+        preferred_ip_protocol: 'ip4',
       },
-      modules: {
-        http_2xx: {
-          prober: 'http',
-          http: {
-            preferred_ip_protocol: 'ip4',
-          },
-        },
-        http_post_2xx: {
-          prober: 'http',
-          http: {
-            method: 'POST',
-            preferred_ip_protocol: 'ip4',
-          },
-        },
-        tcp_connect: {
-          prober: 'tcp',
-          tcp: {
-            preferred_ip_protocol: 'ip4',
-          },
-        },
-        pop3s_banner: {
-          prober: 'tcp',
-          tcp: {
-            query_response: [
-              { expect: '^+OK' },
-            ],
-            tls: true,
-            tls_config: {
-              insecure_skip_verify: false,
-            },
-            preferred_ip_protocol: 'ip4',
-          },
-        },
-        ssh_banner: {
-          prober: 'tcp',
-          tcp: {
-            query_response: [
-              { expect: '^SSH-2.0-' },
-            ],
-            preferred_ip_protocol: 'ip4',
-          },
-        },
-        irc_banner: {
-          prober: 'tcp',
-          tcp: {
-            query_response: [
-              { send: 'NICK prober' },
-              { send: 'USER prober prober prober :prober' },
-              { expect: 'PING :([^ ]+)', send: 'PONG ${1}' },
-              { expect: '^:[^ ]+ 001' },
-            ],
-            preferred_ip_protocol: 'ip4',
-          },
-        },
+    },
+    irc_banner: {
+      prober: 'tcp',
+      tcp: {
+        query_response: [
+          { send: 'NICK prober' },
+          { send: 'USER prober prober prober :prober' },
+          { expect: 'PING :([^ ]+)', send: 'PONG ${1}' },
+          { expect: '^:[^ ]+ 001' },
+        ],
+        preferred_ip_protocol: 'ip4',
       },
-      privileged:
-        local icmpModules = [self.modules[m] for m in std.objectFields(self.modules) if self.modules[m].prober == 'icmp'];
-        std.length(icmpModules) > 0,
     },
   },
+  privileged:
+    local icmpModules = [self.modules[m] for m in std.objectFields(self.modules) if self.modules[m].prober == 'icmp'];
+    std.length(icmpModules) > 0,
+};
+
+
+function(params) {
+  local bb = self,
+  config:: defaults + params,
+  // Safety check
+  assert std.isObject(bb.config.resources),
 
-  blackboxExporter+::
-    local bb = $._config.blackboxExporter;
-    {
       configuration: {
         apiVersion: 'v1',
         kind: 'ConfigMap',
         metadata: {
           name: 'blackbox-exporter-configuration',
-          namespace: $._config.namespace,
+          namespace: bb.config.namespace,
+          labels: bb.config.commonLabels,
         },
         data: {
-          'config.yml': std.manifestYamlDoc({ modules: bb.modules }),
+          'config.yml': std.manifestYamlDoc({ modules: bb.config.modules }),
         },
       },
 
@@ -112,7 +110,7 @@ local kubeRbacProxyContainer = import '../kube-rbac-proxy/containerMixin.libsonn
         kind: 'ServiceAccount',
         metadata: {
           name: 'blackbox-exporter',
-          namespace: $._config.namespace,
+          namespace: bb.config.namespace,
         },
       },
 
@@ -150,104 +148,109 @@ local kubeRbacProxyContainer = import '../kube-rbac-proxy/containerMixin.libsonn
         subjects: [{
           kind: 'ServiceAccount',
           name: 'blackbox-exporter',
-          namespace: $._config.namespace,
+          namespace: bb.config.namespace,
         }],
       },
 
-      deployment: {
-        apiVersion: 'apps/v1',
-        kind: 'Deployment',
-        metadata: {
+      deployment:
+        local blackboxExporter = {
           name: 'blackbox-exporter',
-          namespace: $._config.namespace,
-          labels: bb.assignLabels,
-        },
-        spec: {
-          replicas: bb.replicas,
-          selector: { matchLabels: bb.matchLabels },
-          template: {
-            metadata: { labels: bb.assignLabels },
-            spec: {
-              containers: [
-                {
-                  name: 'blackbox-exporter',
-                  image: $._config.imageRepos.blackboxExporter + ':' + $._config.versions.blackboxExporter,
-                  args: [
-                    '--config.file=/etc/blackbox_exporter/config.yml',
-                    '--web.listen-address=:%d' % bb.internalPort,
-                  ],
-                  ports: [{
-                    name: 'http',
-                    containerPort: bb.internalPort,
-                  }],
-                  resources: {
-                    requests: $._config.resources['blackbox-exporter'].requests,
-                    limits: $._config.resources['blackbox-exporter'].limits,
-                  },
-                  securityContext: if bb.privileged then {
-                    runAsNonRoot: false,
-                    capabilities: { drop: ['ALL'], add: ['NET_RAW'] },
-                  } else {
-                    runAsNonRoot: true,
-                    runAsUser: 65534,
-                  },
-                  volumeMounts: [{
-                    mountPath: '/etc/blackbox_exporter/',
-                    name: 'config',
-                    readOnly: true,
-                  }],
-                },
-                {
-                  name: 'module-configmap-reloader',
-                  image: $._config.imageRepos.configmapReloader + ':' + $._config.versions.configmapReloader,
-                  args: [
-                    '--webhook-url=http://localhost:%d/-/reload' % bb.internalPort,
-                    '--volume-dir=/etc/blackbox_exporter/',
-                  ],
-                  resources: {
-                    requests: $._config.resources['blackbox-exporter'].requests,
-                    limits: $._config.resources['blackbox-exporter'].limits,
-                  },
-                  securityContext: { runAsNonRoot: true, runAsUser: 65534 },
-                  terminationMessagePath: '/dev/termination-log',
-                  terminationMessagePolicy: 'FallbackToLogsOnError',
-                  volumeMounts: [{
-                    mountPath: '/etc/blackbox_exporter/',
-                    name: 'config',
-                    readOnly: true,
-                  }],
-                },
-              ],
-              nodeSelector: { 'kubernetes.io/os': 'linux' },
-              serviceAccountName: 'blackbox-exporter',
-              volumes: [{
-                name: 'config',
-                configMap: { name: 'blackbox-exporter-configuration' },
-              }],
+          image: bb.config.image,
+          args: [
+            '--config.file=/etc/blackbox_exporter/config.yml',
+            '--web.listen-address=:%d' % bb.config.internalPort,
+          ],
+          ports: [{
+            name: 'http',
+            containerPort: bb.config.internalPort,
+          }],
+          resources: bb.config.resources,
+          securityContext: if bb.config.privileged then {
+            runAsNonRoot: false,
+            capabilities: { drop: ['ALL'], add: ['NET_RAW'] },
+          } else {
+            runAsNonRoot: true,
+            runAsUser: 65534,
+          },
+          volumeMounts: [{
+            mountPath: '/etc/blackbox_exporter/',
+            name: 'config',
+            readOnly: true,
+          }],
+        };
+
+        local reloader = {
+          name: 'module-configmap-reloader',
+          image: bb.config.configmapReloaderImage,
+          args: [
+            '--webhook-url=http://localhost:%d/-/reload' % bb.config.internalPort,
+            '--volume-dir=/etc/blackbox_exporter/',
+          ],
+          resources: bb.config.resources,
+          securityContext: { runAsNonRoot: true, runAsUser: 65534 },
+          terminationMessagePath: '/dev/termination-log',
+          terminationMessagePolicy: 'FallbackToLogsOnError',
+          volumeMounts: [{
+            mountPath: '/etc/blackbox_exporter/',
+            name: 'config',
+            readOnly: true,
+          }],
+        };
+
+        local kubeRbacProxy = krp({
+          name: 'kube-rbac-proxy',
+          upstream: 'http://127.0.0.1:' + bb.config.internalPort + '/',
+          secureListenAddress: ':' + bb.config.port,
+          ports: [
+            { name: 'https', containerPort: bb.config.port },
+          ],
+        });
+
+        {
+          apiVersion: 'apps/v1',
+          kind: 'Deployment',
+          metadata: {
+            name: 'blackbox-exporter',
+            namespace: bb.config.namespace,
+            labels: bb.config.commonLabels,
+          },
+          spec: {
+            replicas: bb.config.replicas,
+            selector: { matchLabels: bb.config.selectorLabels },
+            template: {
+              metadata: { labels: bb.config.commonLabels },
+              spec: {
+                containers: [blackboxExporter, reloader, kubeRbacProxy],
+                nodeSelector: { 'kubernetes.io/os': 'linux' },
+                serviceAccountName: 'blackbox-exporter',
+                volumes: [{
+                  name: 'config',
+                  configMap: { name: 'blackbox-exporter-configuration' },
+                }],
+              },
             },
           },
         },
-      },
 
       service: {
         apiVersion: 'v1',
         kind: 'Service',
         metadata: {
           name: 'blackbox-exporter',
-          namespace: $._config.namespace,
-          labels: bb.assignLabels,
+          namespace: bb.config.namespace,
+          labels: bb.config.commonLabels,
         },
         spec: {
           ports: [{
             name: 'https',
-            port: bb.port,
+            port: bb.config.port,
             targetPort: 'https',
           }, {
             name: 'probe',
-            port: bb.internalPort,
+            port: bb.config.internalPort,
             targetPort: 'http',
           }],
-          selector: bb.matchLabels,
+          selector: bb.config.selectorLabels,
         },
       },
 
@@ -257,8 +260,8 @@ local kubeRbacProxyContainer = import '../kube-rbac-proxy/containerMixin.libsonn
           kind: 'ServiceMonitor',
           metadata: {
             name: 'blackbox-exporter',
-            namespace: $._config.namespace,
-            labels: bb.assignLabels,
+            namespace: bb.config.namespace,
+            labels: bb.config.commonLabels,
           },
           spec: {
             endpoints: [{
@@ -272,22 +275,8 @@ local kubeRbacProxyContainer = import '../kube-rbac-proxy/containerMixin.libsonn
               },
             }],
             selector: {
-              matchLabels: bb.matchLabels,
+              matchLabels: bb.config.selectorLabels,
             },
           },
         },
-    } +
-    (kubeRbacProxyContainer {
-       config+:: {
-         kubeRbacProxy: {
-           image: $._config.imageRepos.kubeRbacProxy + ':' + $._config.versions.kubeRbacProxy,
-           name: 'kube-rbac-proxy',
-           securePortName: 'https',
-           securePort: bb.port,
-           secureListenAddress: ':%d' % self.securePort,
-           upstream: 'http://127.0.0.1:%d/' % bb.internalPort,
-           tlsCipherSuites: $._config.tlsCipherSuites,
-         },
-       },
-     }).deploymentMixin,
-}
+    }
diff --git a/jsonnet/kube-prometheus/kube-prometheus.libsonnet b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
index 443511d6c199f8fc2559a1502a86b27333417440..0267fda24f02a585947efc3a5b67bb3760c9b493 100644
--- a/jsonnet/kube-prometheus/kube-prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
@@ -5,11 +5,12 @@ local alertmanager = import './alertmanager/alertmanager.libsonnet';
 
 local prometheusAdapter = import './prometheus-adapter/prometheus-adapter.libsonnet';
 
+local blackboxExporter = import './blackbox-exporter/blackbox-exporter.libsonnet';
+
 (import 'github.com/brancz/kubernetes-grafana/grafana/grafana.libsonnet') +
 (import './kube-state-metrics/kube-state-metrics.libsonnet') +
 (import 'github.com/kubernetes/kube-state-metrics/jsonnet/kube-state-metrics-mixin/mixin.libsonnet') +
 (import 'github.com/prometheus/node_exporter/docs/node-mixin/mixin.libsonnet') +
-(import './blackbox-exporter/blackbox-exporter.libsonnet') +
 (import 'github.com/prometheus/alertmanager/doc/alertmanager-mixin/mixin.libsonnet') +
 (import 'github.com/prometheus-operator/prometheus-operator/jsonnet/prometheus-operator/prometheus-operator.libsonnet') +
 (import 'github.com/prometheus-operator/prometheus-operator/jsonnet/mixin/mixin.libsonnet') +
@@ -36,6 +37,11 @@ local prometheusAdapter = import './prometheus-adapter/prometheus-adapter.libson
     image: 'directxman12/k8s-prometheus-adapter:v0.8.2',
     prometheusURL: 'http://prometheus-' + $._config.prometheus.name + '.' + $._config.namespace + '.svc.cluster.local:9090/',
   }),
+  blackboxExporter: blackboxExporter({
+    namespace: $._config.namespace,
+    version: '0.18.0',
+    image: 'quay.io/prometheus/blackbox-exporter:v0.18.0',
+  }),
   kubePrometheus+:: {
     namespace: {
       apiVersion: 'v1',
diff --git a/manifests/blackbox-exporter-configuration.yaml b/manifests/blackbox-exporter-configuration.yaml
index 7af052c570d3cb1bcb5271083b80161efdf415d4..0f5b03ebf0b4689da6d5f8cc798e2344ce351895 100644
--- a/manifests/blackbox-exporter-configuration.yaml
+++ b/manifests/blackbox-exporter-configuration.yaml
@@ -42,5 +42,10 @@ data:
           "preferred_ip_protocol": "ip4"
 kind: ConfigMap
 metadata:
+  labels:
+    app.kubernetes.io/component: exporter
+    app.kubernetes.io/name: blackbox-exporter
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 0.18.0
   name: blackbox-exporter-configuration
   namespace: monitoring
diff --git a/manifests/blackbox-exporter-deployment.yaml b/manifests/blackbox-exporter-deployment.yaml
index ca71dafbbcef53efb0767837a1b3a7adf754d875..9c0ec4c03bcec8df59f55548fecc07b3a61495f1 100644
--- a/manifests/blackbox-exporter-deployment.yaml
+++ b/manifests/blackbox-exporter-deployment.yaml
@@ -2,20 +2,26 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   labels:
+    app.kubernetes.io/component: exporter
     app.kubernetes.io/name: blackbox-exporter
-    app.kubernetes.io/version: v0.18.0
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 0.18.0
   name: blackbox-exporter
   namespace: monitoring
 spec:
   replicas: 1
   selector:
     matchLabels:
+      app.kubernetes.io/component: exporter
       app.kubernetes.io/name: blackbox-exporter
+      app.kubernetes.io/part-of: kube-prometheus
   template:
     metadata:
       labels:
+        app.kubernetes.io/component: exporter
         app.kubernetes.io/name: blackbox-exporter
-        app.kubernetes.io/version: v0.18.0
+        app.kubernetes.io/part-of: kube-prometheus
+        app.kubernetes.io/version: 0.18.0
     spec:
       containers:
       - args:
@@ -71,6 +77,13 @@ spec:
         ports:
         - containerPort: 9115
           name: https
+        resources:
+          limits:
+            cpu: 20m
+            memory: 40Mi
+          requests:
+            cpu: 10m
+            memory: 20Mi
         securityContext:
           runAsGroup: 65532
           runAsNonRoot: true
diff --git a/manifests/blackbox-exporter-service.yaml b/manifests/blackbox-exporter-service.yaml
index 5a693e2b35ff758cc2b878507df341183bb57221..8b568e274fb73671fa6047120b53af2f1afe2a06 100644
--- a/manifests/blackbox-exporter-service.yaml
+++ b/manifests/blackbox-exporter-service.yaml
@@ -2,8 +2,10 @@ apiVersion: v1
 kind: Service
 metadata:
   labels:
+    app.kubernetes.io/component: exporter
     app.kubernetes.io/name: blackbox-exporter
-    app.kubernetes.io/version: v0.18.0
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 0.18.0
   name: blackbox-exporter
   namespace: monitoring
 spec:
@@ -15,4 +17,6 @@ spec:
     port: 19115
     targetPort: http
   selector:
+    app.kubernetes.io/component: exporter
     app.kubernetes.io/name: blackbox-exporter
+    app.kubernetes.io/part-of: kube-prometheus
diff --git a/manifests/blackbox-exporter-serviceMonitor.yaml b/manifests/blackbox-exporter-serviceMonitor.yaml
index b4b780913c522efdb588937578a954e6c1b9f2ac..ab7b5038656e148352b5786e32f7e88d473ec52d 100644
--- a/manifests/blackbox-exporter-serviceMonitor.yaml
+++ b/manifests/blackbox-exporter-serviceMonitor.yaml
@@ -2,8 +2,10 @@ apiVersion: monitoring.coreos.com/v1
 kind: ServiceMonitor
 metadata:
   labels:
+    app.kubernetes.io/component: exporter
     app.kubernetes.io/name: blackbox-exporter
-    app.kubernetes.io/version: v0.18.0
+    app.kubernetes.io/part-of: kube-prometheus
+    app.kubernetes.io/version: 0.18.0
   name: blackbox-exporter
   namespace: monitoring
 spec:
@@ -17,4 +19,6 @@ spec:
       insecureSkipVerify: true
   selector:
     matchLabels:
+      app.kubernetes.io/component: exporter
       app.kubernetes.io/name: blackbox-exporter
+      app.kubernetes.io/part-of: kube-prometheus