diff --git a/pkg/kloudlb/constants.go b/pkg/kloudlb/constants.go index 74d031d..f3269cb 100644 --- a/pkg/kloudlb/constants.go +++ b/pkg/kloudlb/constants.go @@ -5,6 +5,7 @@ const ( AnnotationIP = "lb.kloude.ir/ip" AnnotationVIP = "lb.kloude.ir/vip" AnnotationLBID = "lb.kloude.ir/id" + AnnotationNode = "lb.kloude.ir/node" Namespace = "kube-system" ) diff --git a/pkg/kloudlb/controller/controller.go b/pkg/kloudlb/controller/controller.go index be94215..3be6861 100644 --- a/pkg/kloudlb/controller/controller.go +++ b/pkg/kloudlb/controller/controller.go @@ -191,6 +191,9 @@ func (c *Controller) sync(ctx context.Context, key string) error { patch.Annotations[kloudlb.AnnotationIP] = ingressIP patch.Annotations[kloudlb.AnnotationVIP] = vip patch.Annotations[kloudlb.AnnotationLBID] = lb.ID + if node := strings.TrimSpace(lb.Node); node != "" { + patch.Annotations[kloudlb.AnnotationNode] = node + } patch.Status = corev1.ServiceStatus{ LoadBalancer: corev1.LoadBalancerStatus{ Ingress: []corev1.LoadBalancerIngress{{IP: ingressIP}}, diff --git a/pkg/kloudlb/speaker/speaker.go b/pkg/kloudlb/speaker/speaker.go index ef15bdf..b82b725 100644 --- a/pkg/kloudlb/speaker/speaker.go +++ b/pkg/kloudlb/speaker/speaker.go @@ -147,6 +147,10 @@ func (s *Speaker) sync(ctx context.Context, key string) error { s.stopLeading(key, vip) return nil } + if owner := serviceOwnerNode(svc); owner != "" && owner != s.nodeName { + s.stopLeading(key, vip) + return nil + } leaseName := leaseNameFor(key) leader, err := s.acquireLease(ctx, leaseName, vip) @@ -161,6 +165,13 @@ func (s *Speaker) sync(ctx context.Context, key string) error { return s.ensureVIP(vip) } +func serviceOwnerNode(svc *corev1.Service) string { + if svc == nil || svc.Annotations == nil { + return "" + } + return strings.TrimSpace(svc.Annotations[kloudlb.AnnotationNode]) +} + func serviceExternalVIP(svc *corev1.Service) string { if svc.Annotations != nil { if vip := strings.TrimSpace(svc.Annotations[kloudlb.AnnotationVIP]); vip != "" { diff --git a/pkg/lb/provisioner/types.go b/pkg/lb/provisioner/types.go index 01bb48d..7bc0ed0 100644 --- a/pkg/lb/provisioner/types.go +++ b/pkg/lb/provisioner/types.go @@ -5,6 +5,7 @@ type LoadBalancer struct { IP string `json:"ip"` Namespace string `json:"namespace"` Name string `json:"name"` + Node string `json:"node,omitempty"` } type AllocateRequest struct {