Title: Feast operator always deploys an online store, regardless of CR configuration · Issue #6586 · feast-dev/feast · GitHub
Open Graph Title: Feast operator always deploys an online store, regardless of CR configuration · Issue #6586 · feast-dev/feast
X Title: Feast operator always deploys an online store, regardless of CR configuration · Issue #6586 · feast-dev/feast
Description: Expected Behavior The Feast operator should deploy only the services declared in a FeatureStore CR. It should be possible to deploy a standalone registry or a standalone offline store, with no online store, by simply not specifying spec....
Open Graph Description: Expected Behavior The Feast operator should deploy only the services declared in a FeatureStore CR. It should be possible to deploy a standalone registry or a standalone offline store, with no onli...
X Description: Expected Behavior The Feast operator should deploy only the services declared in a FeatureStore CR. It should be possible to deploy a standalone registry or a standalone offline store, with no onli...
Opengraph URL: https://github.com/feast-dev/feast/issues/6586
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Feast operator always deploys an online store, regardless of CR configuration","articleBody":"## Expected Behavior \n\nThe Feast operator should deploy only the services declared in a FeatureStore CR. It should be possible to deploy a standalone registry or a standalone offline store, with no online store, by simply not specifying spec.services.onlineStore. This mirrors how registry and offlineStore already behave and is required by the documented [federated / shared registry pattern](https://docs.feast.dev/how-to-guides/feast-snowflake-gcp-aws/federated-feature-store).\n\n## Current Behavior\n\nThe operator always deploys an online store service (including a serving pod), even when the CR does not declare spec.services.onlineStore. Root cause is in ApplyDefaultsToStatus ([internal/controller/services/util.go](https://github.com/feast-dev/feast/blob/master/infra/feast-operator/internal/controller/services/util.go#L166)):\n\n```go\n// default to onlineStore service deployment\nif services.OnlineStore == nil {\n services.OnlineStore = \u0026feastdevv1.OnlineStore{}\n}\n// ...\nif services.OnlineStore.Server == nil {\n services.OnlineStore.Server = \u0026feastdevv1.ServerConfigs{} // forces a serving pod\n}\n```\n\nUnlike registry `(if services.Registry != nil)` and `offlineStore (if services.OfflineStore != nil)`, which are only defaulted when declared, and whose `.Server` is only defaulted when already present, the onlineStore block runs unconditionally and creates Server from nil.\n\nDownstream:\n\n1. `isOnlineStore()` is always true → `reconcileServices()` always deploys the online store, and `isOnlineServer()` is always true. There's no opt-out, the `OnlineStore` CRD type has no `disabled` field. (This also makes the \"at least one local server must be configured\" guard in `Deploy()` unreachable.)\n2. The scaling admission validation is asymmetric ([api/v1/featurestore_types.go](https://github.com/feast-dev/feast/blob/master/infra/feast-operator/api/v1/featurestore_types.go#L148)): the offline rule allows the store to be absent (`!has(self.services.offlineStore) || ...`), but the online rule requires it to exist and be DB-backed. So scaling a registry-only/offline-only store fails admission with `Scaling requires DB-backed persistence for the online store. Configure services.onlineStore.persistence.store when using replicas \u003e 1 or autoscaling.`, forcing DB persistence for an online store the user never asked for.\n\n## Steps to reproduce\n\n1. Apply a CR declaring only a registry (or only an offline store), with no `spec.services.onlineStore`.\n2. `kubectl get deploy -l feast.dev/name=\u003cname\u003e` → an online/feature-server container is deployed alongside the registry (expected: registry only).\n3. Add `spec.replicas: 2` (or `services.scaling.autoscaling`) to that registry-only CR → rejected at admission with the online-store DB-persistence error, despite no online store being declared.\n\n### Specifications\n\n- Version: 0.64.0\n- Platform: Kubernetes\n- Subsystem: feast-operator — internal/controller/services\n\n## Possible Solution\n\n1. Guard the online-store block in `ApplyDefaultsToStatus` with if `services.OnlineStore != nil { ... }` (and only default Server when already present), making it symmetric with registry/offline. Preferable to adding a new opt-out API field.\n2. Add an \"online store absent\" escape hatch to the online CEL rule (`!has(self.services.onlineStore) || (...)`), matching the offline rule.\n3. Keep `noLocalCoreServerConfigured()` enforcing that at least one core server is deployed.\n\nHappy to open a PR! 😄 \n","author":{"url":"https://github.com/dbbvitor","@type":"Person","name":"dbbvitor"},"datePublished":"2026-07-07T13:06:16.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/6586/feast/issues/6586"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:5bd7ce6d-fc9e-3635-ba04-c2f83413fc65 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E8AE:118815:234951A:323E7BD:6A50F086 |
| html-safe-nonce | 25cbdbc37c664347187e7e86ba5dd483a7e07c5de9e1b9af168d587d8ec7ccce |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFOEFFOjExODgxNToyMzQ5NTFBOjMyM0U3QkQ6NkE1MEYwODYiLCJ2aXNpdG9yX2lkIjoiNjExNDk3OTYzOTU4Njc3OTI3MCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | d2f2aee73a6dcde9feaa5dba5a120dd7bd7fc61d89d541dc11a1fbdf4be069db |
| hovercard-subject-tag | issue:4828788978 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/feast-dev/feast/6586/issue_layout |
| twitter:image | https://opengraph.githubassets.com/cd1069a9d7679e245a33a19e1bb33cac54bfc62e39e614e73272f24fa099865e/feast-dev/feast/issues/6586 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/cd1069a9d7679e245a33a19e1bb33cac54bfc62e39e614e73272f24fa099865e/feast-dev/feast/issues/6586 |
| og:image:alt | Expected Behavior The Feast operator should deploy only the services declared in a FeatureStore CR. It should be possible to deploy a standalone registry or a standalone offline store, with no onli... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | dbbvitor |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5266e58c17a510c403505cc811606465e90a881d2007ee7df1c4800d5c659838 |
| turbo-cache-control | no-preview |
| go-import | github.com/feast-dev/feast git https://github.com/feast-dev/feast.git |
| octolytics-dimension-user_id | 57027613 |
| octolytics-dimension-user_login | feast-dev |
| octolytics-dimension-repository_id | 161133770 |
| octolytics-dimension-repository_nwo | feast-dev/feast |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 161133770 |
| octolytics-dimension-repository_network_root_nwo | feast-dev/feast |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 5ec60191a48933536a90c8a19f47142fcd0d4739 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width