@@ -20,6 +20,7 @@ import (
2020 "context"
2121 "encoding/json"
2222 "fmt"
23+ cloudprovider "k8s.io/cloud-provider"
2324 "strings"
2425
2526 elbmodel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/elb/v3/model"
@@ -107,8 +108,11 @@ func (d *DedicatedLoadBalancer) GetLoadBalancerName(_ context.Context, clusterNa
107108}
108109
109110func (d * DedicatedLoadBalancer ) EnsureLoadBalancer (ctx context.Context , clusterName string , service * v1.Service , nodes []* v1.Node ) (* v1.LoadBalancerStatus , error ) {
110- klog .Infof ("EnsureLoadBalancer: called with service %s/%s, node: %d" ,
111- service .Namespace , service .Name , len (nodes ))
111+ if ! d .isSupportedSvc (service ) {
112+ return nil , cloudprovider .ImplementedElsewhere
113+ }
114+
115+ klog .Infof ("EnsureLoadBalancer: called with service %s/%s, node: %d" , service .Namespace , service .Name , len (nodes ))
112116
113117 if err := ensureLoadBalancerValidation (service , nodes ); err != nil {
114118 return nil , err
@@ -491,7 +495,7 @@ func (d *DedicatedLoadBalancer) deletePool(pool *elbmodel.Pool) []error {
491495}
492496
493497func (d * DedicatedLoadBalancer ) addOrRemoveMembers (loadbalancer * elbmodel.LoadBalancer , service * v1.Service ,
494- pool * elbmodel.Pool , port v1.ServicePort , nodes []* v1.Node ) error {
498+ pool * elbmodel.Pool , svcPort v1.ServicePort , nodes []* v1.Node ) error {
495499
496500 members , err := d .dedicatedELBClient .ListMembers (& elbmodel.ListMembersRequest {PoolId : pool .Id })
497501 if err != nil {
@@ -530,7 +534,7 @@ func (d *DedicatedLoadBalancer) addOrRemoveMembers(loadbalancer *elbmodel.LoadBa
530534 pod .Namespace , pod .Spec .NodeName )
531535 }
532536
533- address , err := getNodeAddress ( node )
537+ address , portNum , err := getMemberIP ( service , node , pod , svcPort )
534538 if err != nil {
535539 if common .IsNotFound (err ) {
536540 // Node failure, do not create member
@@ -541,18 +545,18 @@ func (d *DedicatedLoadBalancer) addOrRemoveMembers(loadbalancer *elbmodel.LoadBa
541545 }
542546 }
543547
544- key := fmt .Sprintf ("%s:%d" , address , port .NodePort )
548+ key := fmt .Sprintf ("%s:%d" , address , svcPort .NodePort )
545549 if existsMember [key ] {
546550 klog .Infof ("[addOrRemoveMembers] node already exists, skip adding, name: %s, address: %s, port: %d" ,
547- node .Name , address , port . NodePort )
548- members = d .popMember (members , address , port . NodePort )
551+ node .Name , address , portNum )
552+ members = d .popMember (members , address , portNum )
549553 continue
550554 }
551555
552556 klog .Infof ("[addOrRemoveMembers] add node to pool, name: %s, address: %s, port: %d" ,
553- node .Name , address , port . NodePort )
557+ node .Name , address , portNum )
554558 // Add a member to the pool.
555- if err = d .addMember (loadbalancer , pool , port , node ); err != nil {
559+ if err = d .addMember (service , loadbalancer , pool , pod , svcPort , node ); err != nil {
556560 return err
557561 }
558562 existsMember [key ] = true
@@ -571,22 +575,25 @@ func (d *DedicatedLoadBalancer) addOrRemoveMembers(loadbalancer *elbmodel.LoadBa
571575 return nil
572576}
573577
574- func (d * DedicatedLoadBalancer ) addMember (loadbalancer * elbmodel.LoadBalancer , pool * elbmodel.Pool , port v1.ServicePort ,
575- node * v1.Node ) error {
578+ func (d * DedicatedLoadBalancer ) addMember (service * v1.Service , loadbalancer * elbmodel.LoadBalancer , pool * elbmodel.Pool , pod v1.Pod , svcPort v1.ServicePort , node * v1.Node ) error {
576579 klog .Infof ("Add a member(%s) to pool %s" , node .Name , pool .Id )
577- address , err := getNodeAddress ( node )
580+ address , port , err := getMemberIP ( service , node , pod , svcPort )
578581 if err != nil {
579582 return err
580583 }
581584
582585 name := utils .CutString (fmt .Sprintf ("member_%s_%s" , pool .Name , node .Name ), defaultMaxNameLength )
583586 opt := & elbmodel.CreateMemberOption {
584587 Name : & name ,
585- ProtocolPort : port . NodePort ,
588+ ProtocolPort : port ,
586589 Address : address ,
587590 }
588591 if ! loadbalancer .IpTargetEnable {
589- opt .SubnetCidrId = & loadbalancer .VipSubnetCidrId
592+ subnetID , err := d .getSubnetID (service , node )
593+ if err != nil {
594+ return err
595+ }
596+ opt .SubnetCidrId = & subnetID
590597 }
591598
592599 if _ , err = d .dedicatedELBClient .AddMember (pool .Id , opt ); err != nil {
@@ -744,6 +751,10 @@ func (d *DedicatedLoadBalancer) createHealthMonitor(loadbalancerID, poolID, prot
744751
745752func (d * DedicatedLoadBalancer ) UpdateLoadBalancer (ctx context.Context , clusterName string , service * v1.Service , nodes []* v1.Node ) error {
746753 klog .Infof ("UpdateLoadBalancer: called with service %s/%s, node: %d" , service .Namespace , service .Name , len (nodes ))
754+ if ! d .isSupportedSvc (service ) {
755+ return cloudprovider .ImplementedElsewhere
756+ }
757+
747758 // get exits or create a new ELB instance
748759 loadbalancer , err := d .getLoadBalancerInstance (ctx , clusterName , service )
749760 if err != nil {
@@ -875,7 +886,7 @@ func (d *DedicatedLoadBalancer) deleteELBInstance(loadBalancer *elbmodel.LoadBal
875886
876887 klog .Infof ("deleting unbind EIP: %v" , eipID )
877888 if err := d .eipClient .Delete (eipID ); err != nil {
878- klog .Errorf ("failed to delete EIP: %s" , loadBalancer . Eips [ 0 ]. EipAddress )
889+ klog .Errorf ("failed to delete EIP: %s" , eipID )
879890 }
880891
881892 return nil
0 commit comments