Skip to content

Commit 725a147

Browse files
dbbvitorntkathole
andauthored
feat: Add dualStack server option to the Feast operator (#6887)
* feat: Add dualStack server option to the Feast operator Add a DualStack field to ServerConfigs that binds server processes to the IPv6 wildcard address instead of 0.0.0.0, so they also accept IPv4 clients on dual-stack or IPv6-only clusters. Online and offline servers use the bracketed [::] form required by gunicorn and Arrow Flight; ui, lineage, and registry keep their existing behavior or use the bare :: form uvicorn expects. The registry server always binds dual-stack and ignores this setting. Signed-off-by: dbbvitor <[email protected]> * test: Cover -h boundary positions in withBindHost Mutation testing found survivors in withBindHost's loop bounds: an -h flag as the very last argument (no value to replace) and one as the first argument were both untested edge cases. Signed-off-by: dbbvitor <[email protected]> * fix: Let the registry opt out of its dual-stack REST bind The registry's REST server binds dual-stack by default in the SDK CLI. Render -h 0.0.0.0 only when the shared DualStack field is explicitly set to false, so nil/true keep today's dual-stack default instead of silently going IPv4-only. Signed-off-by: dbbvitor <[email protected]> * chore: Refresh secrets baseline timestamp to match master Only the generated_at metadata field diverged from master, which was enough for GitHub to report this PR as unmergeable and apparently skip queuing CI. No scan content changed. Signed-off-by: dbbvitor <[email protected]> * fix(operator): Make default registry REST to IPv4 and dualStack opt-in Make unset or false dualStack render an explicit 0.0.0.0 host flag. Only dualStack=true selects the bare IPv6 wildcard, aligning registry REST defaults with other host-flag servers. Signed-off-by: dbbvitor <[email protected]> * feat: Bind the standalone MCP server dual-stack with dualStack Route the MCP --host through withBindHost, so mcpServer.dualStack renders :: instead of 0.0.0.0. The MCP server itself needs feast mcp --host :: support (#6977). Signed-off-by: dbbvitor <[email protected]> --------- Signed-off-by: dbbvitor <[email protected]> Co-authored-by: Nikhil Kathole <[email protected]>
1 parent af20fe4 commit 725a147

15 files changed

Lines changed: 393 additions & 8 deletions

File tree

‎.secrets.baseline‎

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

‎docs/reference/feature-servers/mcp-server.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ See [sdk/python/feast/mcp/docker/README.md](https://github.com/feast-dev/feast/b
218218

219219
## Deploying with the Feast Operator
220220

221-
Setting `spec.services.mcpServer` adds a dedicated `feast mcp` container to the FeatureStore deployment, exposed on its own Service on port 8100. The operator sets `--host` and `--port` so that they match the generated Service. Every other setting comes from a `feast_mcp.yaml` supplied in a ConfigMap, which the operator mounts read-only at `/etc/feast/mcp`.
221+
Setting `spec.services.mcpServer` adds a dedicated `feast mcp` container to the FeatureStore deployment, exposed on its own Service on port 8100. The operator sets `--host` and `--port` so that they match the generated Service. `--host` is `0.0.0.0` unless `spec.services.mcpServer.dualStack` is `true`, which sets it to `::` and needs an image with `feast mcp --host ::` support (#6977). Every other setting comes from a `feast_mcp.yaml` supplied in a ConfigMap, which the operator mounts read-only at `/etc/feast/mcp`.
222222

223223
The ConfigMap must set `server.transport` to `http`, `streamable-http` or `sse`, because the default `stdio` cannot serve the Service. Without a ConfigMap, the operator passes `--transport http`, unless `FEAST_MCP_TRANSPORT` is set in the container `env`.
224224

‎infra/feast-operator/api/v1/featurestore_types.go‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -935,6 +935,11 @@ type ServerConfigs struct {
935935
LogLevel *string `json:"logLevel,omitempty"`
936936
// Metrics exposes Prometheus-compatible metrics for the Feast server when enabled.
937937
Metrics *bool `json:"metrics,omitempty"`
938+
// DualStack binds the server to the IPv6 wildcard address instead of 0.0.0.0,
939+
// which serves both IPv6 and IPv4 clients on Linux. Enable it on IPv6-only or dual-stack clusters.
940+
// Unset or false binds 0.0.0.0 (IPv4 only) for every server that takes a host flag, including the registry's REST server.
941+
// +optional
942+
DualStack *bool `json:"dualStack,omitempty"`
938943
// VolumeMounts defines the list of volumes that should be mounted into the feast container.
939944
// This allows attaching persistent storage, config files, secrets, or other resources
940945
// required by the Feast components. Ensure that each volume mount has a corresponding

‎infra/feast-operator/api/v1/zz_generated.deepcopy.go‎

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

‎infra/feast-operator/bundle/manifests/feast-operator.clusterserviceversion.yaml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ metadata:
176176
}
177177
]
178178
capabilities: Basic Install
179-
createdAt: "2026-08-21T03:30:58Z"
179+
createdAt: "2026-09-25T01:00:43Z"
180180
operators.operatorframework.io/builder: operator-sdk-v1.41.0
181181
operators.operatorframework.io/project_layout: go.kubebuilder.io/v4
182182
name: feast-operator.v0.66.0

‎infra/feast-operator/bundle/manifests/feast.dev_featurestores.yaml‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,10 @@ spec:
10121012
description: Server configuration (image, resources, env,
10131013
TLS, etc.).
10141014
properties:
1015+
dualStack:
1016+
description: DualStack binds the server to the IPv6
1017+
wildcard address instead of 0.0.0.
1018+
type: boolean
10151019
env:
10161020
items:
10171021
description: EnvVar represents an environment variable
@@ -2290,6 +2294,10 @@ spec:
22902294
- message: configMapRef.name is required
22912295
rule: has(self.configMapRef.name) && size(self.configMapRef.name)
22922296
> 0
2297+
dualStack:
2298+
description: DualStack binds the server to the IPv6 wildcard
2299+
address instead of 0.0.0.
2300+
type: boolean
22932301
env:
22942302
items:
22952303
description: EnvVar represents an environment variable present
@@ -2827,6 +2835,10 @@ spec:
28272835
server:
28282836
description: Creates a remote offline server container
28292837
properties:
2838+
dualStack:
2839+
description: DualStack binds the server to the IPv6 wildcard
2840+
address instead of 0.0.0.
2841+
type: boolean
28302842
env:
28312843
items:
28322844
description: EnvVar represents an environment variable
@@ -3379,6 +3391,10 @@ spec:
33793391
server:
33803392
description: Creates a feature server container
33813393
properties:
3394+
dualStack:
3395+
description: DualStack binds the server to the IPv6 wildcard
3396+
address instead of 0.0.0.
3397+
type: boolean
33823398
env:
33833399
items:
33843400
description: EnvVar represents an environment variable
@@ -4040,6 +4056,10 @@ spec:
40404056
server:
40414057
description: Creates a registry server container
40424058
properties:
4059+
dualStack:
4060+
description: DualStack binds the server to the IPv6
4061+
wildcard address instead of 0.0.0.
4062+
type: boolean
40434063
env:
40444064
items:
40454065
description: EnvVar represents an environment variable
@@ -5409,6 +5429,10 @@ spec:
54095429
ui:
54105430
description: Creates a UI server container
54115431
properties:
5432+
dualStack:
5433+
description: DualStack binds the server to the IPv6 wildcard
5434+
address instead of 0.0.0.
5435+
type: boolean
54125436
env:
54135437
items:
54145438
description: EnvVar represents an environment variable present
@@ -8309,6 +8333,10 @@ spec:
83098333
description: Server configuration (image, resources,
83108334
env, TLS, etc.).
83118335
properties:
8336+
dualStack:
8337+
description: DualStack binds the server to the
8338+
IPv6 wildcard address instead of 0.0.0.
8339+
type: boolean
83128340
env:
83138341
items:
83148342
description: EnvVar represents an environment
@@ -9601,6 +9629,10 @@ spec:
96019629
- message: configMapRef.name is required
96029630
rule: has(self.configMapRef.name) && size(self.configMapRef.name)
96039631
> 0
9632+
dualStack:
9633+
description: DualStack binds the server to the IPv6 wildcard
9634+
address instead of 0.0.0.
9635+
type: boolean
96049636
env:
96059637
items:
96069638
description: EnvVar represents an environment variable
@@ -10144,6 +10176,10 @@ spec:
1014410176
server:
1014510177
description: Creates a remote offline server container
1014610178
properties:
10179+
dualStack:
10180+
description: DualStack binds the server to the IPv6
10181+
wildcard address instead of 0.0.0.
10182+
type: boolean
1014710183
env:
1014810184
items:
1014910185
description: EnvVar represents an environment variable
@@ -10704,6 +10740,10 @@ spec:
1070410740
server:
1070510741
description: Creates a feature server container
1070610742
properties:
10743+
dualStack:
10744+
description: DualStack binds the server to the IPv6
10745+
wildcard address instead of 0.0.0.
10746+
type: boolean
1070710747
env:
1070810748
items:
1070910749
description: EnvVar represents an environment variable
@@ -11379,6 +11419,10 @@ spec:
1137911419
server:
1138011420
description: Creates a registry server container
1138111421
properties:
11422+
dualStack:
11423+
description: DualStack binds the server to the
11424+
IPv6 wildcard address instead of 0.0.0.
11425+
type: boolean
1138211426
env:
1138311427
items:
1138411428
description: EnvVar represents an environment
@@ -12766,6 +12810,10 @@ spec:
1276612810
ui:
1276712811
description: Creates a UI server container
1276812812
properties:
12813+
dualStack:
12814+
description: DualStack binds the server to the IPv6 wildcard
12815+
address instead of 0.0.0.
12816+
type: boolean
1276912817
env:
1277012818
items:
1277112819
description: EnvVar represents an environment variable

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,10 @@ spec:
10121012
description: Server configuration (image, resources, env,
10131013
TLS, etc.).
10141014
properties:
1015+
dualStack:
1016+
description: DualStack binds the server to the IPv6
1017+
wildcard address instead of 0.0.0.
1018+
type: boolean
10151019
env:
10161020
items:
10171021
description: EnvVar represents an environment variable
@@ -2290,6 +2294,10 @@ spec:
22902294
- message: configMapRef.name is required
22912295
rule: has(self.configMapRef.name) && size(self.configMapRef.name)
22922296
> 0
2297+
dualStack:
2298+
description: DualStack binds the server to the IPv6 wildcard
2299+
address instead of 0.0.0.
2300+
type: boolean
22932301
env:
22942302
items:
22952303
description: EnvVar represents an environment variable present
@@ -2827,6 +2835,10 @@ spec:
28272835
server:
28282836
description: Creates a remote offline server container
28292837
properties:
2838+
dualStack:
2839+
description: DualStack binds the server to the IPv6 wildcard
2840+
address instead of 0.0.0.
2841+
type: boolean
28302842
env:
28312843
items:
28322844
description: EnvVar represents an environment variable
@@ -3379,6 +3391,10 @@ spec:
33793391
server:
33803392
description: Creates a feature server container
33813393
properties:
3394+
dualStack:
3395+
description: DualStack binds the server to the IPv6 wildcard
3396+
address instead of 0.0.0.
3397+
type: boolean
33823398
env:
33833399
items:
33843400
description: EnvVar represents an environment variable
@@ -4040,6 +4056,10 @@ spec:
40404056
server:
40414057
description: Creates a registry server container
40424058
properties:
4059+
dualStack:
4060+
description: DualStack binds the server to the IPv6
4061+
wildcard address instead of 0.0.0.
4062+
type: boolean
40434063
env:
40444064
items:
40454065
description: EnvVar represents an environment variable
@@ -5409,6 +5429,10 @@ spec:
54095429
ui:
54105430
description: Creates a UI server container
54115431
properties:
5432+
dualStack:
5433+
description: DualStack binds the server to the IPv6 wildcard
5434+
address instead of 0.0.0.
5435+
type: boolean
54125436
env:
54135437
items:
54145438
description: EnvVar represents an environment variable present
@@ -8309,6 +8333,10 @@ spec:
83098333
description: Server configuration (image, resources,
83108334
env, TLS, etc.).
83118335
properties:
8336+
dualStack:
8337+
description: DualStack binds the server to the
8338+
IPv6 wildcard address instead of 0.0.0.
8339+
type: boolean
83128340
env:
83138341
items:
83148342
description: EnvVar represents an environment
@@ -9601,6 +9629,10 @@ spec:
96019629
- message: configMapRef.name is required
96029630
rule: has(self.configMapRef.name) && size(self.configMapRef.name)
96039631
> 0
9632+
dualStack:
9633+
description: DualStack binds the server to the IPv6 wildcard
9634+
address instead of 0.0.0.
9635+
type: boolean
96049636
env:
96059637
items:
96069638
description: EnvVar represents an environment variable
@@ -10144,6 +10176,10 @@ spec:
1014410176
server:
1014510177
description: Creates a remote offline server container
1014610178
properties:
10179+
dualStack:
10180+
description: DualStack binds the server to the IPv6
10181+
wildcard address instead of 0.0.0.
10182+
type: boolean
1014710183
env:
1014810184
items:
1014910185
description: EnvVar represents an environment variable
@@ -10704,6 +10740,10 @@ spec:
1070410740
server:
1070510741
description: Creates a feature server container
1070610742
properties:
10743+
dualStack:
10744+
description: DualStack binds the server to the IPv6
10745+
wildcard address instead of 0.0.0.
10746+
type: boolean
1070710747
env:
1070810748
items:
1070910749
description: EnvVar represents an environment variable
@@ -11379,6 +11419,10 @@ spec:
1137911419
server:
1138011420
description: Creates a registry server container
1138111421
properties:
11422+
dualStack:
11423+
description: DualStack binds the server to the
11424+
IPv6 wildcard address instead of 0.0.0.
11425+
type: boolean
1138211426
env:
1138311427
items:
1138411428
description: EnvVar represents an environment
@@ -12766,6 +12810,10 @@ spec:
1276612810
ui:
1276712811
description: Creates a UI server container
1276812812
properties:
12813+
dualStack:
12814+
description: DualStack binds the server to the IPv6 wildcard
12815+
address instead of 0.0.0.
12816+
type: boolean
1276912817
env:
1277012818
items:
1277112819
description: EnvVar represents an environment variable

0 commit comments

Comments
 (0)