Skip to content

Commit 9728cde

Browse files
feat: Add nodeSelector to service config (#5675)
* add NodeSelector support to config Signed-off-by: Blake <[email protected]> * code review updates Signed-off-by: Blake <[email protected]> * contrived example was actually wrong Signed-off-by: Blake <[email protected]> * removing incorrect docs Signed-off-by: Blake <[email protected]> * docs are not working with description Signed-off-by: Blake <[email protected]> --------- Signed-off-by: Blake <[email protected]> Co-authored-by: Francisco Arceo <[email protected]>
1 parent 6414924 commit 9728cde

File tree

7 files changed

+337
-0
lines changed

7 files changed

+337
-0
lines changed

infra/feast-operator/api/v1alpha1/featurestore_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,7 @@ type OptionalCtrConfigs struct {
541541
EnvFrom *[]corev1.EnvFromSource `json:"envFrom,omitempty"`
542542
ImagePullPolicy *corev1.PullPolicy `json:"imagePullPolicy,omitempty"`
543543
Resources *corev1.ResourceRequirements `json:"resources,omitempty"`
544+
NodeSelector *map[string]string `json:"nodeSelector,omitempty"`
544545
}
545546

546547
// AuthzConfig defines the authorization settings for the deployed Feast services.

infra/feast-operator/api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

infra/feast-operator/config/crd/bases/feast.dev_featurestores.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,10 @@ spec:
259259
description: PullPolicy describes a policy for if/when to
260260
pull a container image
261261
type: string
262+
nodeSelector:
263+
additionalProperties:
264+
type: string
265+
type: object
262266
resources:
263267
description: ResourceRequirements describes the compute resource
264268
requirements.
@@ -1025,6 +1029,10 @@ spec:
10251029
- error
10261030
- critical
10271031
type: string
1032+
nodeSelector:
1033+
additionalProperties:
1034+
type: string
1035+
type: object
10281036
resources:
10291037
description: ResourceRequirements describes the compute
10301038
resource requirements.
@@ -1480,6 +1488,10 @@ spec:
14801488
- error
14811489
- critical
14821490
type: string
1491+
nodeSelector:
1492+
additionalProperties:
1493+
type: string
1494+
type: object
14831495
resources:
14841496
description: ResourceRequirements describes the compute
14851497
resource requirements.
@@ -1946,6 +1958,10 @@ spec:
19461958
- error
19471959
- critical
19481960
type: string
1961+
nodeSelector:
1962+
additionalProperties:
1963+
type: string
1964+
type: object
19491965
resources:
19501966
description: ResourceRequirements describes the compute
19511967
resource requirements.
@@ -2441,6 +2457,10 @@ spec:
24412457
- error
24422458
- critical
24432459
type: string
2460+
nodeSelector:
2461+
additionalProperties:
2462+
type: string
2463+
type: object
24442464
resources:
24452465
description: ResourceRequirements describes the compute resource
24462466
requirements.
@@ -4216,6 +4236,10 @@ spec:
42164236
description: PullPolicy describes a policy for if/when
42174237
to pull a container image
42184238
type: string
4239+
nodeSelector:
4240+
additionalProperties:
4241+
type: string
4242+
type: object
42194243
resources:
42204244
description: ResourceRequirements describes the compute
42214245
resource requirements.
@@ -4994,6 +5018,10 @@ spec:
49945018
- error
49955019
- critical
49965020
type: string
5021+
nodeSelector:
5022+
additionalProperties:
5023+
type: string
5024+
type: object
49975025
resources:
49985026
description: ResourceRequirements describes the compute
49995027
resource requirements.
@@ -5457,6 +5485,10 @@ spec:
54575485
- error
54585486
- critical
54595487
type: string
5488+
nodeSelector:
5489+
additionalProperties:
5490+
type: string
5491+
type: object
54605492
resources:
54615493
description: ResourceRequirements describes the compute
54625494
resource requirements.
@@ -5935,6 +5967,10 @@ spec:
59355967
- error
59365968
- critical
59375969
type: string
5970+
nodeSelector:
5971+
additionalProperties:
5972+
type: string
5973+
type: object
59385974
resources:
59395975
description: ResourceRequirements describes the
59405976
compute resource requirements.
@@ -6440,6 +6476,10 @@ spec:
64406476
- error
64416477
- critical
64426478
type: string
6479+
nodeSelector:
6480+
additionalProperties:
6481+
type: string
6482+
type: object
64436483
resources:
64446484
description: ResourceRequirements describes the compute
64456485
resource requirements.

infra/feast-operator/dist/install.yaml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,10 @@ spec:
267267
description: PullPolicy describes a policy for if/when to
268268
pull a container image
269269
type: string
270+
nodeSelector:
271+
additionalProperties:
272+
type: string
273+
type: object
270274
resources:
271275
description: ResourceRequirements describes the compute resource
272276
requirements.
@@ -1033,6 +1037,10 @@ spec:
10331037
- error
10341038
- critical
10351039
type: string
1040+
nodeSelector:
1041+
additionalProperties:
1042+
type: string
1043+
type: object
10361044
resources:
10371045
description: ResourceRequirements describes the compute
10381046
resource requirements.
@@ -1488,6 +1496,10 @@ spec:
14881496
- error
14891497
- critical
14901498
type: string
1499+
nodeSelector:
1500+
additionalProperties:
1501+
type: string
1502+
type: object
14911503
resources:
14921504
description: ResourceRequirements describes the compute
14931505
resource requirements.
@@ -1954,6 +1966,10 @@ spec:
19541966
- error
19551967
- critical
19561968
type: string
1969+
nodeSelector:
1970+
additionalProperties:
1971+
type: string
1972+
type: object
19571973
resources:
19581974
description: ResourceRequirements describes the compute
19591975
resource requirements.
@@ -2449,6 +2465,10 @@ spec:
24492465
- error
24502466
- critical
24512467
type: string
2468+
nodeSelector:
2469+
additionalProperties:
2470+
type: string
2471+
type: object
24522472
resources:
24532473
description: ResourceRequirements describes the compute resource
24542474
requirements.
@@ -4224,6 +4244,10 @@ spec:
42244244
description: PullPolicy describes a policy for if/when
42254245
to pull a container image
42264246
type: string
4247+
nodeSelector:
4248+
additionalProperties:
4249+
type: string
4250+
type: object
42274251
resources:
42284252
description: ResourceRequirements describes the compute
42294253
resource requirements.
@@ -5002,6 +5026,10 @@ spec:
50025026
- error
50035027
- critical
50045028
type: string
5029+
nodeSelector:
5030+
additionalProperties:
5031+
type: string
5032+
type: object
50055033
resources:
50065034
description: ResourceRequirements describes the compute
50075035
resource requirements.
@@ -5465,6 +5493,10 @@ spec:
54655493
- error
54665494
- critical
54675495
type: string
5496+
nodeSelector:
5497+
additionalProperties:
5498+
type: string
5499+
type: object
54685500
resources:
54695501
description: ResourceRequirements describes the compute
54705502
resource requirements.
@@ -5943,6 +5975,10 @@ spec:
59435975
- error
59445976
- critical
59455977
type: string
5978+
nodeSelector:
5979+
additionalProperties:
5980+
type: string
5981+
type: object
59465982
resources:
59475983
description: ResourceRequirements describes the
59485984
compute resource requirements.
@@ -6448,6 +6484,10 @@ spec:
64486484
- error
64496485
- critical
64506486
type: string
6487+
nodeSelector:
6488+
additionalProperties:
6489+
type: string
6490+
type: object
64516491
resources:
64526492
description: ResourceRequirements describes the compute
64536493
resource requirements.

infra/feast-operator/docs/api/markdown/ref.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ _Appears in:_
4646
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
4747
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
4848
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
49+
| `nodeSelector` _map[string]string_ | |
4950

5051

5152
#### CronJobContainerConfigs
@@ -64,6 +65,7 @@ _Appears in:_
6465
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
6566
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
6667
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
68+
| `nodeSelector` _map[string]string_ | |
6769
| `commands` _string array_ | Array of commands to be executed (in order) against a Feature Store deployment.
6870
Defaults to "feast apply" & "feast materialize-incremental $(date -u +'%Y-%m-%dT%H:%M:%S')" |
6971

@@ -566,6 +568,7 @@ _Appears in:_
566568
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
567569
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
568570
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
571+
| `nodeSelector` _map[string]string_ | |
569572

570573

571574
#### PvcConfig
@@ -688,6 +691,7 @@ _Appears in:_
688691
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
689692
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
690693
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
694+
| `nodeSelector` _map[string]string_ | |
691695
| `tls` _[TlsConfigs](#tlsconfigs)_ | |
692696
| `logLevel` _string_ | LogLevel sets the logging level for the server
693697
Allowed values: "debug", "info", "warning", "error", "critical". |
@@ -750,6 +754,7 @@ _Appears in:_
750754
| `envFrom` _[EnvFromSource](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#envfromsource-v1-core)_ | |
751755
| `imagePullPolicy` _[PullPolicy](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#pullpolicy-v1-core)_ | |
752756
| `resources` _[ResourceRequirements](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.30/#resourcerequirements-v1-core)_ | |
757+
| `nodeSelector` _map[string]string_ | |
753758
| `tls` _[TlsConfigs](#tlsconfigs)_ | |
754759
| `logLevel` _string_ | LogLevel sets the logging level for the server
755760
Allowed values: "debug", "info", "warning", "error", "critical". |

infra/feast-operator/internal/controller/services/services.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ func (feast *FeastServices) setPod(podSpec *corev1.PodSpec) error {
412412
feast.mountPvcConfigs(podSpec)
413413
feast.mountEmptyDirVolumes(podSpec)
414414
feast.mountUserDefinedVolumes(podSpec)
415+
feast.applyNodeSelector(podSpec)
415416

416417
return nil
417418
}
@@ -793,6 +794,56 @@ func (feast *FeastServices) getLogLevelForType(feastType FeastServiceType) *stri
793794
return nil
794795
}
795796

797+
func (feast *FeastServices) getNodeSelectorForType(feastType FeastServiceType) *map[string]string {
798+
if serviceConfigs := feast.getServerConfigs(feastType); serviceConfigs != nil {
799+
return serviceConfigs.ContainerConfigs.OptionalCtrConfigs.NodeSelector
800+
}
801+
return nil
802+
}
803+
804+
func (feast *FeastServices) applyNodeSelector(podSpec *corev1.PodSpec) {
805+
// Merge node selectors from all services
806+
mergedNodeSelector := make(map[string]string)
807+
808+
// Check all service types for node selector configuration
809+
allServiceTypes := append(feastServerTypes, UIFeastType)
810+
for _, feastType := range allServiceTypes {
811+
if selector := feast.getNodeSelectorForType(feastType); selector != nil && len(*selector) > 0 {
812+
for k, v := range *selector {
813+
mergedNodeSelector[k] = v
814+
}
815+
}
816+
}
817+
818+
// If no service has node selector configured, we're done
819+
if len(mergedNodeSelector) == 0 {
820+
return
821+
}
822+
823+
// Merge with any existing node selectors (from ops team or other sources)
824+
// This preserves pre-existing selectors while adding operator requirements
825+
finalNodeSelector := feast.mergeNodeSelectors(podSpec.NodeSelector, mergedNodeSelector)
826+
podSpec.NodeSelector = finalNodeSelector
827+
}
828+
829+
// mergeNodeSelectors merges existing and operator node selectors
830+
// Existing selectors are preserved, operator selectors can override existing keys
831+
func (feast *FeastServices) mergeNodeSelectors(existing, operator map[string]string) map[string]string {
832+
merged := make(map[string]string)
833+
834+
// Start with existing selectors (from ops team or other sources)
835+
for k, v := range existing {
836+
merged[k] = v
837+
}
838+
839+
// Add/override with operator selectors
840+
for k, v := range operator {
841+
merged[k] = v
842+
}
843+
844+
return merged
845+
}
846+
796847
// GetObjectMeta returns the feast k8s object metadata with type
797848
func (feast *FeastServices) GetObjectMeta() metav1.ObjectMeta {
798849
return metav1.ObjectMeta{Name: GetFeastName(feast.Handler.FeatureStore), Namespace: feast.Handler.FeatureStore.Namespace}

0 commit comments

Comments
 (0)