diff --git a/jsonnet/kube-prometheus/addons/anti-affinity.libsonnet b/jsonnet/kube-prometheus/addons/anti-affinity.libsonnet
index 3f55d2687a882c243395976851711441eadea97a..56ea5303b900f1af4576295864751567c3481a3a 100644
--- a/jsonnet/kube-prometheus/addons/anti-affinity.libsonnet
+++ b/jsonnet/kube-prometheus/addons/anti-affinity.libsonnet
@@ -1,38 +1,69 @@
 {
-  local antiaffinity(key, values, namespace) = {
+  values+:: {
+    alertmanager+: {
+      podAntiAffinity: 'soft',
+      podAntiAffinityTopologyKey: 'kubernetes.io/hostname',
+    },
+    prometheus+: {
+      podAntiAffinity: 'soft',
+      podAntiAffinityTopologyKey: 'kubernetes.io/hostname',
+    },
+    blackboxExporter+: {
+      podAntiAffinity: 'soft',
+      podAntiAffinityTopologyKey: 'kubernetes.io/hostname',
+    },
+  },
+
+  local antiaffinity(key, values, namespace, type, topologyKey) = {
+    local podAffinityTerm = {
+      namespaces: [namespace],
+      topologyKey: topologyKey,
+      labelSelector: {
+        matchExpressions: [{
+          key: key,
+          operator: 'In',
+          values: values,
+        }],
+      },
+    },
+
     affinity: {
-      podAntiAffinity: {
-        preferredDuringSchedulingIgnoredDuringExecution: [
-          {
-            weight: 100,
-            podAffinityTerm: {
-              namespaces: [namespace],
-              topologyKey: 'kubernetes.io/hostname',
-              labelSelector: {
-                matchExpressions: [{
-                  key: key,
-                  operator: 'In',
-                  values: values,
-                }],
-              },
-            },
-          },
+      podAntiAffinity: if type == 'soft' then {
+        preferredDuringSchedulingIgnoredDuringExecution: [{
+          weight: 100,
+          podAffinityTerm: podAffinityTerm,
+        }],
+      } else if type == 'hard' then {
+        requiredDuringSchedulingIgnoredDuringExecution: [
+          podAffinityTerm,
         ],
-      },
+      } else error 'podAntiAffinity must be either "soft" or "hard"',
     },
   },
 
   alertmanager+: {
     alertmanager+: {
       spec+:
-        antiaffinity('alertmanager', [$.values.alertmanager.name], $.values.common.namespace),
+        antiaffinity(
+          'alertmanager',
+          [$.values.alertmanager.name],
+          $.values.common.namespace,
+          $.values.alertmanager.podAntiAffinity,
+          $.values.alertmanager.podAntiAffinityTopologyKey,
+        ),
     },
   },
 
   prometheus+: {
     prometheus+: {
       spec+:
-        antiaffinity('prometheus', [$.values.prometheus.name], $.values.common.namespace),
+        antiaffinity(
+          'prometheus',
+          [$.values.prometheus.name],
+          $.values.common.namespace,
+          $.values.prometheus.podAntiAffinity,
+          $.values.prometheus.podAntiAffinityTopologyKey,
+        ),
     },
   },
 
@@ -41,7 +72,13 @@
       spec+: {
         template+: {
           spec+:
-            antiaffinity('app.kubernetes.io/name', ['blackbox-exporter'], $.values.common.namespace),
+            antiaffinity(
+              'app.kubernetes.io/name',
+              ['blackbox-exporter'],
+              $.values.common.namespace,
+              $.values.blackboxExporter.podAntiAffinity,
+              $.values.blackboxExporter.podAntiAffinityTopologyKey,
+            ),
         },
       },
     },