controller: added finalizer processing

This commit is contained in:
2026-04-13 17:07:18 +02:00
parent fc89c098b6
commit 3402c09a77
+66 -9
View File
@@ -127,7 +127,11 @@ func (cont *Controller) addService(obj any) {
} }
} }
cont.log.Debugf("Service %s/%s forwarded", service.Namespace, service.Name) cont.log.Debugf("Service %s/%s forwarded", service.Namespace, service.Name)
err := cont.patchService(service) err := cont.addStatus(service)
if err != nil {
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
}
err = cont.addFinalizer(service)
if err != nil { if err != nil {
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err) cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
} }
@@ -151,7 +155,7 @@ func (cont *Controller) updateService(oldObj, newObj any) {
return return
} }
} }
err := cont.patchService(newService) err := cont.addStatus(newService)
if err != nil { if err != nil {
cont.log.Errorf("Error patch service %s/%s: %v", newService.Namespace, newService.Name, err) cont.log.Errorf("Error patch service %s/%s: %v", newService.Namespace, newService.Name, err)
} }
@@ -171,6 +175,10 @@ func (cont *Controller) deleteService(obj any) {
cont.log.Errorf("Error unforwarding service %s/%s: %v", service.Namespace, service.Name, err) cont.log.Errorf("Error unforwarding service %s/%s: %v", service.Namespace, service.Name, err)
} }
} }
err := cont.deleteFinalizer(service)
if err != nil {
cont.log.Debugf("Error patch service %s/%s: %v", service.Namespace, service.Name, err)
}
cont.log.Debugf("Service %s/%s unforwarded", service.Namespace, service.Name) cont.log.Debugf("Service %s/%s unforwarded", service.Namespace, service.Name)
} }
} }
@@ -197,12 +205,50 @@ func makeForwardings(service *kubecore.Service) []*Forwarding {
return forwardings return forwardings
} }
func (cont *Controller) patchService(svc *kubecore.Service) error { const LoadBalancerFinalizer = "service.kubernetes.io/load-balancer"
func (cont *Controller) addFinalizer(oldSvc *kubecore.Service) error {
var err error var err error
oldData, err := json.Marshal(svc) for _, finalizer := range oldSvc.ObjectMeta.Finalizers {
if finalizer == LoadBalancerFinalizer {
return err
}
}
newSvc := oldSvc.DeepCopy()
newSvc.ObjectMeta.Finalizers = append(newSvc.ObjectMeta.Finalizers, LoadBalancerFinalizer)
err = cont.patchService(oldSvc, newSvc)
if err != nil { if err != nil {
return err return err
} }
return err
}
func (cont *Controller) deleteFinalizer(oldSvc *kubecore.Service) error {
var err error
haveFinalizer := false
newFinalizers := make([]string, 0)
for _, finalizer := range oldSvc.ObjectMeta.Finalizers {
if finalizer == LoadBalancerFinalizer {
haveFinalizer = true
} else {
newFinalizers = append(newFinalizers, finalizer)
}
}
if !haveFinalizer {
return err
}
newSvc := oldSvc.DeepCopy()
newSvc.ObjectMeta.Finalizers = newFinalizers
err = cont.patchService(oldSvc, newSvc)
if err != nil {
return err
}
return err
}
func (cont *Controller) addStatus(oldSvc *kubecore.Service) error {
var err error
newSvc := oldSvc.DeepCopy()
ingressMode := kubecore.LoadBalancerIPModeProxy ingressMode := kubecore.LoadBalancerIPModeProxy
ingresses := make([]kubecore.LoadBalancerIngress, 0) ingresses := make([]kubecore.LoadBalancerIngress, 0)
ingresses = append(ingresses, kubecore.LoadBalancerIngress{ ingresses = append(ingresses, kubecore.LoadBalancerIngress{
@@ -212,13 +258,24 @@ func (cont *Controller) patchService(svc *kubecore.Service) error {
status := kubecore.LoadBalancerStatus{ status := kubecore.LoadBalancerStatus{
Ingress: ingresses, Ingress: ingresses,
} }
svc.Status.LoadBalancer = status newSvc.Status.LoadBalancer = status
err = cont.patchService(oldSvc, newSvc)
newData, err := json.Marshal(svc)
if err != nil { if err != nil {
return err return err
} }
return err
}
func (cont *Controller) patchService(oldSvc, newSvc *kubecore.Service) error {
var err error
oldData, err := json.Marshal(oldSvc)
if err != nil {
return err
}
newData, err := json.Marshal(newSvc)
if err != nil {
return err
}
patchBytes, err := k8patch.CreateTwoWayMergePatch(oldData, newData, kubecore.Service{}) patchBytes, err := k8patch.CreateTwoWayMergePatch(oldData, newData, kubecore.Service{})
if err != nil { if err != nil {
return err return err
@@ -228,8 +285,8 @@ func (cont *Controller) patchService(svc *kubecore.Service) error {
ctx, _ := context.WithTimeout(cont.ctx, 5*time.Second) ctx, _ := context.WithTimeout(cont.ctx, 5*time.Second)
patchServiceOpts := k8meta.PatchOptions{} patchServiceOpts := k8meta.PatchOptions{}
strategy := k8types.StrategicMergePatchType strategy := k8types.StrategicMergePatchType
_, err = cont.clientset.CoreV1().Services(svc.Namespace). _, err = cont.clientset.CoreV1().Services(oldSvc.Namespace).
Patch(ctx, svc.Name, strategy, patchBytes, patchServiceOpts, "status") Patch(ctx, oldSvc.Name, strategy, patchBytes, patchServiceOpts, "status")
if err != nil { if err != nil {
return err return err
} }