Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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

Comment thread
tsorya marked this conversation as resolved.
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
56 changes: 2 additions & 54 deletions bindata/network/ovn-kubernetes/common/008-script-lib.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -537,16 +537,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 @@ -555,17 +547,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=""

# 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 @@ -610,17 +595,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 @@ -630,29 +604,12 @@ data:
if [[ "{{.OVN_EVPN_ENABLE}}" == "true" ]]; then
evpn_enable_flag="--enable-evpn"
fi

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

network_observability_enabled_flag=
if [[ "{{.OVN_OBSERVABILITY_ENABLE}}" == "true" ]]; then
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 @@ -729,16 +686,9 @@ data:
--export-ovs-metrics \
--disable-snat-multiple-gws \
${export_network_flows_flags} \
${multi_network_enabled_flag} \
${network_segmentation_enabled_flag} \
${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 @@ -752,7 +702,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 }}
enable-network-segmentation=true
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

This one is redundant (in managed and self-hosted), since we're already setting enable-network-segmentation=true in the configmap

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Not sure, this is the configmap, i believe enable it here, right?

Copy link
Copy Markdown

@ricky-rav ricky-rav Mar 6, 2026

Choose a reason for hiding this comment

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

Oops, yes. Not sure what I was up to here. :-D

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
Comment thread
tsorya marked this conversation as resolved.
enable-multicast=true
{{- if .DNS_NAME_RESOLVER_ENABLE }}
enable-dns-name-resolver=true
{{- end }}
Expand Down Expand Up @@ -117,14 +126,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,17 +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"

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 @@ -235,21 +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} \
${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 @@ -33,21 +33,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 }}
Comment thread
tsorya marked this conversation as resolved.
{{- 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 }}
Comment thread
tsorya marked this conversation as resolved.
enable-dns-name-resolver=true
{{- end }}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,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 @@ -151,18 +140,7 @@ 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"

if [ "{{.OVN_GATEWAY_MODE}}" == "shared" ]; then
gateway_mode_flags="--gateway-mode shared"
elif [ "{{.OVN_GATEWAY_MODE}}" == "local" ]; then
Expand All @@ -187,22 +165,10 @@ 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} \
${route_advertisements_enable_flag} \
${evpn_enable_flag} \
${preconfigured_udn_addresses_enable_flag} \
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

no preconfigured_udn_addresses for anyone?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

It is part of configmap https://github.com/openshift/cluster-network-operator/blob/master/bindata/network/ovn-kubernetes/managed/004-config.yaml#L43

no point to have it in both place as especially if configmap

--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