Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
54f9336
Remove support for receiving advertised routes on nodes
tssurya Mar 21, 2025
e2a784a
Don't use match as a criteria for isEquivalentMatch
tssurya Jul 22, 2025
cf74ac5
Advertised networks: SNAT Traffic to nodeIP
tssurya Jun 19, 2025
97806bb
BGP,UDN,LGW: Ensure both masqueradeIP and podsubnet ip rules are present
tssurya Jul 2, 2025
414d53f
Convert LGW postrouting rules to NFT
tssurya Jul 9, 2025
01e8a5f
rename/reuse pmtud nft sets to remote-node-ips
tssurya Jul 9, 2025
a329e77
BGP, default network, LGW: Conditionally Masquerade
tssurya Jul 9, 2025
ffd50e8
Add E2E's for these traffic flows
tssurya Jul 2, 2025
c9291ff
Add masqueradeIP flows back for advertised networks in breth0
tssurya Jul 11, 2025
f44d70e
Change priority of ovn-kube-local-gw-masq to 101
tssurya Jul 12, 2025
22bcf59
Add all remote nodeIPs for the PMTUD/BGP remote node NFT set
tssurya Jul 21, 2025
5e6beda
cleanupStalePodSNATs: Don't blow all SNATs for advertised Networks
tssurya Jul 21, 2025
674a2c1
Fix CreateOrUpdateNATs to update non-default values
tssurya Jul 23, 2025
68f426c
UDN,L2: UDN pod in networkA to nodePort on networkB works for IPV6!
tssurya Jul 28, 2025
c066dc5
SNAT traffic from advertised UDNs towards UDN enabled default services
jcaamano Aug 6, 2025
28326d4
Reapply "Add the IP rule for a UDN only when it is advertised to the …
jcaamano Aug 7, 2025
ac08794
Provide global routed udn isolation option
pperiyasamy May 30, 2025
c418a1b
Skip adding drop ACLs when Routed UDN Isolation is disabled
pperiyasamy May 22, 2025
9807675
Add CI lane and E2E to test loosly isolated advertised UDNs
pperiyasamy Jun 3, 2025
6bf33e3
Set nodes default gateway to the external FRR router for isolation lo…
pliurh Jul 17, 2025
b67d7c7
node: refactor MEG/Advertised UDN ingress and egress flows
pliurh Jul 21, 2025
67994c4
Refactor: Rename config flag routed-udn-isolation to advertised-udn-i…
pliurh Jul 22, 2025
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
10 changes: 6 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -483,14 +483,15 @@ jobs:
- {"target": "network-segmentation", "ha": "noHA", "gateway-mode": "shared", "ipfamily": "ipv6", "disable-snat-multiple-gws": "noSnatGW", "second-bridge": "1br", "ic": "ic-single-node-zones"}
- {"target": "bgp", "ha": "noHA", "gateway-mode": "local", "ipfamily": "dualstack", "disable-snat-multiple-gws": "snatGW", "second-bridge": "1br", "ic": "ic-single-node-zones", "routeadvertisements": "advertise-default", "network-segmentation": "enable-network-segmentation"}
- {"target": "bgp", "ha": "noHA", "gateway-mode": "shared", "ipfamily": "dualstack", "disable-snat-multiple-gws": "noSnatGW", "second-bridge": "1br", "ic": "ic-single-node-zones", "routeadvertisements": "advertise-default", "network-segmentation": "enable-network-segmentation"}
- {"target": "bgp-loose-isolation", "ha": "noHA", "gateway-mode": "shared", "ipfamily": "dualstack", "disable-snat-multiple-gws": "snatGW", "second-bridge": "1br", "ic": "ic-single-node-zones", "routeadvertisements": "advertise-default", "network-segmentation": "enable-network-segmentation", "advertised-udn-isolation-mode": "loose"}
- {"target": "traffic-flow-test-only","ha": "noHA", "gateway-mode": "shared", "ipfamily": "ipv4", "disable-snat-multiple-gws": "noSnatGW", "second-bridge": "1br", "ic": "ic-single-node-zones", "traffic-flow-tests": "1-24", "network-segmentation": "enable-network-segmentation"}
- {"target": "tools", "ha": "noHA", "gateway-mode": "local", "ipfamily": "dualstack", "disable-snat-multiple-gws": "SnatGW", "second-bridge": "1br", "ic": "ic-single-node-zones", "network-segmentation": "enable-network-segmentation"}
needs: [ build-pr ]
env:
JOB_NAME: "${{ matrix.target }}-${{ matrix.ha }}-${{ matrix.gateway-mode }}-${{ matrix.ipfamily }}-${{ matrix.disable-snat-multiple-gws }}-${{ matrix.second-bridge }}-${{ matrix.ic }}"
OVN_HYBRID_OVERLAY_ENABLE: ${{ (matrix.target == 'control-plane' || matrix.target == 'control-plane-helm') && (matrix.ipfamily == 'ipv4' || matrix.ipfamily == 'dualstack' ) }}
OVN_MULTICAST_ENABLE: "${{ matrix.target == 'control-plane' || matrix.target == 'control-plane-helm' || matrix.target == 'network-segmentation' || matrix.target == 'bgp' }}"
OVN_EMPTY_LB_EVENTS: "${{ matrix.target == 'control-plane' || matrix.target == 'control-plane-helm' || matrix.target == 'bgp' }}"
OVN_MULTICAST_ENABLE: "${{ matrix.target == 'control-plane' || matrix.target == 'control-plane-helm' || matrix.target == 'network-segmentation' || matrix.target == 'bgp' || matrix.target == 'bgp-loose-isolation' }}"
OVN_EMPTY_LB_EVENTS: "${{ matrix.target == 'control-plane' || matrix.target == 'control-plane-helm' || matrix.target == 'bgp' || matrix.target == 'bgp-loose-isolation' }}"
OVN_HA: "${{ matrix.ha == 'HA' }}"
OVN_DISABLE_SNAT_MULTIPLE_GWS: "${{ matrix.disable-snat-multiple-gws == 'noSnatGW' }}"
KIND_INSTALL_METALLB: "${{ matrix.target == 'control-plane' || matrix.target == 'control-plane-helm' || matrix.target == 'network-segmentation' }}"
Expand All @@ -513,6 +514,7 @@ jobs:
TRAFFIC_FLOW_TESTS: "${{ matrix.traffic-flow-tests }}"
ENABLE_ROUTE_ADVERTISEMENTS: "${{ matrix.routeadvertisements != '' }}"
ADVERTISE_DEFAULT_NETWORK: "${{ matrix.routeadvertisements == 'advertise-default' }}"
ADVERTISED_UDN_ISOLATION_MODE: "${{ matrix.advertised-udn-isolation-mode }}"
steps:

- name: Install VRF kernel module
Expand Down Expand Up @@ -646,7 +648,7 @@ jobs:
# set 3 hours for control-plane tests as these might take a while
# give 10m extra to give ginkgo chance to timeout before github so that we
# get its output
timeout-minutes: ${{ matrix.target == 'bgp' && 190 || matrix.target == 'control-plane' && 190 || matrix.target == 'control-plane-helm' && 190 || matrix.target == 'external-gateway' && 190 || 130 }}
timeout-minutes: ${{ matrix.target == 'bgp-loose-isolation' && 190 || matrix.target == 'bgp' && 190 || matrix.target == 'control-plane' && 190 || matrix.target == 'control-plane-helm' && 190 || matrix.target == 'external-gateway' && 190 || 130 }}
run: |
# used by e2e diagnostics package
export OVN_IMAGE="ovn-daemonset-fedora:pr"
Expand All @@ -670,7 +672,7 @@ jobs:
fi
elif [ "${{ matrix.target }}" == "network-segmentation" ]; then
make -C test control-plane WHAT="Network Segmentation"
elif [ "${{ matrix.target }}" == "bgp" ]; then
elif [ "${{ matrix.target }}" == "bgp" ] || [ "${{ matrix.target }}" == "bgp-loose-isolation" ]; then
make -C test control-plane
elif [ "${{ matrix.target }}" == "tools" ]; then
make -C go-controller build
Expand Down
50 changes: 40 additions & 10 deletions contrib/kind-common
Original file line number Diff line number Diff line change
Expand Up @@ -719,22 +719,52 @@ deploy_bgp_external_server() {
$OCI_BIN run --cap-add NET_ADMIN --user 0 -d --network bgpnet --rm --name bgpserver -p 8080:8080 registry.k8s.io/e2e-test-images/agnhost:2.45 netexec
# let's make the bgp external server have its default route towards FRR router so that we don't need to add routes during tests back to the pods in the
# cluster for return traffic
local bgp_network_frr_v4 bgp_network_frr_v6
local bgp_network_frr_v4 bgp_network_frr_v6 kind_network_frr_v4 kind_network_frr_v6
bgp_network_frr_v4=$($OCI_BIN inspect -f '{{.NetworkSettings.Networks.bgpnet.IPAddress}}' frr)
echo "FRR kind network IPv4: ${bgp_network_frr_v4}"
echo "FRR bgp network IPv4: ${bgp_network_frr_v4}"
$OCI_BIN exec bgpserver ip route replace default via "$bgp_network_frr_v4"
if [ "$PLATFORM_IPV6_SUPPORT" == true ] ; then
bgp_network_frr_v6=$($OCI_BIN inspect -f '{{.NetworkSettings.Networks.bgpnet.GlobalIPv6Address}}' frr)
echo "FRR kind network IPv6: ${bgp_network_frr_v6}"
echo "FRR bgp network IPv6: ${bgp_network_frr_v6}"
$OCI_BIN exec bgpserver ip -6 route replace default via "$bgp_network_frr_v6"
fi
# disable the default route to make sure the container only routes accross
# directly connected or learnt networks (doing this at the very end since
# docker changes the routing table when a new network is connected)
$OCI_BIN exec frr ip route delete default
$OCI_BIN exec frr ip route
$OCI_BIN exec frr ip -6 route delete default
$OCI_BIN exec frr ip -6 route
if [ "$ADVERTISED_UDN_ISOLATION_MODE" == "loose" ]; then
kind_network_frr_v4=$($OCI_BIN inspect -f '{{.NetworkSettings.Networks.kind.IPAddress}}' frr)
echo "FRR kind network IPv4: ${kind_network_frr_v4}"
# If UDN isolation is in loose disabled, we need to set the default gateway for the nodes in the cluster
# to the FRR router so that cross-UDN traffic can be routed back to the pods in the cluster in the loose mode.
echo "Setting default gateway for nodes in the cluster to FRR router IPv4: ${kind_network_frr_v4}"
set_nodes_default_gw "$kind_network_frr_v4"
if [ "$PLATFORM_IPV6_SUPPORT" == true ] ; then
kind_network_frr_v6=$($OCI_BIN inspect -f '{{.NetworkSettings.Networks.kind.GlobalIPv6Address}}' frr)
echo "FRR kind network IPv6: ${kind_network_frr_v6}"
set_nodes_default_gw "$kind_network_frr_v6"
fi
else
# disable the default route to make sure the container only routes accross
# directly connected or learnt networks (doing this at the very end since
# docker changes the routing table when a new network is connected)
$OCI_BIN exec frr ip route delete default
$OCI_BIN exec frr ip route
$OCI_BIN exec frr ip -6 route delete default
$OCI_BIN exec frr ip -6 route
fi
}

set_nodes_default_gw() {
local gw="$1"
local ip_cmd="ip"
local route_cmd="route replace default via"

# Check if $gw is IPv6 (contains ':')
if [[ "$gw" == *:* ]]; then
ip_cmd="ip -6"
fi

KIND_NODES=$(kind_get_nodes)
for node in $KIND_NODES; do
$OCI_BIN exec "$node" $ip_cmd $route_cmd "$gw"
done
}

destroy_bgp() {
Expand Down
7 changes: 7 additions & 0 deletions contrib/kind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ usage() {
echo " [-ic | --enable-interconnect]"
echo " [-uae | --preconfigured-udn-addresses-enable]"
echo " [-rae | --enable-route-advertisements]"
echo " [-rud | --routed-udn-isolation-disable]"
echo " [-adv | --advertise-default-network]"
echo " [-nqe | --network-qos-enable]"
echo " [--isolated]"
Expand Down Expand Up @@ -158,6 +159,7 @@ echo "-obs | --observability Enable OVN Observability fea
echo "-uae | --preconfigured-udn-addresses-enable Enable connecting workloads with preconfigured network to user-defined networks"
echo "-rae | --enable-route-advertisements Enable route advertisements"
echo "-adv | --advertise-default-network Applies a RouteAdvertisements configuration to advertise the default network on all nodes"
echo "-rud | --routed-udn-isolation-disable Disable isolation across BGP-advertised UDNs (sets advertised-udn-isolation-mode=loose). DEFAULT: strict."
echo ""
}

Expand Down Expand Up @@ -347,6 +349,8 @@ parse_args() {
;;
-adv | --advertise-default-network) ADVERTISE_DEFAULT_NETWORK=true
;;
-rud | --routed-udn-isolation-disable) ADVERTISED_UDN_ISOLATION_MODE=loose
;;
-ic | --enable-interconnect ) OVN_ENABLE_INTERCONNECT=true
;;
--disable-ovnkube-identity) OVN_ENABLE_OVNKUBE_IDENTITY=false
Expand Down Expand Up @@ -439,6 +443,7 @@ print_params() {
echo "ENABLE_MULTI_NET = $ENABLE_MULTI_NET"
echo "ENABLE_NETWORK_SEGMENTATION= $ENABLE_NETWORK_SEGMENTATION"
echo "ENABLE_ROUTE_ADVERTISEMENTS= $ENABLE_ROUTE_ADVERTISEMENTS"
echo "ADVERTISED_UDN_ISOLATION_MODE= $ADVERTISED_UDN_ISOLATION_MODE"
echo "ADVERTISE_DEFAULT_NETWORK = $ADVERTISE_DEFAULT_NETWORK"
echo "ENABLE_PRE_CONF_UDN_ADDR = $ENABLE_PRE_CONF_UDN_ADDR"
echo "OVN_ENABLE_INTERCONNECT = $OVN_ENABLE_INTERCONNECT"
Expand Down Expand Up @@ -685,6 +690,7 @@ set_default_params() {
echo "Preconfigured UDN addresses requires interconnect to be enabled (-ic)"
exit 1
fi
ADVERTISED_UDN_ISOLATION_MODE=${ADVERTISED_UDN_ISOLATION_MODE:-strict}
ADVERTISE_DEFAULT_NETWORK=${ADVERTISE_DEFAULT_NETWORK:-false}
OVN_COMPACT_MODE=${OVN_COMPACT_MODE:-false}
if [ "$OVN_COMPACT_MODE" == true ]; then
Expand Down Expand Up @@ -941,6 +947,7 @@ create_ovn_kube_manifests() {
--preconfigured-udn-addresses-enable="${ENABLE_PRE_CONF_UDN_ADDR}" \
--route-advertisements-enable="${ENABLE_ROUTE_ADVERTISEMENTS}" \
--advertise-default-network="${ADVERTISE_DEFAULT_NETWORK}" \
--advertised-udn-isolation-mode="${ADVERTISED_UDN_ISOLATION_MODE}" \
--ovnkube-metrics-scale-enable="${OVN_METRICS_SCALE_ENABLE}" \
--compact-mode="${OVN_COMPACT_MODE}" \
--enable-interconnect="${OVN_ENABLE_INTERCONNECT}" \
Expand Down
14 changes: 14 additions & 0 deletions dist/images/daemonset.sh
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ OVN_NETWORK_SEGMENTATION_ENABLE=
OVN_PRE_CONF_UDN_ADDR_ENABLE=
OVN_ROUTE_ADVERTISEMENTS_ENABLE=
OVN_ADVERTISE_DEFAULT_NETWORK=
OVN_ADVERTISED_UDN_ISOLATION_MODE=
OVN_V4_JOIN_SUBNET=""
OVN_V6_JOIN_SUBNET=""
OVN_V4_MASQUERADE_SUBNET=""
Expand Down Expand Up @@ -283,6 +284,9 @@ while [ "$1" != "" ]; do
--advertise-default-network)
OVN_ADVERTISE_DEFAULT_NETWORK=$VALUE
;;
--advertised-udn-isolation-mode)
OVN_ADVERTISED_UDN_ISOLATION_MODE=$VALUE
;;
--egress-service-enable)
OVN_EGRESSSERVICE_ENABLE=$VALUE
;;
Expand Down Expand Up @@ -478,6 +482,8 @@ ovn_route_advertisements_enable=${OVN_ROUTE_ADVERTISEMENTS_ENABLE}
echo "ovn_route_advertisements_enable: ${ovn_route_advertisements_enable}"
ovn_advertise_default_network=${OVN_ADVERTISE_DEFAULT_NETWORK}
echo "ovn_advertise_default_network: ${ovn_advertise_default_network}"
ovn_advertised_udn_isolation_mode=${OVN_ADVERTISED_UDN_ISOLATION_MODE}
echo "ovn_advertised_udn_isolation_mode: ${ovn_advertised_udn_isolation_mode}"
ovn_hybrid_overlay_net_cidr=${OVN_HYBRID_OVERLAY_NET_CIDR}
echo "ovn_hybrid_overlay_net_cidr: ${ovn_hybrid_overlay_net_cidr}"
ovn_disable_snat_multiple_gws=${OVN_DISABLE_SNAT_MULTIPLE_GWS}
Expand Down Expand Up @@ -620,6 +626,7 @@ ovn_image=${ovnkube_image} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_pre_conf_udn_addr_enable=${ovn_pre_conf_udn_addr_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_egress_service_enable=${ovn_egress_service_enable} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_remote_probe_interval=${ovn_remote_probe_interval} \
Expand Down Expand Up @@ -674,6 +681,7 @@ ovn_image=${ovnkube_image} \
ovn_multi_network_enable=${ovn_multi_network_enable} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_egress_service_enable=${ovn_egress_service_enable} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_remote_probe_interval=${ovn_remote_probe_interval} \
Expand Down Expand Up @@ -773,6 +781,7 @@ ovn_image=${ovnkube_image} \
ovn_multi_network_enable=${ovn_multi_network_enable} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_egress_service_enable=${ovn_egress_service_enable} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_master_count=${ovn_master_count} \
Expand Down Expand Up @@ -823,6 +832,7 @@ ovn_image=${ovnkube_image} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_pre_conf_udn_addr_enable=${ovn_pre_conf_udn_addr_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_egress_service_enable=${ovn_egress_service_enable} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_master_count=${ovn_master_count} \
Expand Down Expand Up @@ -904,6 +914,7 @@ ovn_image=${ovnkube_image} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_pre_conf_udn_addr_enable=${ovn_pre_conf_udn_addr_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_egress_service_enable=${ovn_egress_service_enable} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_remote_probe_interval=${ovn_remote_probe_interval} \
Expand Down Expand Up @@ -972,6 +983,7 @@ ovn_image=${ovnkube_image} \
ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_pre_conf_udn_addr_enable=${ovn_pre_conf_udn_addr_enable} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
ovn_ssl_en=${ovn_ssl_en} \
ovn_remote_probe_interval=${ovn_remote_probe_interval} \
ovn_monitor_all=${ovn_monitor_all} \
Expand Down Expand Up @@ -1070,11 +1082,13 @@ ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_pre_conf_udn_addr_enable=${ovn_pre_conf_udn_addr_enable} \
ovn_enable_dnsnameresolver=${ovn_enable_dnsnameresolver} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
jinjanate ../templates/rbac-ovnkube-cluster-manager.yaml.j2 -o ${output_dir}/rbac-ovnkube-cluster-manager.yaml

ovn_network_segmentation_enable=${ovn_network_segmentation_enable} \
ovn_enable_dnsnameresolver=${ovn_enable_dnsnameresolver} \
ovn_route_advertisements_enable=${ovn_route_advertisements_enable} \
ovn_advertised_udn_isolation_mode=${ovn_advertised_udn_isolation_mode} \
jinjanate ../templates/rbac-ovnkube-master.yaml.j2 -o ${output_dir}/rbac-ovnkube-master.yaml

cp ../templates/rbac-ovnkube-identity.yaml.j2 ${output_dir}/rbac-ovnkube-identity.yaml
Expand Down
Loading