in pkg/controllers/jobset_controller.go [599:641]
func setExclusiveAffinities(job *batchv1.Job, topologyKey string) {
if job.Spec.Template.Spec.Affinity == nil {
job.Spec.Template.Spec.Affinity = &corev1.Affinity{}
}
if job.Spec.Template.Spec.Affinity.PodAffinity == nil {
job.Spec.Template.Spec.Affinity.PodAffinity = &corev1.PodAffinity{}
}
if job.Spec.Template.Spec.Affinity.PodAntiAffinity == nil {
job.Spec.Template.Spec.Affinity.PodAntiAffinity = &corev1.PodAntiAffinity{}
}
// Pod affinity ensures the pods of this job land on the same topology domain.
job.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution = append(job.Spec.Template.Spec.Affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
corev1.PodAffinityTerm{
LabelSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: jobset.JobNameKey,
Operator: metav1.LabelSelectorOpIn,
Values: []string{job.Name},
},
}},
TopologyKey: topologyKey,
NamespaceSelector: &metav1.LabelSelector{},
})
// Pod anti-affinity ensures exclusively this job lands on the topology, preventing multiple jobs per topology domain.
job.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution = append(job.Spec.Template.Spec.Affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
corev1.PodAffinityTerm{
LabelSelector: &metav1.LabelSelector{MatchExpressions: []metav1.LabelSelectorRequirement{
{
Key: jobset.JobNameKey,
Operator: metav1.LabelSelectorOpExists,
},
{
Key: jobset.JobNameKey,
Operator: metav1.LabelSelectorOpNotIn,
Values: []string{job.Name},
},
}},
TopologyKey: topologyKey,
NamespaceSelector: &metav1.LabelSelector{},
})
}