Skip to content

Commit 0ae0d13

Browse files
authored
add metallb underlay v6 dualcase (#6159)
* add metallb underlay ipv6 e2e * fix enable u2o may cause metallb underlay err --------- Signed-off-by: clyi <clyi@alauda.io>
1 parent 2238d47 commit 0ae0d13

File tree

8 files changed

+291
-81
lines changed

8 files changed

+291
-81
lines changed

.github/workflows/build-x86-image.yaml

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3907,6 +3907,13 @@ jobs:
39073907
- build-e2e-binaries
39083908
runs-on: ubuntu-24.04
39093909
timeout-minutes: 30
3910+
strategy:
3911+
fail-fast: false
3912+
matrix:
3913+
ip-family:
3914+
- ipv4
3915+
- ipv6
3916+
- dual
39103917
steps:
39113918
- uses: jlumbroso/free-disk-space@v1.3.1
39123919
with:
@@ -3992,57 +3999,58 @@ jobs:
39923999
GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39934000
run: |
39944001
pipx install jinjanator
3995-
make kind-ghcr-pull kind-init
4002+
make kind-ghcr-pull kind-init-${{ matrix.ip-family }}
39964003
39974004
- name: Install Kube-OVN
39984005
id: install
3999-
run: make kind-install-metallb-pool-from-underlay
4006+
run: make kind-install-metallb-pool-from-underlay-${{ matrix.ip-family }}
40004007

40014008
- name: Run Ovn Metallb and Kube-OVN Combine E2E
40024009
id: kube-ovn-underlay-metallb-e2e
40034010
working-directory: ${{ env.E2E_DIR }}
40044011
env:
40054012
E2E_BRANCH: ${{ github.base_ref || github.ref_name }}
4013+
E2E_IP_FAMILY: ${{ matrix.ip-family }}
40064014
run: make kube-ovn-underlay-metallb-e2e
40074015

40084016
- name: Collect k8s events
4009-
if: failure() && ( steps.ovn-metallb-e2e.conclusion == 'failure')
4017+
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40104018
run: |
4011-
kubectl get events -A -o yaml > kube-ovn-underlay-metallb-e2e-events.yaml
4012-
tar zcf kube-ovn-underlay-metallb-e2e-events.tar.gz kube-ovn-underlay-metallb-e2e-events.yaml
4019+
kubectl get events -A -o yaml > kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-events.yaml
4020+
tar zcf kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-events.tar.gz kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-events.yaml
40134021
40144022
- name: Upload k8s events
40154023
uses: actions/upload-artifact@v6
40164024
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40174025
with:
4018-
name: kube-ovn-underlay-metallb-e2e-events
4019-
path: kube-ovn-underlay-metallb-e2e-events.tar.gz
4026+
name: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-events
4027+
path: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-events.tar.gz
40204028

40214029
- name: Collect apiserver audit logs
40224030
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40234031
run: |
40244032
docker cp kube-ovn-control-plane:/var/log/kubernetes/kube-apiserver-audit.log .
4025-
tar zcf kube-ovn-underlay-metallb-e2e-audit-log.tar.gz kube-apiserver-audit.log
4033+
tar zcf kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-audit-log.tar.gz kube-apiserver-audit.log
40264034
40274035
- name: Upload apiserver audit logs
40284036
uses: actions/upload-artifact@v6
40294037
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40304038
with:
4031-
name: kube-ovn-underlay-metallb-e2e-audit-log
4032-
path: kube-ovn-underlay-metallb-e2e-audit-log.tar.gz
4039+
name: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-audit-log
4040+
path: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-audit-log.tar.gz
40334041

40344042
- name: kubectl ko log
40354043
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40364044
run: |
40374045
make kubectl-ko-log
4038-
mv kubectl-ko-log.tar.gz kube-ovn-underlay-metallb-e2e-ko-log.tar.gz
4046+
mv kubectl-ko-log.tar.gz kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-ko-log.tar.gz
40394047
40404048
- name: upload kubectl ko log
40414049
uses: actions/upload-artifact@v6
40424050
if: failure() && (steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')
40434051
with:
4044-
name: kube-ovn-underlay-metallb-e2e-ko-log
4045-
path: kube-ovn-underlay-metallb-e2e-ko-log.tar.gz
4052+
name: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-ko-log
4053+
path: kube-ovn-underlay-metallb-${{ matrix.ip-family }}-e2e-ko-log.tar.gz
40464054

40474055
- name: Check kube ovn pod restarts
40484056
if: ${{ success() || (failure() && (steps.install.conclusion == 'failure' || steps.kube-ovn-underlay-metallb-e2e.conclusion == 'failure')) }}

dist/images/Dockerfile.base

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ RUN cd /usr/src/ && git clone -b branch-25.03 --depth=1 https://github.com/ovn-o
118118
git apply $SRC_DIR/03e35ed9c5b4de0fa8acbc2c057cdd5957a8d605.patch && \
119119
# skip node local dns ip conntrack when set acl
120120
git apply $SRC_DIR/e7d3ba53cdcbc524bb29c54ddb07b83cc4258ed7.patch && \
121-
# select local backend first
121+
# loadbalancer select local backend first
122122
git apply $SRC_DIR/9286e1fd578fdb8f565a0f4aa9066b538295e1ac.patch && \
123123
# fix lr-lb dnat with multiple distributed gateway ports
124124
git apply $SRC_DIR/e5916eb53abc3b7d28c407c3c47566c46116090a.patch && \

dist/images/patches/9286e1fd578fdb8f565a0f4aa9066b538295e1ac.patch

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
From 9286e1fd578fdb8f565a0f4aa9066b538295e1ac Mon Sep 17 00:00:00 2001
1+
From 9d26772725a18ac5fb5f7a6e22cb80d53383e4c9 Mon Sep 17 00:00:00 2001
22
From: clyi <clyi@alauda.io>
3-
Date: Tue, 11 Feb 2025 10:17:52 +0800
3+
Date: Thu, 15 Jan 2026 10:30:05 +0800
44
Subject: [PATCH] add select local lb backend
55

66
Signed-off-by: clyi <clyi@alauda.io>
77
---
88
northd/lb.c | 34 ++++++++++++
99
northd/lb.h | 1 +
10-
northd/northd.c | 139 +++++++++++++++++++++++++++++++++++++++++++++---
10+
northd/northd.c | 144 +++++++++++++++++++++++++++++++++++++++++++++---
1111
northd/northd.h | 10 ++++
12-
4 files changed, 177 insertions(+), 7 deletions(-)
12+
4 files changed, 182 insertions(+), 7 deletions(-)
1313

1414
diff --git a/northd/lb.c b/northd/lb.c
15-
index af0c92954c..71633ae788 100644
15+
index af0c92954..f0771b88e 100644
1616
--- a/northd/lb.c
1717
+++ b/northd/lb.c
1818
@@ -150,6 +150,36 @@ ovn_lb_vip_backends_health_check_init(const struct ovn_northd_lb *lb,
@@ -71,7 +71,7 @@ index af0c92954c..71633ae788 100644
7171
}
7272

7373
diff --git a/northd/lb.h b/northd/lb.h
74-
index aa6616af41..c7a9ba90b5 100644
74+
index aa6616af4..c7a9ba90b 100644
7575
--- a/northd/lb.h
7676
+++ b/northd/lb.h
7777
@@ -65,6 +65,7 @@ struct ovn_northd_lb {
@@ -83,10 +83,10 @@ index aa6616af41..c7a9ba90b5 100644
8383

8484
struct sset ips_v4;
8585
diff --git a/northd/northd.c b/northd/northd.c
86-
index d3b4fed086..c75f2e51de 100644
86+
index f6559c240..918016123 100644
8787
--- a/northd/northd.c
8888
+++ b/northd/northd.c
89-
@@ -3764,7 +3764,9 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
89+
@@ -3747,7 +3747,9 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
9090
struct ds *skip_snat_action,
9191
struct ds *force_snat_action,
9292
bool ls_dp,
@@ -97,7 +97,7 @@ index d3b4fed086..c75f2e51de 100644
9797
{
9898
bool reject = !lb_vip->n_backends && lb_vip->empty_backend_rej;
9999
bool drop = !lb_vip->n_backends && !lb_vip->empty_backend_rej;
100-
@@ -3788,6 +3790,12 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
100+
@@ -3771,6 +3773,12 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
101101
struct ovn_northd_lb_backend *backend_nb =
102102
&lb_vip_nb->backends_nb[i];
103103

@@ -110,7 +110,7 @@ index d3b4fed086..c75f2e51de 100644
110110
if (!backend_nb->health_check) {
111111
continue;
112112
}
113-
@@ -3821,8 +3829,11 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
113+
@@ -3804,8 +3812,11 @@ build_lb_vip_actions(const struct ovn_northd_lb *lb,
114114
drop = !n_active_backends && !lb_vip->empty_backend_rej;
115115
reject = !n_active_backends && lb_vip->empty_backend_rej;
116116
} else {
@@ -124,7 +124,7 @@ index d3b4fed086..c75f2e51de 100644
124124
}
125125

126126
if (reject) {
127-
@@ -8329,7 +8340,8 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
127+
@@ -8233,7 +8244,8 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
128128
const struct ovn_datapaths *ls_datapaths,
129129
struct ds *match, struct ds *action,
130130
const struct shash *meter_groups,
@@ -134,7 +134,7 @@ index d3b4fed086..c75f2e51de 100644
134134
{
135135
const struct ovn_northd_lb *lb = lb_dps->lb;
136136
for (size_t i = 0; i < lb->n_vips; i++) {
137-
@@ -8340,13 +8352,122 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
137+
@@ -8244,13 +8256,127 @@ build_lb_rules(struct lflow_table *lflows, struct ovn_lb_datapaths *lb_dps,
138138

139139
ds_clear(action);
140140
ds_clear(match);
@@ -167,7 +167,12 @@ index d3b4fed086..c75f2e51de 100644
167167
+ entry->lp_array[entry->n_lps] = op;
168168
+ entry->n_lps++;
169169
+
170-
+ char *new_backend_ips = xasprintf("%s%s%s:%s", entry->backend_ips, entry->n_lps > 1 ? "," : "", backend->ip_str, backend->port_str);
170+
+ char *new_backend_ips;
171+
+ if (IN6_IS_ADDR_V4MAPPED(&backend->ip)) {
172+
+ new_backend_ips = xasprintf("%s%s%s:%s", entry->backend_ips, entry->n_lps > 1 ? "," : "", backend->ip_str, backend->port_str);
173+
+ } else {
174+
+ new_backend_ips = xasprintf("%s%s[%s]:%s", entry->backend_ips, entry->n_lps > 1 ? "," : "", backend->ip_str, backend->port_str);
175+
+ }
171176
+ free(entry->backend_ips);
172177
+ entry->backend_ips = new_backend_ips;
173178
+ sset_add(&entry->logical_ports, backend_nb->logical_port);
@@ -258,7 +263,7 @@ index d3b4fed086..c75f2e51de 100644
258263

259264
ds_put_format(match, "ct.new && %s.dst == %s", ip_match,
260265
lb_vip->vip_str);
261-
@@ -12423,7 +12544,7 @@ build_lrouter_nat_flows_for_lb(
266+
@@ -12252,7 +12378,7 @@ build_lrouter_nat_flows_for_lb(
262267
bool reject = build_lb_vip_actions(lb, lb_vip, vips_nb, action,
263268
lb->selection_fields, &skip_snat_act,
264269
&force_snat_act, false,
@@ -267,15 +272,15 @@ index d3b4fed086..c75f2e51de 100644
267272

268273
/* Higher priority rules are added for load-balancing in DNAT
269274
* table. For every match (on a VIP[:port]), we add two flows.
270-
@@ -12581,6 +12702,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps,
275+
@@ -12410,6 +12536,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps,
271276
const struct shash *meter_groups,
272277
const struct ovn_datapaths *ls_datapaths,
273278
const struct hmap *svc_monitor_map,
274279
+ struct hmap *ls_ports,
275280
struct ds *match, struct ds *action)
276281
{
277282
if (!lb_dps->n_nb_ls) {
278-
@@ -12624,7 +12746,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps,
283+
@@ -12453,7 +12580,7 @@ build_lswitch_flows_for_lb(struct ovn_lb_datapaths *lb_dps,
279284
* REGBIT_CONNTRACK_COMMIT. */
280285
build_lb_rules_pre_stateful(lflows, lb_dps, ls_datapaths, match, action);
281286
build_lb_rules(lflows, lb_dps, ls_datapaths, match, action,
@@ -284,23 +289,23 @@ index d3b4fed086..c75f2e51de 100644
284289
}
285290

286291
/* If there are any load balancing rules, we should send the packet to
287-
@@ -18033,6 +18155,7 @@ build_lflows_thread(void *arg)
292+
@@ -17924,6 +18051,7 @@ build_lflows_thread(void *arg)
288293
lsi->meter_groups,
289294
lsi->ls_datapaths,
290295
lsi->svc_monitor_map,
291296
+ lsi->ls_ports,
292297
&lsi->match, &lsi->actions);
293298
}
294299
}
295-
@@ -18267,6 +18390,7 @@ build_lswitch_and_lrouter_flows(
300+
@@ -18158,6 +18286,7 @@ build_lswitch_and_lrouter_flows(
296301
build_lswitch_flows_for_lb(lb_dps, lsi.lflows, lsi.meter_groups,
297302
lsi.ls_datapaths,
298303
lsi.svc_monitor_map,
299304
+ lsi.ls_ports,
300305
&lsi.match, &lsi.actions);
301306
}
302307
stopwatch_stop(LFLOWS_LBS_STOPWATCH_NAME, time_msec());
303-
@@ -18636,6 +18760,7 @@ lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn,
308+
@@ -18527,6 +18656,7 @@ lflow_handle_northd_lb_changes(struct ovsdb_idl_txn *ovnsb_txn,
304309
lflow_input->meter_groups,
305310
lflow_input->ls_datapaths,
306311
lflow_input->svc_monitor_map,
@@ -309,7 +314,7 @@ index d3b4fed086..c75f2e51de 100644
309314

310315
ds_destroy(&match);
311316
diff --git a/northd/northd.h b/northd/northd.h
312-
index 388bac6df5..d9f7eb12c0 100644
317+
index ba86ac5c9..0d53cfac6 100644
313318
--- a/northd/northd.h
314319
+++ b/northd/northd.h
315320
@@ -813,6 +813,16 @@ find_route_outport(const struct hmap *lr_ports, const char *output_port,
@@ -329,3 +334,6 @@ index 388bac6df5..d9f7eb12c0 100644
329334
void ovnnb_db_run(struct northd_input *input_data,
330335
struct northd_data *data,
331336
struct ovsdb_idl_txn *ovnnb_txn,
337+
--
338+
2.34.1
339+

makefiles/kind.mk

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,11 +518,24 @@ kind-configure-metallb:
518518
jinjanate yamls/metallb-cr.yaml.j2 -o metallb-cr.yaml
519519
kubectl apply -f metallb-cr.yaml
520520

521-
.PHONY: kind-install-metallb-pool-from-underlay
522-
kind-install-metallb-pool-from-underlay: kind-load-image
521+
.PHONY: kind-install-metallb-pool-from-underlay-ipv4
522+
kind-install-metallb-pool-from-underlay-ipv4: kind-load-image
523523
@$(MAKE) ENABLE_OVN_LB_PREFER_LOCAL=true LS_CT_SKIP_DST_LPORT_IPS=false kind-install
524524
@$(MAKE) kind-install-metallb
525525

526+
.PHONY: kind-install-metallb-pool-from-underlay-ipv6
527+
kind-install-metallb-pool-from-underlay-ipv6: kind-load-image
528+
@$(MAKE) ENABLE_OVN_LB_PREFER_LOCAL=true LS_CT_SKIP_DST_LPORT_IPS=false IPV6=true kind-install
529+
@$(MAKE) IPV6=true kind-install-metallb
530+
531+
.PHONY: kind-install-metallb-pool-from-underlay-dual
532+
kind-install-metallb-pool-from-underlay-dual: kind-load-image
533+
@$(MAKE) ENABLE_OVN_LB_PREFER_LOCAL=true LS_CT_SKIP_DST_LPORT_IPS=false DUAL_STACK=true kind-install
534+
@$(MAKE) DUAL_STACK=true kind-install-metallb
535+
536+
.PHONY: kind-install-metallb-pool-from-underlay
537+
kind-install-metallb-pool-from-underlay: kind-install-metallb-pool-from-underlay-ipv4
538+
526539
.PHONY: kind-install-vpc-nat-gw
527540
kind-install-vpc-nat-gw:
528541
@$(MAKE) kind-load-image-vpc-nat-gateway

pkg/controller/endpoint_slice.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -685,7 +685,11 @@ func (c *Controller) addIPPortMappingEntry(pod *v1.Pod, addresses []string, chec
685685
}
686686

687687
for _, address := range addresses {
688-
mapping[address] = fmt.Sprintf(util.HealthCheckNamedVipTemplate, lspName, checkVip)
688+
key := address
689+
if util.CheckProtocol(address) == kubeovnv1.ProtocolIPv6 {
690+
key = fmt.Sprintf("[%s]", address)
691+
}
692+
mapping[key] = fmt.Sprintf(util.HealthCheckNamedVipTemplate, lspName, checkVip)
689693
}
690694

691695
return nil

0 commit comments

Comments
 (0)