Skip to content

Commit 6ba997d

Browse files
authored
简化 ovn eip 类型 (#3107)
* 简化 ovn eip 类型 * support nat reuse lrp ip * fix const value * fix ecmp bfd static route * fix cleanup
1 parent a0c5e38 commit 6ba997d

File tree

13 files changed

+132
-122
lines changed

13 files changed

+132
-122
lines changed

dist/images/cleanup.sh

+15-5
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ for vd in $(kubectl get vpc-dns -o name); do
1818
kubectl delete --ignore-not-found $vd
1919
done
2020

21+
for ip in $(kubectl get ip -o name); do
22+
kubectl delete --ignore-not-found $ip
23+
done
24+
2125
for vip in $(kubectl get vip -o name); do
2226
kubectl delete --ignore-not-found $vip
2327
done
@@ -38,6 +42,10 @@ for eip in $(kubectl get eip -o name); do
3842
kubectl delete --ignore-not-found $eip
3943
done
4044

45+
for odnat in $(kubectl get odnat -o name); do
46+
kubectl delete --ignore-not-found $odnat
47+
done
48+
4149
for osnat in $(kubectl get osnat -o name); do
4250
kubectl delete --ignore-not-found $osnat
4351
done
@@ -63,6 +71,8 @@ for subnet in $(kubectl get subnet -o name); do
6371
kubectl patch "$subnet" --type='json' -p '[{"op": "replace", "path": "/metadata/finalizers", "value": []}]'
6472
kubectl delete --ignore-not-found "$subnet"
6573
done
74+
# subnet join will recreate, so delete subnet crd right now
75+
kubectl delete --ignore-not-found crd subnets.kubeovn.io
6676
set -e
6777

6878
for vpc in $(kubectl get vpc -o name); do
@@ -120,21 +130,21 @@ kubectl delete --ignore-not-found crd \
120130
security-groups.kubeovn.io \
121131
ips.kubeovn.io \
122132
ippools.kubeovn.io \
123-
subnets.kubeovn.io \
124133
vpc-nat-gateways.kubeovn.io \
125134
vpcs.kubeovn.io \
126135
vlans.kubeovn.io \
127136
provider-networks.kubeovn.io \
128137
iptables-dnat-rules.kubeovn.io \
129-
iptables-eips.kubeovn.io \
130-
iptables-fip-rules.kubeovn.io \
131138
iptables-snat-rules.kubeovn.io \
139+
iptables-fip-rules.kubeovn.io \
140+
iptables-eips.kubeovn.io \
132141
vips.kubeovn.io \
133142
switch-lb-rules.kubeovn.io \
134143
vpc-dnses.kubeovn.io \
135-
ovn-eips.kubeovn.io ovn-fips.kubeovn.io \
136-
ovn-snat-rules.kubeovn.io \
137144
ovn-dnat-rules.kubeovn.io \
145+
ovn-snat-rules.kubeovn.io \
146+
ovn-fips.kubeovn.io \
147+
ovn-eips.kubeovn.io \
138148
qos-policies.kubeovn.io
139149

140150
# Remove annotations/labels in namespaces and nodes

pkg/apis/kubeovn/v1/types.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -949,10 +949,10 @@ type OvnEipSpec struct {
949949
V6Ip string `json:"v6Ip"`
950950
MacAddress string `json:"macAddress"`
951951
Type string `json:"type"`
952-
// usage type: eip, lrp, node external gw
953-
// eip: only used by nat, fip, snat, dnat, all the nat type will record int the eip status
954-
// lrp: logical router port
955-
// node external gw: is lsp, in the case of bfd session between lrp and lsp, the lsp is on the node as external gateway
952+
// usage type: lrp, lsp, nat
953+
// nat: used by nat: dnat, snat, fip
954+
// lrp: lrp created by vpc enable external, and also could be used by nat
955+
// lsp: in the case of bfd session between lrp and lsp, the lsp is on the node as ecmp nexthop
956956
}
957957

958958
// OvnEipCondition describes the state of an object at a certain point.

pkg/controller/external-gw.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func (c *Controller) createDefaultVpcLrpEip(config map[string]string) (string, s
200200
klog.Errorf("failed to acquire ip address for default vpc lrp %s, %v", lrpEipName, err)
201201
return "", "", err
202202
}
203-
if err := c.createOrUpdateCrdOvnEip(lrpEipName, c.config.ExternalGatewaySwitch, v4ip, v6ip, mac, util.LrpUsingEip); err != nil {
203+
if err := c.createOrUpdateCrdOvnEip(lrpEipName, c.config.ExternalGatewaySwitch, v4ip, v6ip, mac, util.Lrp); err != nil {
204204
klog.Errorf("failed to create ovn eip cr for lrp %s, %v", lrpEipName, err)
205205
return "", "", err
206206
}

pkg/controller/ovn_dnat.go

+10-14
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
215215
klog.V(3).Infof("handle add dnat %s", key)
216216

217217
var internalV4Ip, mac, subnetName string
218-
if cachedDnat.Spec.IpType == util.NatUsingVip {
218+
if cachedDnat.Spec.IpType == util.Vip {
219219
internalVip, err := c.virtualIpsLister.Get(cachedDnat.Spec.IpName)
220220
if err != nil {
221221
klog.Errorf("failed to get vip %s, %v", cachedDnat.Spec.IpName, err)
@@ -248,8 +248,10 @@ func (c *Controller) handleAddOvnDnatRule(key string) error {
248248
return err
249249
}
250250

251-
if cachedEip.Status.Type != "" && cachedEip.Status.Type != util.NatUsingEip {
252-
err = fmt.Errorf("ovn eip %s type is not %s, can not use", cachedEip.Name, util.NatUsingEip)
251+
if cachedEip.Spec.Type == util.Lsp {
252+
// eip is using by ecmp nexthop lsp, nat can not use
253+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
254+
klog.Error(err)
253255
return err
254256
}
255257

@@ -354,7 +356,7 @@ func (c *Controller) handleUpdateOvnDnatRule(key string) error {
354356

355357
klog.V(3).Infof("handle update dnat %s", key)
356358
var internalV4Ip, mac, subnetName string
357-
if cachedDnat.Spec.IpType == util.NatUsingVip {
359+
if cachedDnat.Spec.IpType == util.Vip {
358360
internalVip, err := c.virtualIpsLister.Get(cachedDnat.Spec.IpName)
359361
if err != nil {
360362
klog.Errorf("failed to get vip %s, %v", cachedDnat.Spec.IpName, err)
@@ -410,16 +412,10 @@ func (c *Controller) handleUpdateOvnDnatRule(key string) error {
410412
return err
411413
}
412414

413-
if cachedEip.Spec.Type != "" && cachedEip.Spec.Type != util.DnatUsingEip {
414-
// eip is in use by other nat
415-
err = fmt.Errorf("failed to update dnat %s, eip '%s' is using by %s", key, eipName, cachedEip.Spec.Type)
416-
return err
417-
}
418-
419-
if cachedEip.Spec.Type == util.DnatUsingEip &&
420-
cachedEip.Annotations[util.VpcNatAnnotation] != "" &&
421-
cachedEip.Annotations[util.VpcNatAnnotation] != cachedDnat.Name {
422-
err = fmt.Errorf("failed to update dnat %s, eip '%s' is using by other dnat %s", key, eipName, cachedEip.Annotations[util.VpcNatAnnotation])
415+
if cachedEip.Spec.Type == util.Lsp {
416+
// eip is using by ecmp nexthop lsp, nat can not use
417+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
418+
klog.Error(err)
423419
return err
424420
}
425421

pkg/controller/ovn_eip.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ func (c *Controller) handleAddOvnEip(key string) error {
247247
return err
248248
}
249249

250-
if cachedEip.Spec.Type == util.NodeExtGwUsingEip {
250+
if cachedEip.Spec.Type == util.Lsp {
251251
mergedIp := util.GetStringIP(v4ip, v6ip)
252252
if err := c.ovnClient.CreateBareLogicalSwitchPort(subnet.Name, portName, mergedIp, mac); err != nil {
253253
klog.Error("failed to create lsp for ovn eip %s, %v", key, err)
@@ -262,8 +262,8 @@ func (c *Controller) handleAddOvnEip(key string) error {
262262
klog.Errorf("failed to create or update ovn eip '%s', %v", cachedEip.Name, err)
263263
return err
264264
}
265-
if cachedEip.Spec.Type != util.NodeExtGwUsingEip {
266-
// node ext gw eip has a nic on node, so left node to make it ready
265+
if cachedEip.Spec.Type != util.Lsp {
266+
// node ext gw use lsp eip, has a nic on gw node, so left node to make it ready
267267
if err = c.patchOvnEipStatus(key, true); err != nil {
268268
klog.Errorf("failed to patch ovn eip %s: %v", key, err)
269269
return err
@@ -302,8 +302,8 @@ func (c *Controller) handleUpdateOvnEip(key string) error {
302302
}
303303
return nil
304304
}
305-
if cachedEip.Spec.Type != util.NodeExtGwUsingEip {
306-
// node ext gw eip has a nic on node, so left node to make it ready
305+
if cachedEip.Spec.Type != util.Lsp {
306+
// node ext gw use lsp eip, has a nic on gw node, so left node to make it ready
307307
if err = c.patchOvnEipStatus(key, true); err != nil {
308308
klog.Errorf("failed to patch ovn eip %s: %v", key, err)
309309
return err
@@ -345,14 +345,14 @@ func (c *Controller) handleDelOvnEip(eip *kubeovnv1.OvnEip) error {
345345
return err
346346
}
347347

348-
if eip.Spec.Type == util.NodeExtGwUsingEip {
348+
if eip.Spec.Type == util.Lsp {
349349
if err := c.ovnClient.DeleteLogicalSwitchPort(eip.Name); err != nil {
350350
klog.Errorf("failed to delete lsp %s, %v", eip.Name, err)
351351
return err
352352
}
353353
}
354354

355-
if eip.Spec.Type == util.LrpUsingEip {
355+
if eip.Spec.Type == util.Lrp {
356356
if err := c.ovnClient.DeleteLogicalRouterPort(eip.Name); err != nil {
357357
klog.Errorf("failed to delete lrp %s, %v", eip.Name, err)
358358
return err

pkg/controller/ovn_fip.go

+14-4
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func (c *Controller) handleAddOvnFip(key string) error {
204204
}
205205
klog.V(3).Infof("handle add fip %s", key)
206206
var internalV4Ip, mac, subnetName string
207-
if cachedFip.Spec.IpType == util.NatUsingVip {
207+
if cachedFip.Spec.IpType == util.Vip {
208208
internalVip, err := c.virtualIpsLister.Get(cachedFip.Spec.IpName)
209209
if err != nil {
210210
klog.Errorf("failed to get vip %s, %v", cachedFip.Spec.IpName, err)
@@ -237,6 +237,13 @@ func (c *Controller) handleAddOvnFip(key string) error {
237237
return err
238238
}
239239

240+
if cachedEip.Spec.Type == util.Lsp {
241+
// eip is using by ecmp nexthop lsp, nat can not use
242+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
243+
klog.Error(err)
244+
return err
245+
}
246+
240247
if err = c.ovnFipTryUseEip(key, cachedEip.Spec.V4Ip); err != nil {
241248
err = fmt.Errorf("failed to add fip %s, %v", key, err)
242249
klog.Error(err)
@@ -258,6 +265,7 @@ func (c *Controller) handleAddOvnFip(key string) error {
258265
err = fmt.Errorf("ovn eip %s type is not %s, can not use", cachedEip.Name, util.NatUsingEip)
259266
return err
260267
}
268+
261269
if err = c.ovnFipTryUseEip(key, cachedEip.Spec.V4Ip); err != nil {
262270
err = fmt.Errorf("failed to update fip %s, %v", key, err)
263271
klog.Error(err)
@@ -310,7 +318,7 @@ func (c *Controller) handleUpdateOvnFip(key string) error {
310318
}
311319
klog.V(3).Infof("handle update fip %s", key)
312320
var internalV4Ip, mac, subnetName string
313-
if cachedFip.Spec.IpType == util.NatUsingVip {
321+
if cachedFip.Spec.IpType == util.Vip {
314322
internalVip, err := c.virtualIpsLister.Get(cachedFip.Spec.IpName)
315323
if err != nil {
316324
klog.Errorf("failed to get vip %s, %v", cachedFip.Spec.IpName, err)
@@ -341,8 +349,10 @@ func (c *Controller) handleUpdateOvnFip(key string) error {
341349
klog.Errorf("failed to get eip, %v", err)
342350
return err
343351
}
344-
if cachedEip.Status.Type != "" && cachedEip.Status.Type != util.NatUsingEip {
345-
err = fmt.Errorf("ovn eip %s type is not %s, can not use", cachedEip.Name, util.NatUsingEip)
352+
if cachedEip.Spec.Type == util.Lsp {
353+
// eip is using by ecmp nexthop lsp, nat can not use
354+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
355+
klog.Error(err)
346356
return err
347357
}
348358
if err = c.ovnFipTryUseEip(key, cachedEip.Spec.V4Ip); err != nil {

pkg/controller/ovn_snat.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,10 @@ func (c *Controller) handleAddOvnSnatRule(key string) error {
197197
return err
198198
}
199199

200-
if cachedEip.Status.Type != "" && cachedEip.Status.Type != util.NatUsingEip {
201-
err = fmt.Errorf("ovn eip %s type is not %s, can not use", cachedEip.Name, util.NatUsingEip)
200+
if cachedEip.Spec.Type == util.Lsp {
201+
// eip is using by ecmp nexthop lsp, nat can not use
202+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
203+
klog.Error(err)
202204
return err
203205
}
204206

@@ -303,8 +305,10 @@ func (c *Controller) handleUpdateOvnSnatRule(key string) error {
303305
return nil
304306
}
305307

306-
if cachedEip.Status.Type != "" && cachedEip.Status.Type != util.NatUsingEip {
307-
err = fmt.Errorf("ovn eip %s type is not %s, can not use", cachedEip.Name, util.NatUsingEip)
308+
if cachedEip.Spec.Type == util.Lsp {
309+
// eip is using by ecmp nexthop lsp, nat can not use
310+
err = fmt.Errorf("ovn nat %s can not use type %s eip %s", key, util.Lsp, eipName)
311+
klog.Error(err)
308312
return err
309313
}
310314

pkg/controller/subnet.go

+14-18
Original file line numberDiff line numberDiff line change
@@ -1190,13 +1190,13 @@ func (c *Controller) reconcileNamespaces(subnet *kubeovnv1.Subnet) error {
11901190
func (c *Controller) reconcileCustomVpcBfdStaticRoute(vpcName, subnetName string) error {
11911191
// vpc enable bfd and subnet enable ecmp
11921192
// use static ecmp route with bfd
1193-
ovnEips, err := c.ovnEipsLister.List(labels.SelectorFromSet(labels.Set{util.OvnEipTypeLabel: util.NodeExtGwUsingEip}))
1193+
ovnEips, err := c.ovnEipsLister.List(labels.SelectorFromSet(labels.Set{util.OvnEipTypeLabel: util.Lsp}))
11941194
if err != nil {
11951195
klog.Errorf("failed to list node external ovn eip, %v", err)
11961196
return err
11971197
}
11981198
if len(ovnEips) < 2 {
1199-
err := fmt.Errorf("ecmp route with bfd for HA, which need two %s type eips at least, has %d", util.NodeExtGwUsingEip, len(ovnEips))
1199+
err := fmt.Errorf("ecmp route with bfd for HA, which need two %s type eips at least, has %d", util.Lsp, len(ovnEips))
12001200
klog.Error(err)
12011201
return err
12021202
}
@@ -1266,17 +1266,15 @@ func (c *Controller) reconcileCustomVpcBfdStaticRoute(vpcName, subnetName string
12661266
}
12671267
}
12681268
if needUpdate {
1269-
if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}); err != nil {
1269+
if vpc, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}); err != nil {
12701270
klog.Errorf("failed to update vpc spec static route %s, %v", vpc.Name, err)
12711271
return err
12721272
}
1273+
if err = c.patchVpcBfdStatus(vpc.Name); err != nil {
1274+
klog.Errorf("failed to patch vpc %s, %v", vpc.Name, err)
1275+
return err
1276+
}
12731277
}
1274-
1275-
if err = c.patchVpcBfdStatus(vpc.Name); err != nil {
1276-
klog.Errorf("failed to patch vpc %s, %v", vpc.Name, err)
1277-
return err
1278-
}
1279-
12801278
return nil
12811279
}
12821280

@@ -1292,15 +1290,15 @@ func (c *Controller) reconcileCustomVpcAddNormalStaticRoute(vpcName string) erro
12921290
return err
12931291
}
12941292
gatewayV4, gatewayV6 := util.SplitStringIP(defualtExternalSubnet.Spec.Gateway)
1295-
vpc, err := c.vpcsLister.Get(vpcName)
1293+
cachedVpc, err := c.vpcsLister.Get(vpcName)
12961294
if err != nil {
12971295
if k8serrors.IsNotFound(err) {
12981296
return nil
12991297
}
13001298
klog.Errorf("failed to get vpc %s, %v", vpcName, err)
13011299
return err
13021300
}
1303-
1301+
vpc := cachedVpc.DeepCopy()
13041302
rtbs := c.getRouteTablesByVpc(vpc)
13051303
routeTotal := len(vpc.Spec.StaticRoutes) + len(rtbs)*2
13061304
routes := make([]*kubeovnv1.StaticRoute, 0, routeTotal)
@@ -1351,17 +1349,15 @@ func (c *Controller) reconcileCustomVpcAddNormalStaticRoute(vpcName string) erro
13511349

13521350
if needUpdate {
13531351
vpc.Spec.StaticRoutes = routes
1354-
if _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}); err != nil {
1352+
if vpc, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}); err != nil {
13551353
klog.Errorf("failed to update vpc spec static route %s, %v", vpc.Name, err)
13561354
return err
13571355
}
1356+
if err = c.patchVpcBfdStatus(vpc.Name); err != nil {
1357+
klog.Errorf("failed to patch vpc %s, %v", vpc.Name, err)
1358+
return err
1359+
}
13581360
}
1359-
1360-
if err = c.patchVpcBfdStatus(vpc.Name); err != nil {
1361-
klog.Errorf("failed to patch vpc %s, %v", vpc.Name, err)
1362-
return err
1363-
}
1364-
13651361
return nil
13661362
}
13671363

0 commit comments

Comments
 (0)