From 15f676f64b62c40e55ab756a7610830b595d740c Mon Sep 17 00:00:00 2001 From: hzma <hzma@alauda.io> Date: Tue, 18 Oct 2022 16:16:19 +0800 Subject: [PATCH] add vm pod to ipam by ip when initIPAM (#1974) --- pkg/controller/controller.go | 8 +++++--- pkg/controller/init.go | 18 +++++++++++++++--- pkg/controller/pod.go | 4 ++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index a7bbb8c2..0dd70f1f 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -540,6 +540,11 @@ func (c *Controller) Run(stopCh <-chan struct{}) { klog.Fatalf("failed to init ovn resource: %v", err) } + // sync ip crd before initIPAM since ip crd will be used to restore vm and statefulset pod in initIPAM + if err := c.initSyncCrdIPs(); err != nil { + klog.Errorf("failed to sync crd ips: %v", err) + } + if err := c.InitIPAM(); err != nil { klog.Fatalf("failed to init ipam: %v", err) } @@ -562,9 +567,6 @@ func (c *Controller) Run(stopCh <-chan struct{}) { } c.registerSubnetMetrics() - if err := c.initSyncCrdIPs(); err != nil { - klog.Errorf("failed to sync crd ips: %v", err) - } if err := c.initSyncCrdSubnets(); err != nil { klog.Errorf("failed to sync crd subnets: %v", err) } diff --git a/pkg/controller/init.go b/pkg/controller/init.go index 45b9fc95..4e0e4ba1 100644 --- a/pkg/controller/init.go +++ b/pkg/controller/init.go @@ -330,8 +330,8 @@ func (c *Controller) InitIPAM() error { ipsMap := make(map[string]*kubeovnv1.IP, len(ips)) for _, ip := range ips { ipsMap[ip.Name] = ip - // just recover sts ip, old sts ip with empty pod type and other ip recover in later pod loop - if ip.Spec.PodType != "StatefulSet" { + // recover sts and kubevirt vm ip, other ip recover in later pod loop + if ip.Spec.PodType != "StatefulSet" && ip.Spec.PodType != util.Vm { continue } @@ -582,10 +582,22 @@ func (c *Controller) initSyncCrdIPs() error { return err } + vmLsps := c.getVmLsps() + ipMap := make(map[string]struct{}, len(vmLsps)) + for _, vmLsp := range vmLsps { + ipMap[vmLsp] = struct{}{} + } + for _, ipCr := range ips.Items { ip := ipCr.DeepCopy() + changed := false + if _, ok := ipMap[ip.Name]; ok && ip.Spec.PodType == "" { + ip.Spec.PodType = util.Vm + changed = true + } + v4IP, v6IP := util.SplitStringIP(ip.Spec.IPAddress) - if ip.Spec.V4IPAddress == v4IP && ip.Spec.V6IPAddress == v6IP { + if ip.Spec.V4IPAddress == v4IP && ip.Spec.V6IPAddress == v6IP && !changed { continue } ip.Spec.V4IPAddress = v4IP diff --git a/pkg/controller/pod.go b/pkg/controller/pod.go index f77f8f24..ac899cdb 100644 --- a/pkg/controller/pod.go +++ b/pkg/controller/pod.go @@ -1632,5 +1632,9 @@ func getPodType(pod *v1.Pod) string { if ok, _ := isStatefulSetPod(pod); ok { return "StatefulSet" } + + if isVmPod, _ := isVmPod(pod); isVmPod { + return util.Vm + } return "" } -- GitLab