Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,18 +157,6 @@ OVNKubernetes supports the following configuration options, all of which are opt
* `egressIPConfig`: holds the configuration for EgressIP options.
* `reachabilityTotalTimeoutSeconds`: Set EgressIP node reachability total timeout in seconds, 0 means disable reachability check and the default is 1 second.

#### DPU Host Mode Support

OVN-Kubernetes supports specialized hardware deployments such as DPU (Data Processing Unit) hosts through the `OVN_NODE_MODE` environment variable. In `dpu-host` mode, certain features are automatically disabled on those nodes regardless of cluster-wide configuration:

- Egress IP and related features (egress firewall, egress QoS, egress service)
- Multicast support
- Multi-external gateway support
- Multi-network policies and admin network policies
- Network segmentation features

This per-node feature enforcement is implemented through conditional logic in the startup scripts, allowing the same cluster configuration to work across heterogeneous node types. For detailed information about node modes and the technical implementation, see `docs/ovn_node_mode.md`.

These configuration flags are only in the Operator configuration object.

Example from the `manifests/cluster-network-03-config.yml` file:
Expand Down
57 changes: 2 additions & 55 deletions bindata/network/ovn-kubernetes/common/008-script-lib.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -569,16 +569,8 @@ data:

echo "I$(date "+%m%d %H:%M:%S.%N") - starting ovnkube-node"

# enable egress ip, egress firewall, egress qos, egress service
egress_features_enable_flag="--enable-egress-ip=true --enable-egress-firewall=true --enable-egress-qos=true --enable-egress-service=true"
init_ovnkube_controller="--init-ovnkube-controller ${K8S_NODE}"
multi_external_gateway_enable_flag="--enable-multi-external-gateway=true"
gateway_interface=br-ex

# enable multicast
enable_multicast_flag="--enable-multicast"

# Use OVN_NODE_MODE environment variable, default to "full" if not set
gateway_interface="br-ex"
OVN_NODE_MODE=${OVN_NODE_MODE:-full}
# We check only dpu-host mode and not smart-nic mode here as currently we do not support it yet
# Once we support it, we will need to check for it here and add relevant code.
Expand All @@ -587,17 +579,10 @@ data:
# https://github.com/ovn-kubernetes/ovn-kubernetes/pull/5327/files
gateway_interface="derive-from-mgmt-port"
ovnkube_node_mode="--ovnkube-node-mode dpu-host"
# disable egress ip for dpu-host mode as it is not supported
egress_features_enable_flag=""

# disable multicast for dpu-host mode as it is not supported
enable_multicast_flag=""
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR/commit doesn't actually explain why we can get rid of all of this. Do we implement egress IPs and multicast in DPU mode now? Or does DPU mode just ignore the settings of these flags?


# disable init-ovnkube-controller for dpu-host mode as it is not supported
init_ovnkube_controller=""

# disable multi-external-gateway for dpu-host mode as it is not supported
multi_external_gateway_enable_flag=""
fi

if [ "{{.OVN_GATEWAY_MODE}}" == "shared" ]; then
Expand Down Expand Up @@ -642,17 +627,6 @@ data:
node_mgmt_port_netdev_flags="$node_mgmt_port_netdev_flags --ovnkube-node-mgmt-port-dp-resource-name ${OVNKUBE_NODE_MGMT_PORT_DP_RESOURCE_NAME}"
fi

multi_network_enabled_flag=
if [[ "{{.OVN_MULTI_NETWORK_ENABLE}}" == "true" && "${OVN_NODE_MODE}" != "dpu-host" ]]; then
multi_network_enabled_flag="--enable-multi-network"
fi

network_segmentation_enabled_flag=
if [[ "${OVN_NODE_MODE}" != "dpu-host" ]]; then
multi_network_enabled_flag="--enable-multi-network"
network_segmentation_enabled_flag="--enable-network-segmentation"
fi

route_advertisements_enable_flag=
if [[ "{{.OVN_ROUTE_ADVERTISEMENTS_ENABLE}}" == "true" ]]; then
route_advertisements_enable_flag="--enable-route-advertisements"
Expand All @@ -662,8 +636,6 @@ data:
if [[ "{{.OVN_EVPN_ENABLE}}" == "true" ]]; then
evpn_enable_flag="--enable-evpn"
fi

preconfigured_udn_addresses_enable_flag="--enable-preconfigured-udn-addresses"

network_connect_enabled_flag=
if [[ "{{.OVN_NETWORK_CONNECT_ENABLE}}" == "true" ]]; then
Expand All @@ -675,21 +647,6 @@ data:
network_observability_enabled_flag="--enable-observability"
fi

multi_network_policy_enabled_flag=
if [[ "{{.OVN_MULTI_NETWORK_POLICY_ENABLE}}" == "true"&& "${OVN_NODE_MODE}" != "dpu-host" ]]; then
multi_network_policy_enabled_flag="--enable-multi-networkpolicy"
fi

admin_network_policy_enabled_flag=
if [[ "${OVN_NODE_MODE}" != "dpu-host" ]]; then
admin_network_policy_enabled_flag="--enable-admin-network-policy"
fi

dns_name_resolver_enabled_flag=
if [[ "{{.DNS_NAME_RESOLVER_ENABLE}}" == "true" ]]; then
dns_name_resolver_enabled_flag="--enable-dns-name-resolver"
fi

# If IP Forwarding mode is global set it in the host here. IPv6 IP Forwarding shuld be
# enabled for all interfaces at all times if cluster is configured as single stack IPv6
# or dual stack. This will be taken care by ovn-kubernetes(ovn-org/ovn-kubernetes#4376).
Expand Down Expand Up @@ -770,17 +727,9 @@ data:
--export-ovs-metrics \
--disable-snat-multiple-gws \
${export_network_flows_flags} \
${multi_network_enabled_flag} \
${network_segmentation_enabled_flag} \
${network_connect_enabled_flag} \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're removing ${network_connect_enabled_flag} here but you still set it above.

${route_advertisements_enable_flag} \
${evpn_enable_flag} \
${preconfigured_udn_addresses_enable_flag} \
${multi_network_policy_enabled_flag} \
${admin_network_policy_enabled_flag} \
${dns_name_resolver_enabled_flag} \
${network_observability_enabled_flag} \
${enable_multicast_flag} \
--zone ${K8S_NODE} \
--enable-interconnect \
--acl-logging-rate-limit "{{.OVNPolicyAuditRateLimit}}" \
Expand All @@ -795,7 +744,5 @@ data:
${ovn_v4_masquerade_subnet_opt} \
${ovn_v6_masquerade_subnet_opt} \
${ovn_v4_transit_switch_subnet_opt} \
${ovn_v6_transit_switch_subnet_opt} \
${egress_features_enable_flag} \
${multi_external_gateway_enable_flag}
${ovn_v6_transit_switch_subnet_opt}
}
24 changes: 17 additions & 7 deletions bindata/network/ovn-kubernetes/managed/004-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,23 @@ data:
dns-service-name="dns-default"

[ovnkubernetesfeature]
enable-egress-ip=true
enable-egress-firewall=true
enable-egress-qos=true
enable-egress-service=true
{{- if .ReachabilityNodePort }}
egressip-node-healthcheck-port={{.ReachabilityNodePort}}
{{- end }}
{{- if not .OVN_MULTI_NETWORK_ENABLE }}
enable-multi-network=true
{{- end }}
Comment on lines -39 to -41
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, so the handling of enable-multi-network is totally broken; we enable it whether OVN_MULTI_NETWORK_ENABLE is true or false.

It looks like when the "network segmentation" stuff was added, we made it so DisableMultiNetwork was ignored if the network segmentation feature gate was enabled, and then when that feature gate was removed, we ended up with a bunch of places doing "enable multi-network if OVN_MULTI_NETWORK_ENABLE is true and also enable multi-network if OVN_MULTI_NETWORK_ENABLE is false"...

You should remove all of the DisableMultiNetwork/OVN_MULTI_NETWORK_ENABLE code from the tree. (Ideally, that would be a separate commit before this one.)

enable-network-segmentation=true
enable-preconfigured-udn-addresses=true

{{- if .OVN_MULTI_NETWORK_POLICY_ENABLE }}
enable-multi-networkpolicy=true
{{- end }}
enable-admin-network-policy=true
enable-multi-external-gateway=true
enable-multicast=true
{{- if .DNS_NAME_RESOLVER_ENABLE }}
enable-dns-name-resolver=true
{{- end }}
Expand Down Expand Up @@ -120,14 +129,15 @@ data:
{{- if .ReachabilityNodePort }}
egressip-node-healthcheck-port={{.ReachabilityNodePort}}
{{- end }}
{{- if .OVN_MULTI_NETWORK_ENABLE }}
enable-multi-network=true
{{- end }}
{{- if not .OVN_MULTI_NETWORK_ENABLE }}
enable-multi-network=true
{{- end }}
enable-network-segmentation=true
enable-preconfigured-udn-addresses=true
{{- if .OVN_MULTI_NETWORK_POLICY_ENABLE }}
enable-multi-networkpolicy=true
{{- end }}
enable-admin-network-policy=true
enable-multi-external-gateway=true
enable-multicast=true
{{- if .DNS_NAME_RESOLVER_ENABLE }}
enable-dns-name-resolver=true
{{- end }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,19 +183,8 @@ spec:
ovn_v6_masquerade_subnet_opt="--gateway-v6-masquerade-subnet {{.V6MasqueradeSubnet}}"
fi

dns_name_resolver_enabled_flag=
if [[ "{{.DNS_NAME_RESOLVER_ENABLE}}" == "true" ]]; then
dns_name_resolver_enabled_flag="--enable-dns-name-resolver"
fi

persistent_ips_enabled_flag="--enable-persistent-ips"

# This is needed so that converting clusters from GA to TP
# will rollout control plane pods as well
network_segmentation_enabled_flag=
multi_network_enabled_flag="--enable-multi-network"
network_segmentation_enabled_flag="--enable-network-segmentation"

route_advertisements_enable_flag=
if [[ "{{.OVN_ROUTE_ADVERTISEMENTS_ENABLE}}" == "true" ]]; then
route_advertisements_enable_flag="--enable-route-advertisements"
Expand All @@ -206,22 +195,6 @@ spec:
evpn_enable_flag="--enable-evpn"
fi

preconfigured_udn_addresses_enable_flag="--enable-preconfigured-udn-addresses"

# Enable multi-network policy if configured (control-plane always full mode)
multi_network_policy_enabled_flag=
if [[ "{{.OVN_MULTI_NETWORK_POLICY_ENABLE}}" == "true" ]]; then
multi_network_policy_enabled_flag="--enable-multi-networkpolicy"
fi

# Enable admin network policy if configured (control-plane always full mode)
admin_network_policy_enabled_flag="--enable-admin-network-policy"

network_connect_enabled_flag=
if [[ "{{.OVN_NETWORK_CONNECT_ENABLE}}" == "true" ]]; then
network_connect_enabled_flag="--enable-network-connect"
fi

echo "I$(date "+%m%d %H:%M:%S.%N") - ovnkube-control-plane - start ovnkube --init-cluster-manager ${K8S_NODE}"
exec /usr/bin/ovnkube \
--enable-interconnect \
Expand All @@ -240,22 +213,9 @@ spec:
${ovn_v6_transit_switch_subnet_opt} \
${ovn_v4_masquerade_subnet_opt} \
${ovn_v6_masquerade_subnet_opt} \
${dns_name_resolver_enabled_flag} \
${persistent_ips_enabled_flag} \
${multi_network_enabled_flag} \
${network_segmentation_enabled_flag} \
${network_connect_enabled_flag} \
${route_advertisements_enable_flag} \
${evpn_enable_flag} \
${preconfigured_udn_addresses_enable_flag} \
--enable-egress-ip=true \
--enable-egress-firewall=true \
--enable-egress-qos=true \
--enable-egress-service=true \
--enable-multicast \
--enable-multi-external-gateway=true \
${multi_network_policy_enabled_flag} \
${admin_network_policy_enabled_flag}
${evpn_enable_flag}
volumeMounts:
- mountPath: /run/ovnkube-config/
name: ovnkube-config
Expand Down
10 changes: 7 additions & 3 deletions bindata/network/ovn-kubernetes/self-hosted/004-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,25 @@ data:
dns-service-name="dns-default"

[ovnkubernetesfeature]

enable-egress-ip=true
enable-egress-firewall=true
enable-egress-qos=true
enable-egress-service=true
{{- if .ReachabilityTotalTimeoutSeconds }}
egressip-reachability-total-timeout={{.ReachabilityTotalTimeoutSeconds}}
{{- end }}
{{- if .ReachabilityNodePort }}
egressip-node-healthcheck-port={{.ReachabilityNodePort}}
{{- end }}
{{- if not .OVN_MULTI_NETWORK_ENABLE }}
enable-multi-network=true
{{- end }}
enable-network-segmentation=true
enable-preconfigured-udn-addresses=true
{{- if .OVN_MULTI_NETWORK_POLICY_ENABLE }}
enable-multi-networkpolicy=true
{{- end }}
enable-admin-network-policy=true
enable-multi-external-gateway=true
enable-multicast=true
{{- if .DNS_NAME_RESOLVER_ENABLE }}
enable-dns-name-resolver=true
{{- end }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,19 +130,8 @@ spec:
ovn_v6_masquerade_subnet_opt="--gateway-v6-masquerade-subnet {{.V6MasqueradeSubnet}}"
fi

dns_name_resolver_enabled_flag=
if [[ "{{.DNS_NAME_RESOLVER_ENABLE}}" == "true" ]]; then
dns_name_resolver_enabled_flag="--enable-dns-name-resolver"
fi

persistent_ips_enabled_flag="--enable-persistent-ips"

# This is needed so that converting clusters from GA to TP
# will rollout control plane pods as well
network_segmentation_enabled_flag=
multi_network_enabled_flag="--enable-multi-network"
network_segmentation_enabled_flag="--enable-network-segmentation"

route_advertisements_enable_flag=
if [[ "{{.OVN_ROUTE_ADVERTISEMENTS_ENABLE}}" == "true" ]]; then
route_advertisements_enable_flag="--enable-route-advertisements"
Expand All @@ -152,22 +141,6 @@ spec:
if [[ "{{.OVN_EVPN_ENABLE}}" == "true" ]]; then
evpn_enable_flag="--enable-evpn"
fi

preconfigured_udn_addresses_enable_flag="--enable-preconfigured-udn-addresses"

# Enable multi-network policy if configured (control-plane always full mode)
multi_network_policy_enabled_flag=
if [[ "{{.OVN_MULTI_NETWORK_POLICY_ENABLE}}" == "true" ]]; then
multi_network_policy_enabled_flag="--enable-multi-networkpolicy"
fi

# Enable admin network policy if configured (control-plane always full mode)
admin_network_policy_enabled_flag="--enable-admin-network-policy"

network_connect_enabled_flag=
if [[ "{{.OVN_NETWORK_CONNECT_ENABLE}}" == "true" ]]; then
network_connect_enabled_flag="--enable-network-connect"
fi

if [ "{{.OVN_GATEWAY_MODE}}" == "shared" ]; then
gateway_mode_flags="--gateway-mode shared"
Expand All @@ -193,23 +166,11 @@ spec:
${ovn_v6_transit_switch_subnet_opt} \
${ovn_v4_masquerade_subnet_opt} \
${ovn_v6_masquerade_subnet_opt} \
${dns_name_resolver_enabled_flag} \
${persistent_ips_enabled_flag} \
${multi_network_enabled_flag} \
${network_segmentation_enabled_flag} \
${gateway_mode_flags} \
${network_connect_enabled_flag} \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You removed the setting of network_connect_enabled_flag but you forgot to remove it here.

${route_advertisements_enable_flag} \
${evpn_enable_flag} \
${preconfigured_udn_addresses_enable_flag} \
--enable-egress-ip=true \
--enable-egress-firewall=true \
--enable-egress-qos=true \
--enable-egress-service=true \
--enable-multicast \
--enable-multi-external-gateway=true \
${multi_network_policy_enabled_flag} \
${admin_network_policy_enabled_flag}
${evpn_enable_flag}
volumeMounts:
- mountPath: /run/ovnkube-config/
name: ovnkube-config
Expand Down
6 changes: 0 additions & 6 deletions docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,6 @@ The Network operator needs to make sure that the input configuration doesn't cha

The persisted configuration must **make all defaults explicit**. This protects against inadvertent code changes that could destabilize an existing cluster.

### Per-Node Configuration

For certain specialized deployments (e.g., DPU host nodes), some features need to be disabled on a per-node basis even when enabled cluster-wide. Since ConfigMap values cannot be reliably overridden per-node, the CNO implements per-node feature enforcement through conditional logic in the startup scripts.

The `OVN_NODE_MODE` environment variable is injected into `ovnkube-node` pods and consumed by the startup script (`008-script-lib.yaml`) to conditionally enable or disable features based on the node's operational mode. This ensures that unsupported features are deterministically disabled on specialized hardware regardless of cluster-wide configuration.

## Egress Router

**Input:** `EgressRouter.network.operator.openshift.io`
Expand Down
20 changes: 0 additions & 20 deletions docs/operands.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,26 +91,6 @@ configuration object (which in turn is copied there from the
configuration) is "`OVNKubernetes`". If the specified network type is
not "`OVNKubernetes`", the CNO will not render any network plugin.

### OVN-Kubernetes Node Modes

OVN-Kubernetes supports different node operational modes through the `OVN_NODE_MODE`
environment variable. This allows per-node feature enforcement, particularly for
specialized hardware like DPU (Data Processing Unit) hosts where certain features
must be disabled.

The startup script (`008-script-lib.yaml`) contains conditional logic that adjusts
feature enablement based on the node mode:

- **`full` mode (default)**: All features enabled as configured
- **`dpu-host` mode**: Certain features like egress IP, multicast, multi-network
policies, and admin network policies are automatically disabled regardless of
cluster-wide configuration

This approach was necessary because ConfigMap values (`004-config.yaml`) cannot be
reliably overridden on a per-node basis, but startup script logic can be conditional.

For detailed information, see `docs/ovn_node_mode.md`.

## Multus

Multus is deployed as long as `.spec.disableMultiNetwork` is not set.
Expand Down
Loading