From 916863e4d53a254f0497695d55014ae9d8654612 Mon Sep 17 00:00:00 2001
From: Matthias Loibl <mail@matthiasloibl.com>
Date: Tue, 25 Sep 2018 17:14:30 +0200
Subject: [PATCH] contrib/kube-prometheus: Set podAntiAffinity for Prometheus &
 Alertmanager

contrib/kube-prometheus: Generate new manifests with antiAffinity

contrib/kube-prometheus: jb update

Documentation: Generate after updating kube-prometheus manifests

contrib/kube-prometheus: Move antiaffinity into own jsonnet file

foobar
---
 .../kube-prometheus-anti-affinity.libsonnet   | 39 +++++++++++++++++++
 .../prometheus/prometheus.libsonnet           | 10 +++--
 2 files changed, 45 insertions(+), 4 deletions(-)
 create mode 100644 jsonnet/kube-prometheus/kube-prometheus-anti-affinity.libsonnet

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 00000000..6956e3db
--- /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 63df0506..452a89e3 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',
-- 
GitLab