Skip to content

Commit ccc90c0

Browse files
[feat] Add default affinities to ensure pods:
1. prefer to be in different zones (soft rule) 2. must not be scheduled on the same node
1 parent a31bf42 commit ccc90c0

File tree

5 files changed

+57
-5
lines changed

5 files changed

+57
-5
lines changed

charts/function-mesh-operator/templates/controller-manager-deployment.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,15 @@ spec:
5757
args:
5858
- --enable-leader-election={{ .Values.controllerManager.enableLeaderElection }}
5959
- --enable-pprof={{ .Values.controllerManager.pprof.enable }}
60-
- --metrics-addr=:{{ .Values.controllerManager.metrics.port }}
61-
- --health-probe-addr=:{{ .Values.controllerManager.healthProbe.port }}
62-
- --pprof-addr=:{{ .Values.controllerManager.pprof.port }}
60+
- --metrics-addr={{ .Values.controllerManager.metrics.port }}
61+
- --health-probe-addr={{ .Values.controllerManager.healthProbe.port }}
62+
- --pprof-addr={{ .Values.controllerManager.pprof.port }}
6363
- --config-file={{ .Values.controllerManager.configFile }}
6464
- --enable-init-containers={{ .Values.controllerManager.enableInitContainers }}
6565
- --global-backend-config={{ .Values.controllerManager.globalBackendConfig }}
6666
- --global-backend-config-namespace={{ .Values.controllerManager.globalBackendConfigNamespace }}
6767
- --namespaced-backend-config={{ .Values.controllerManager.namespacedBackendConfig }}
68+
- --add-default-affinity={{ .Values.controllerManager.addDefaultAffinity }}
6869
env:
6970
- name: NAMESPACE
7071
valueFrom:

charts/function-mesh-operator/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ controllerManager:
7373
globalBackendConfig: global-backend-config
7474
globalBackendConfigNamespace: default
7575
namespacedBackendConfig: backend-config
76+
addDefaultAffinity: true
7677

7778
admissionWebhook:
7879
enabled: true

controllers/spec/common.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,10 @@ func makePodTemplate(container *corev1.Container, filebeatContainer *corev1.Cont
463463
if filebeatContainer != nil {
464464
containers = append(containers, *filebeatContainer)
465465
}
466+
mergedLabels := mergeMaps(labels, Configs.ResourceLabels, policy.Labels)
466467
return &corev1.PodTemplateSpec{
467468
ObjectMeta: metav1.ObjectMeta{
468-
Labels: mergeMaps(labels, Configs.ResourceLabels, policy.Labels),
469+
Labels: mergedLabels,
469470
Annotations: generateAnnotations(Configs.ResourceAnnotations, policy.Annotations),
470471
},
471472
Spec: corev1.PodSpec{
@@ -474,7 +475,7 @@ func makePodTemplate(container *corev1.Container, filebeatContainer *corev1.Cont
474475
TerminationGracePeriodSeconds: policy.TerminationGracePeriodSeconds,
475476
Volumes: volumes,
476477
NodeSelector: policy.NodeSelector,
477-
Affinity: policy.Affinity,
478+
Affinity: GenerateAffinity(policy.Affinity, mergedLabels),
478479
Tolerations: policy.Tolerations,
479480
SecurityContext: podSecurityContext,
480481
ImagePullSecrets: policy.ImagePullSecrets,
@@ -483,6 +484,50 @@ func makePodTemplate(container *corev1.Container, filebeatContainer *corev1.Cont
483484
}
484485
}
485486

487+
func GenerateAffinity(affinity *corev1.Affinity, labels map[string]string) *corev1.Affinity {
488+
if !utils.AddDefaultAffinity {
489+
return affinity
490+
}
491+
if affinity == nil {
492+
affinity = &corev1.Affinity{}
493+
}
494+
if affinity.PodAntiAffinity == nil {
495+
affinity.PodAntiAffinity = &corev1.PodAntiAffinity{}
496+
}
497+
498+
// add default pod anti-affinity rules to ensure replica pods doesn't run on the same node
499+
if affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution == nil {
500+
affinity.PodAffinity.RequiredDuringSchedulingIgnoredDuringExecution = []corev1.PodAffinityTerm{}
501+
}
502+
affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution = append(
503+
affinity.PodAntiAffinity.RequiredDuringSchedulingIgnoredDuringExecution,
504+
corev1.PodAffinityTerm{
505+
LabelSelector: &metav1.LabelSelector{
506+
MatchLabels: labels,
507+
},
508+
TopologyKey: "kubernetes.io/hostname",
509+
},
510+
)
511+
512+
// add default pod anti-affinity rules to ensure replica pods prefer running in different zones
513+
if affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution == nil {
514+
affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution = []corev1.WeightedPodAffinityTerm{}
515+
}
516+
affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution = append(
517+
affinity.PodAntiAffinity.PreferredDuringSchedulingIgnoredDuringExecution,
518+
corev1.WeightedPodAffinityTerm{
519+
Weight: 100,
520+
PodAffinityTerm: corev1.PodAffinityTerm{
521+
LabelSelector: &metav1.LabelSelector{
522+
MatchLabels: labels,
523+
},
524+
TopologyKey: "topology.kubernetes.io/zone",
525+
},
526+
},
527+
)
528+
return affinity
529+
}
530+
486531
func MakeJavaFunctionCommand(downloadPath, packageFile, name, clusterName, generateLogConfigCommand, logLevel, details, extraDependenciesDir, uid string,
487532
memory *resource.Quantity, javaOpts []string, hasPulsarctl, hasWget, authProvided, tlsProvided bool, secretMaps map[string]v1alpha1.SecretRef,
488533
state *v1alpha1.Stateful,

main.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ func main() {
7979
var globalBackendConfigNamespace string
8080
var namespacedBackendConfig string
8181
var secureMetrics bool
82+
var addDefaultAffinity bool
8283
flag.StringVar(&metricsAddr, "metrics-addr", lookupEnvOrString("METRICS_ADDR", ":8443"),
8384
"The address the metric endpoint binds to.")
8485
flag.StringVar(&leaderElectionID, "leader-election-id",
@@ -112,13 +113,16 @@ func main() {
112113
"The backend config name used for functions&sinks&sources in the same namespace")
113114
flag.BoolVar(&secureMetrics, "metrics-secure", true, "If set, the metrics endpoint is served securely via HTTPS."+
114115
" Use --metrics-secure=false to use HTTP instead.")
116+
flag.BoolVar(&addDefaultAffinity, "add-default-affinity", lookupEnvOrBool("ADD_DEFAULT_AFFINITY", true), "If set, the generated pod will add two default podAntiAffinities:"+
117+
" one is make pods prefer to be in different zones (soft rule), and one is make pods must not be scheduled on the same node (hard rule).")
115118
flag.Parse()
116119

117120
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
118121
utils.EnableInitContainers = enableInitContainers
119122
utils.GlobalBackendConfig = globalBackendConfig
120123
utils.GlobalBackendConfigNamespace = globalBackendConfigNamespace
121124
utils.NamespacedBackendConfig = namespacedBackendConfig
125+
utils.AddDefaultAffinity = addDefaultAffinity
122126

123127
// enable pprof
124128
if enablePprof {

utils/configs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,4 @@ var EnableInitContainers = false
2222
var GlobalBackendConfig = ""
2323
var GlobalBackendConfigNamespace = "default"
2424
var NamespacedBackendConfig = ""
25+
var AddDefaultAffinity = true

0 commit comments

Comments
 (0)