diff --git a/jsonnet/kube-prometheus/kube-prometheus-anti-affinity.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-anti-affinity.libsonnet
new file mode 100644
index 0000000000000000000000000000000000000000..6956e3db64ec4ff6926b985cd526a9ab7a601766
--- /dev/null
+++ b/jsonnet/kube-prometheus/kube-prometheus-anti-affinity.libsonnet
@@ -0,0 +1,39 @@
+local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet';
+local statefulSet = k.apps.v1beta2.statefulSet;
+local affinity = statefulSet.mixin.spec.template.spec.affinity.podAntiAffinity.preferredDuringSchedulingIgnoredDuringExecutionType;
+local matchExpression = affinity.mixin.podAffinityTerm.labelSelector.matchExpressionsType;
+
+{
+  local antiaffinity(key, values) = {
+    affinity: {
+      podAntiAffinity: {
+        preferredDuringSchedulingIgnoredDuringExecution: [
+          affinity.new() +
+          affinity.withWeight(100) +
+          affinity.mixin.podAffinityTerm.withNamespaces($._config.namespace) +
+          affinity.mixin.podAffinityTerm.withTopologyKey('kubernetes.io/hostname') +
+          affinity.mixin.podAffinityTerm.labelSelector.withMatchExpressions([
+            matchExpression.new() +
+            matchExpression.withKey(key) +
+            matchExpression.withOperator('In') +
+            matchExpression.withValues(values),
+          ]),
+        ],
+      },
+    },
+  },
+
+  alertmanager+:: {
+    alertmanager+: {
+      spec+:
+        antiaffinity('alertmanager', [$._config.alertmanager.name]),
+    },
+  },
+
+  prometheus+: {
+    prometheus+: {
+      spec+:
+        antiaffinity('prometheus', [$._config.prometheus.name]),
+    },
+  },
+}
diff --git a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
index 63df0506396f27b8a651ddf1a7d6444a78ae8a7b..452a89e33a6d57065ec83e77985569ec04ab1830 100644
--- a/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/prometheus/prometheus.libsonnet
@@ -144,12 +144,14 @@ local k = import 'ksonnet/ksonnet.beta.3/k.libsonnet';
       local roleList = k.rbac.v1.roleList;
       roleList.new([newSpecificRole(x) for x in $._config.prometheus.namespaces]),
     prometheus:
-      local container = k.core.v1.pod.mixin.spec.containersType;
+      local statefulSet = k.apps.v1beta2.statefulSet;
+      local container = statefulSet.mixin.spec.template.spec.containersType;
       local resourceRequirements = container.mixin.resourcesType;
-      local selector = k.apps.v1beta2.deployment.mixin.spec.selectorType;
+      local selector = statefulSet.mixin.spec.selectorType;
 
-      local resources = resourceRequirements.new() +
-                        resourceRequirements.withRequests({ memory: '400Mi' });
+      local resources =
+        resourceRequirements.new() +
+        resourceRequirements.withRequests({ memory: '400Mi' });
 
       {
         apiVersion: 'monitoring.coreos.com/v1',