diff --git a/README.md b/README.md
index 0bb77a10fb59d771beff2dd8ea2b25d50e89265e..d1412a0af328bbaef03196f36629b8cd50b44976 100644
--- a/README.md
+++ b/README.md
@@ -361,57 +361,28 @@ Jsonnet is a turing complete language, any logic can be reflected in it. It also
 
 ### Cluster Creation Tools
 
-A common example is that not all Kubernetes clusters are created exactly the same way, meaning the configuration to monitor them may be slightly different. For [kubeadm](examples/jsonnet-snippets/kubeadm.jsonnet), [bootkube](examples/jsonnet-snippets/bootkube.jsonnet), [kops](examples/jsonnet-snippets/kops.jsonnet) and [kubespray](examples/jsonnet-snippets/kubespray.jsonnet) clusters there are mixins available to easily configure these:
+A common example is that not all Kubernetes clusters are created exactly the same way, meaning the configuration to monitor them may be slightly different. For the following clusters there are mixins available to easily configure them:
 
-kubeadm:
+* aws
+* bootkube
+* eks
+* gke
+* kops-coredns
+* kubeadm
+* kubespray
 
-[embedmd]:# (examples/jsonnet-snippets/kubeadm.jsonnet)
-```jsonnet
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kubeadm.libsonnet')
-```
-
-bootkube:
-
-[embedmd]:# (examples/jsonnet-snippets/bootkube.jsonnet)
-```jsonnet
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/bootkube.libsonnet')
-```
-
-kops:
-
-[embedmd]:# (examples/jsonnet-snippets/kops.jsonnet)
-```jsonnet
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kops.libsonnet')
-```
-
-kops with CoreDNS:
-
-If your kops cluster is using CoreDNS, there is an additional mixin to import.
+These mixins are selectable via the `platform` field of kubePrometheus:
 
-[embedmd]:# (examples/jsonnet-snippets/kops-coredns.jsonnet)
+[embedmd]:# (examples/jsonnet-snippets/platform.jsonnet)
 ```jsonnet
 (import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kops.libsonnet') +
-(import 'kube-prometheus/platforms/kops-coredns.libsonnet')
-```
-
-kubespray:
-
-[embedmd]:# (examples/jsonnet-snippets/kubespray.jsonnet)
-```jsonnet
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kubespray.libsonnet')
-```
-
-aws:
-
-[embedmd]:# (examples/jsonnet-snippets/aws.jsonnet)
-```jsonnet
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/aws.libsonnet')
+{
+  values+:: {
+    kubePrometheus+: {
+      platform: 'example-platform',
+    },
+  },
+}
 ```
 
 ### Internal Registry
diff --git a/docs/EKS-cni-support.md b/docs/EKS-cni-support.md
index 266d5fcbab1e7402765c8b4f142283b6ba25ca1c..1cd8b146471674287f0c6690e59b93829a7b1f9a 100644
--- a/docs/EKS-cni-support.md
+++ b/docs/EKS-cni-support.md
@@ -7,12 +7,14 @@ One fatal issue that can occur is that you run out of IP addresses in your eks c
 You can monitor the `awscni` using kube-promethus with : 
 [embedmd]:# (../examples/eks-cni-example.jsonnet)
 ```jsonnet
-local kp = (import 'kube-prometheus/main.libsonnet') +
-           (import 'kube-prometheus/platforms/eks.libsonnet') + {
+local kp = (import 'kube-prometheus/main.libsonnet') + {
   values+:: {
     common+: {
       namespace: 'monitoring',
     },
+    kubePrometheus+: {
+      platform: 'eks',
+    },
   },
   kubernetesControlPlane+: {
     prometheusRuleEksCNI+: {
diff --git a/examples/eks-cni-example.jsonnet b/examples/eks-cni-example.jsonnet
index c92236fe4810a5cbd343e40dd94652cd4209ba1f..1b37af501225eb85a49b1eb40fe55e4aa6b8a62a 100644
--- a/examples/eks-cni-example.jsonnet
+++ b/examples/eks-cni-example.jsonnet
@@ -1,9 +1,11 @@
-local kp = (import 'kube-prometheus/main.libsonnet') +
-           (import 'kube-prometheus/platforms/eks.libsonnet') + {
+local kp = (import 'kube-prometheus/main.libsonnet') + {
   values+:: {
     common+: {
       namespace: 'monitoring',
     },
+    kubePrometheus+: {
+      platform: 'eks',
+    },
   },
   kubernetesControlPlane+: {
     prometheusRuleEksCNI+: {
diff --git a/examples/jsonnet-snippets/aws.jsonnet b/examples/jsonnet-snippets/aws.jsonnet
deleted file mode 100644
index 6eaca09ff8941bfabefc0a963566cc9316f0c395..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/aws.jsonnet
+++ /dev/null
@@ -1,2 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/aws.libsonnet')
diff --git a/examples/jsonnet-snippets/bootkube.jsonnet b/examples/jsonnet-snippets/bootkube.jsonnet
deleted file mode 100644
index 3d9f3482f86cdcd48591ed4eb9bbf8d502ad78e6..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/bootkube.jsonnet
+++ /dev/null
@@ -1,2 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/bootkube.libsonnet')
diff --git a/examples/jsonnet-snippets/kops-coredns.jsonnet b/examples/jsonnet-snippets/kops-coredns.jsonnet
deleted file mode 100644
index d1af478b73240a1d5585022b34f1b87f512f7023..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/kops-coredns.jsonnet
+++ /dev/null
@@ -1,3 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kops.libsonnet') +
-(import 'kube-prometheus/platforms/kops-coredns.libsonnet')
diff --git a/examples/jsonnet-snippets/kops.jsonnet b/examples/jsonnet-snippets/kops.jsonnet
deleted file mode 100644
index 9271b993d38e35c0161e6d88fa1214c6a94e9518..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/kops.jsonnet
+++ /dev/null
@@ -1,2 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kops.libsonnet')
diff --git a/examples/jsonnet-snippets/kubeadm.jsonnet b/examples/jsonnet-snippets/kubeadm.jsonnet
deleted file mode 100644
index 0750b4b39bc1fb9ff6ce064da19cd0555edc60e7..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/kubeadm.jsonnet
+++ /dev/null
@@ -1,2 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kubeadm.libsonnet')
diff --git a/examples/jsonnet-snippets/kubespray.jsonnet b/examples/jsonnet-snippets/kubespray.jsonnet
deleted file mode 100644
index d9bb3bd51f4cd319b401d9d0062a7a38395dc79d..0000000000000000000000000000000000000000
--- a/examples/jsonnet-snippets/kubespray.jsonnet
+++ /dev/null
@@ -1,2 +0,0 @@
-(import 'kube-prometheus/main.libsonnet') +
-(import 'kube-prometheus/platforms/kubespray.libsonnet')
diff --git a/examples/jsonnet-snippets/platform.jsonnet b/examples/jsonnet-snippets/platform.jsonnet
new file mode 100644
index 0000000000000000000000000000000000000000..a3ad9c3d8f924d7b0051350ab8e19ea6f0122397
--- /dev/null
+++ b/examples/jsonnet-snippets/platform.jsonnet
@@ -0,0 +1,8 @@
+(import 'kube-prometheus/main.libsonnet') +
+{
+  values+:: {
+    kubePrometheus+: {
+      platform: 'example-platform',
+    },
+  },
+}
diff --git a/examples/minikube.jsonnet b/examples/minikube.jsonnet
index 87b88d6963625c5c5a03fb2304f4de217e418cff..c5a1bc685f8ebb0a4165571cec87fa8ecbbd64f1 100644
--- a/examples/minikube.jsonnet
+++ b/examples/minikube.jsonnet
@@ -1,6 +1,5 @@
 local kp =
   (import 'kube-prometheus/main.libsonnet') +
-  (import 'kube-prometheus/platforms/kubeadm.libsonnet') +
   // Note that NodePort type services is likely not a good idea for your production use case, it is only used for demonstration purposes here.
   (import 'kube-prometheus/addons/node-ports.libsonnet') +
   {
@@ -19,6 +18,9 @@ local kp =
           },
         },
       },
+      kubePrometheus+: {
+        platform: 'kubeadm',
+      },
     },
 
     // For simplicity, each of the following values for 'externalUrl':
diff --git a/jsonnet/kube-prometheus/main.libsonnet b/jsonnet/kube-prometheus/main.libsonnet
index 462f9aeff6ba23f986c37e007e166e7c31b75f17..1c13b7b9d0744404ed405ba4a0869f61b6bc6e00 100644
--- a/jsonnet/kube-prometheus/main.libsonnet
+++ b/jsonnet/kube-prometheus/main.libsonnet
@@ -9,6 +9,8 @@ local prometheusAdapter = import './components/prometheus-adapter.libsonnet';
 local prometheusOperator = import './components/prometheus-operator.libsonnet';
 local prometheus = import './components/prometheus.libsonnet';
 
+local platformPatch = import './platforms/platforms.libsonnet';
+
 {
   // using `values` as this is similar to helm
   values:: {
@@ -104,6 +106,7 @@ local prometheus = import './components/prometheus.libsonnet';
     kubePrometheus: {
       namespace: $.values.common.namespace,
       mixin+: { ruleLabels: $.values.common.ruleLabels },
+      platform: null,
     },
   },
 
@@ -125,4 +128,4 @@ local prometheus = import './components/prometheus.libsonnet';
       },
     },
   },
-}
+} + platformPatch
diff --git a/jsonnet/kube-prometheus/platforms/README.md b/jsonnet/kube-prometheus/platforms/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..45eb76d17a7d091c710455b4d8364f3b4668f8b1
--- /dev/null
+++ b/jsonnet/kube-prometheus/platforms/README.md
@@ -0,0 +1,3 @@
+# Adding a new platform specific configuration
+
+Adding a new platform specific configuration requires to update the [README](../../../README.md#cluster-creation-tools) and the [platforms.jsonnet](./platform.jsonnet) file by adding the platform to the list of existing ones. This allow the new platform to be discoverable and easily configurable by the users.
diff --git a/jsonnet/kube-prometheus/platforms/platforms.libsonnet b/jsonnet/kube-prometheus/platforms/platforms.libsonnet
new file mode 100644
index 0000000000000000000000000000000000000000..979190f21e62040a68073b23238bb983bee24cd9
--- /dev/null
+++ b/jsonnet/kube-prometheus/platforms/platforms.libsonnet
@@ -0,0 +1,41 @@
+local platforms = {
+  aws: import './aws.libsonnet',
+  bootkube: import './bootkube.libsonnet',
+  gke: import './gke.libsonnet',
+  eks: import './eks.libsonnet',
+  kops: import './kops.libsonnet',
+  kops_coredns: (import './kops.libsonnet') + (import './kops-coredns.libsonnet'),
+  kubeadm: import './kubeadm.libsonnet',
+  kubespray: import './kubespray.libsonnet',
+};
+
+// platformPatch returns the platform specific patch associated to the given
+// platform.
+local platformPatch(p) = if p != null && std.objectHas(platforms, p) then platforms[p] else {};
+
+{
+  // initialize the object to prevent "Indexed object has no field" lint errors
+  local p = {
+    alertmanager: {},
+    blackboxExporter: {},
+    grafana: {},
+    kubeStateMetrics: {},
+    nodeExporter: {},
+    prometheus: {},
+    prometheusAdapter: {},
+    prometheusOperator: {},
+    kubernetesControlPlane: {},
+    kubePrometheus: {},
+  } + platformPatch($.values.kubePrometheus.platform),
+
+  alertmanager+: p.alertmanager,
+  blackboxExporter+: p.blackboxExporter,
+  grafana+: p.grafana,
+  kubeStateMetrics+: p.kubeStateMetrics,
+  nodeExporter+: p.nodeExporter,
+  prometheus+: p.prometheus,
+  prometheusAdapter+: p.prometheusAdapter,
+  prometheusOperator+: p.prometheusOperator,
+  kubernetesControlPlane+: p.kubernetesControlPlane,
+  kubePrometheus+: p.kubePrometheus,
+}