Skip to content

Commit 4d3d3db

Browse files
committedOct 27, 2020
Set topologySpreadConstraints by default
- "topology.kubernetes.io/zone" is a popular label set by kubelet on worker nodes - "ScheduleAnyways" makes sure that this constraint is treated as a soft requirement, and pods still get scheduled without meeting the requirement - using hostname as topologyKey is also a valid contraint. However, the official docs recommends not to set multiple contraints if possible to aviod conflicts
1 parent 7d080b4 commit 4d3d3db

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed
 

Diff for: ‎internal/resource/statefulset.go

+13
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,19 @@ func (builder *StatefulSetBuilder) podTemplateSpec(annotations, labels map[strin
491491
Labels: labels,
492492
},
493493
Spec: corev1.PodSpec{
494+
TopologySpreadConstraints: []corev1.TopologySpreadConstraint{
495+
{
496+
MaxSkew: 1,
497+
// "topology.kubernetes.io/zone" is a well-known label.
498+
// It is automatically set by kubelet if the cloud provider provides the zone information.
499+
// See: https://kubernetes.io/docs/reference/kubernetes-api/labels-annotations-taints/#topologykubernetesiozone
500+
TopologyKey: "topology.kubernetes.io/zone",
501+
WhenUnsatisfiable: corev1.ScheduleAnyway,
502+
LabelSelector: &metav1.LabelSelector{
503+
MatchLabels: metadata.LabelSelector(builder.Instance.Name),
504+
},
505+
},
506+
},
494507
SecurityContext: &corev1.PodSecurityContext{
495508
FSGroup: &rabbitmqGID,
496509
RunAsGroup: &rabbitmqGID,

Diff for: ‎internal/resource/statefulset_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,23 @@ var _ = Describe("StatefulSet", func() {
692692
Expect(*statefulSet.Spec.Replicas).To(Equal(int32(1)))
693693
})
694694

695+
It("sets a TopologySpreadConstraint", func() {
696+
stsBuilder := builder.StatefulSet()
697+
Expect(stsBuilder.Update(statefulSet)).To(Succeed())
698+
699+
Expect(statefulSet.Spec.Template.Spec.TopologySpreadConstraints).To(ConsistOf(
700+
corev1.TopologySpreadConstraint{
701+
MaxSkew: 1,
702+
TopologyKey: "topology.kubernetes.io/zone",
703+
WhenUnsatisfiable: corev1.ScheduleAnyway,
704+
LabelSelector: &metav1.LabelSelector{
705+
MatchLabels: map[string]string{
706+
"app.kubernetes.io/name": instance.Name,
707+
},
708+
},
709+
}))
710+
})
711+
695712
It("has resources requirements on the init container", func() {
696713
stsBuilder := builder.StatefulSet()
697714
Expect(stsBuilder.Update(statefulSet)).To(Succeed())
@@ -1236,6 +1253,18 @@ var _ = Describe("StatefulSet", func() {
12361253
Spec: &rabbitmqv1beta1.StatefulSetSpec{
12371254
Template: &rabbitmqv1beta1.PodTemplateSpec{
12381255
Spec: &corev1.PodSpec{
1256+
TopologySpreadConstraints: []corev1.TopologySpreadConstraint{
1257+
{
1258+
MaxSkew: 1,
1259+
TopologyKey: "my-topology",
1260+
WhenUnsatisfiable: corev1.DoNotSchedule,
1261+
LabelSelector: &metav1.LabelSelector{
1262+
MatchLabels: map[string]string{
1263+
"key": "value",
1264+
},
1265+
},
1266+
},
1267+
},
12391268
Containers: []corev1.Container{
12401269
{
12411270
Name: "rabbitmq",
@@ -1273,6 +1302,29 @@ var _ = Describe("StatefulSet", func() {
12731302
stsBuilder := builder.StatefulSet()
12741303
Expect(stsBuilder.Update(statefulSet)).To(Succeed())
12751304

1305+
Expect(statefulSet.Spec.Template.Spec.TopologySpreadConstraints).To(ConsistOf(
1306+
corev1.TopologySpreadConstraint{
1307+
MaxSkew: 1,
1308+
TopologyKey: "my-topology",
1309+
WhenUnsatisfiable: corev1.DoNotSchedule,
1310+
LabelSelector: &metav1.LabelSelector{
1311+
MatchLabels: map[string]string{
1312+
"key": "value",
1313+
},
1314+
},
1315+
},
1316+
corev1.TopologySpreadConstraint{
1317+
MaxSkew: 1,
1318+
TopologyKey: "topology.kubernetes.io/zone",
1319+
WhenUnsatisfiable: corev1.ScheduleAnyway,
1320+
LabelSelector: &metav1.LabelSelector{
1321+
MatchLabels: map[string]string{
1322+
"app.kubernetes.io/name": instance.Name,
1323+
},
1324+
},
1325+
},
1326+
))
1327+
12761328
Expect(extractContainer(statefulSet.Spec.Template.Spec.Containers, "rabbitmq").Env).To(ConsistOf(
12771329
corev1.EnvVar{
12781330
Name: "test1",

0 commit comments

Comments
 (0)
Please sign in to comment.