diff --git a/pkg/controller/ip.go b/pkg/controller/ip.go index 486f761a09c..f5ad6351372 100644 --- a/pkg/controller/ip.go +++ b/pkg/controller/ip.go @@ -240,27 +240,29 @@ func (c *Controller) handleAddReservedIP(key string) error { klog.Error(err) return err } - cachedIP, err := c.ipsLister.Get(key) - if err != nil { - if k8serrors.IsNotFound(err) { - return nil + if ip.Labels[util.IPReservedLabel] != "false" { + cachedIP, err := c.ipsLister.Get(key) + if err != nil { + if k8serrors.IsNotFound(err) { + return nil + } + return err + } + ip = cachedIP.DeepCopy() + ip.Labels[util.IPReservedLabel] = "true" + patchPayloadTemplate := `[{ "op": "%s", "path": "/metadata/labels", "value": %s }]` + raw, err := json.Marshal(ip.Labels) + if err != nil { + klog.Error(err) + return err + } + op := "replace" + patchPayload := fmt.Sprintf(patchPayloadTemplate, op, raw) + if _, err := c.config.KubeOvnClient.KubeovnV1().IPs().Patch(context.Background(), ip.Name, + types.JSONPatchType, []byte(patchPayload), metav1.PatchOptions{}); err != nil { + klog.Errorf("failed to patch label for ip %s, %v", ip.Name, err) + return err } - return err - } - ip = cachedIP.DeepCopy() - ip.Labels[util.IPReservedLabel] = "true" - patchPayloadTemplate := `[{ "op": "%s", "path": "/metadata/labels", "value": %s }]` - raw, err := json.Marshal(ip.Labels) - if err != nil { - klog.Error(err) - return err - } - op := "replace" - patchPayload := fmt.Sprintf(patchPayloadTemplate, op, raw) - if _, err := c.config.KubeOvnClient.KubeovnV1().IPs().Patch(context.Background(), ip.Name, - types.JSONPatchType, []byte(patchPayload), metav1.PatchOptions{}); err != nil { - klog.Errorf("failed to patch label for ip %s, %v", ip.Name, err) - return err } return nil } @@ -471,6 +473,7 @@ func (c *Controller) createOrUpdateIPCR(ipCRName, podName, ip, mac, subnetName, util.SubnetNameLabel: subnetName, util.NodeNameLabel: nodeName, subnetName: "", + util.IPReservedLabel: "false", // ip create with pod or node, ip not reserved }, }, Spec: kubeovnv1.IPSpec{ diff --git a/pkg/controller/pod.go b/pkg/controller/pod.go index dfa676f1760..2f072b14ecc 100644 --- a/pkg/controller/pod.go +++ b/pkg/controller/pod.go @@ -1647,18 +1647,17 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st return vip.Status.V4ip, vip.Status.V6ip, vip.Status.Mac, podNet.Subnet, nil } - var macStr *string + var macPointer *string if isOvnSubnet(podNet.Subnet) { - mac := pod.Annotations[fmt.Sprintf(util.MacAddressAnnotationTemplate, podNet.ProviderName)] - if mac != "" { - if _, err := net.ParseMAC(mac); err != nil { + annoMAC := pod.Annotations[fmt.Sprintf(util.MacAddressAnnotationTemplate, podNet.ProviderName)] + if annoMAC != "" { + if _, err := net.ParseMAC(annoMAC); err != nil { return "", "", "", podNet.Subnet, err } - macStr = &mac + macPointer = &annoMAC } } else { - macStr = new(string) - *macStr = "" + macPointer = nil } ippoolStr := pod.Annotations[fmt.Sprintf(util.IPPoolAnnotationTemplate, podNet.ProviderName)] @@ -1680,7 +1679,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st for { portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName) - ipv4, ipv6, mac, err := c.ipam.GetRandomAddress(key, portName, macStr, podNet.Subnet.Name, "", skippedAddrs, !podNet.AllowLiveMigration) + ipv4, ipv6, mac, err := c.ipam.GetRandomAddress(key, portName, macPointer, podNet.Subnet.Name, "", skippedAddrs, !podNet.AllowLiveMigration) if err != nil { klog.Error(err) return "", "", "", podNet.Subnet, err @@ -1715,7 +1714,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st ipStr := pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)] for _, net := range nsNets { - v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, ipStr, macStr, net.Subnet.Name, net.AllowLiveMigration) + v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, ipStr, macPointer, net.Subnet.Name, net.AllowLiveMigration) if err == nil { return v4IP, v6IP, mac, net.Subnet, nil } @@ -1742,7 +1741,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st var skippedAddrs []string for { portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName) - ipv4, ipv6, mac, err := c.ipam.GetRandomAddress(key, portName, macStr, podNet.Subnet.Name, ipPool[0], skippedAddrs, !podNet.AllowLiveMigration) + ipv4, ipv6, mac, err := c.ipam.GetRandomAddress(key, portName, macPointer, podNet.Subnet.Name, ipPool[0], skippedAddrs, !podNet.AllowLiveMigration) if err != nil { klog.Error(err) return "", "", "", podNet.Subnet, err @@ -1781,7 +1780,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st continue } - v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, staticIP, macStr, net.Subnet.Name, net.AllowLiveMigration) + v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, staticIP, macPointer, net.Subnet.Name, net.AllowLiveMigration) if err == nil { return v4IP, v6IP, mac, net.Subnet, nil } @@ -1795,7 +1794,7 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st if index < len(ipPool) { for _, net := range nsNets { - v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, ipPool[index], macStr, net.Subnet.Name, net.AllowLiveMigration) + v4IP, v6IP, mac, err = c.acquireStaticAddress(key, portName, ipPool[index], macPointer, net.Subnet.Name, net.AllowLiveMigration) if err == nil { return v4IP, v6IP, mac, net.Subnet, nil } diff --git a/pkg/controller/subnet.go b/pkg/controller/subnet.go index acd5403fa9f..041d80810b9 100644 --- a/pkg/controller/subnet.go +++ b/pkg/controller/subnet.go @@ -2758,6 +2758,10 @@ func (c *Controller) deletePolicyRouteForU2OInterconn(subnet *kubeovnv1.Subnet) } func (c *Controller) addStaticRouteForU2OInterconn(subnet *kubeovnv1.Subnet) error { + if subnet.Spec.Vpc == "" { + return nil + } + var v4Gw, v6Gw, v4Cidr, v6Cidr string for _, gw := range strings.Split(subnet.Spec.Gateway, ",") { switch util.CheckProtocol(gw) { @@ -2807,6 +2811,10 @@ func (c *Controller) addStaticRouteForU2OInterconn(subnet *kubeovnv1.Subnet) err } func (c *Controller) deleteStaticRouteForU2OInterconn(subnet *kubeovnv1.Subnet) error { + if subnet.Spec.Vpc == "" { + return nil + } + var v4Gw, v6Gw, v4Cidr, v6Cidr string for _, gw := range strings.Split(subnet.Spec.Gateway, ",") { switch util.CheckProtocol(gw) { @@ -2846,6 +2854,7 @@ func (c *Controller) deleteStaticRouteForU2OInterconn(subnet *kubeovnv1.Subnet) v6Gw, kubeovnv1.PolicySrc, ); err != nil { + klog.Errorf("failed to delete static route, %v", err) return err } } diff --git a/pkg/controller/vpc.go b/pkg/controller/vpc.go index 8558af73490..5c3be03017d 100644 --- a/pkg/controller/vpc.go +++ b/pkg/controller/vpc.go @@ -727,9 +727,8 @@ func (c *Controller) addStaticRouteToVpc(name string, route *kubeovnv1.StaticRou func (c *Controller) deleteStaticRouteFromVpc(name, table, cidr, nextHop string, policy kubeovnv1.RoutePolicy) error { var ( - vpc, cachedVpc *kubeovnv1.Vpc - policyStr string - err error + policyStr string + err error ) policyStr = convertPolicy(policy) @@ -738,21 +737,6 @@ func (c *Controller) deleteStaticRouteFromVpc(name, table, cidr, nextHop string, return err } - cachedVpc, err = c.vpcsLister.Get(name) - if err != nil { - if k8serrors.IsNotFound(err) { - return nil - } - klog.Error(err) - return err - } - vpc = cachedVpc.DeepCopy() - // make sure custom policies not be deleted - _, err = c.config.KubeOvnClient.KubeovnV1().Vpcs().Update(context.Background(), vpc, metav1.UpdateOptions{}) - if err != nil { - klog.Error(err) - return err - } return nil }