Skip to content

Commit b7c4225

Browse files
fix: query ECS based on Pod IP to obtain subnet ID instead of HostName
1 parent ed39f31 commit b7c4225

File tree

4 files changed

+71
-11
lines changed

4 files changed

+71
-11
lines changed

pkg/cloudprovider/huaweicloud/dedicatedloadbalancer.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,18 @@ import (
2020
"context"
2121
"encoding/json"
2222
"fmt"
23-
cloudprovider "k8s.io/cloud-provider"
2423
"strings"
2524

26-
elbmodel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/elb/v3/model"
2725
"google.golang.org/grpc/codes"
2826
"google.golang.org/grpc/status"
2927
"k8s.io/api/core/v1"
3028
"k8s.io/apimachinery/pkg/util/errors"
29+
cloudprovider "k8s.io/cloud-provider"
3130
"k8s.io/klog/v2"
3231
"k8s.io/utils/pointer"
3332

33+
elbmodel "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/elb/v3/model"
34+
3435
"sigs.k8s.io/cloud-provider-huaweicloud/pkg/common"
3536
"sigs.k8s.io/cloud-provider-huaweicloud/pkg/config"
3637
"sigs.k8s.io/cloud-provider-huaweicloud/pkg/utils"
@@ -589,7 +590,7 @@ func (d *DedicatedLoadBalancer) addMember(service *v1.Service, loadbalancer *elb
589590
Address: address,
590591
}
591592
if !loadbalancer.IpTargetEnable {
592-
subnetID, err := d.getSubnetID(service, node)
593+
subnetID, err := d.getNodeSubnetIDByHostIP(address)
593594
if err != nil {
594595
return err
595596
}

pkg/cloudprovider/huaweicloud/huaweicloud.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,28 @@ func (b Basic) getSubnetID(service *v1.Service, node *v1.Node) (string, error) {
168168
return subnetID, nil
169169
}
170170

171+
func (b Basic) getNodeSubnetIDByHostIP(privateIP string) (string, error) {
172+
instance, err := b.ecsClient.GetByNodeIP(privateIP)
173+
if err != nil {
174+
return "", err
175+
}
176+
177+
interfaces, err := b.ecsClient.ListInterfaces(&ecsmodel.ListServerInterfacesRequest{ServerId: instance.Id})
178+
if err != nil {
179+
return "", err
180+
}
181+
182+
for _, inter := range interfaces {
183+
for _, fixedIP := range *inter.FixedIps {
184+
if fixedIP.IpAddress != nil && *fixedIP.IpAddress == privateIP {
185+
return *fixedIP.SubnetId, nil
186+
}
187+
}
188+
}
189+
190+
return "", fmt.Errorf("failed to get node subnet ID with private IP: %s", privateIP)
191+
}
192+
171193
func (b Basic) getNodeSubnetID(node *v1.Node) (string, error) {
172194
ipAddress, err := getNodeAddress(node)
173195
if err != nil {

pkg/cloudprovider/huaweicloud/sharedloadbalancer.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,7 @@ func (l *SharedLoadBalancer) addOrRemoveMembers(loadbalancer *elbmodel.Loadbalan
426426
pod.Namespace, pod.Spec.NodeName)
427427
}
428428

429-
//address, err := getNodeAddress(node)
429+
// address, err := getNodeAddress(node)
430430
address, portNum, err := getMemberIP(service, node, pod, svcPort)
431431
if err != nil {
432432
if common.IsNotFound(err) {
@@ -472,6 +472,10 @@ func getMemberIP(service *v1.Service, node *v1.Node, pod v1.Pod, svcPort v1.Serv
472472
if service.Spec.AllocateLoadBalancerNodePorts != nil && *service.Spec.AllocateLoadBalancerNodePorts {
473473
klog.V(6).Infof("add member using the Node's IP and port, service: %s/%s, port: %s ", service.Namespace, service.Name, svcPort.Name)
474474

475+
if pod.Status.HostIP != "" {
476+
return pod.Status.HostIP, svcPort.NodePort, nil
477+
}
478+
475479
address, err := getNodeAddress(node)
476480
if err != nil {
477481
return "", 0, err
@@ -506,18 +510,20 @@ func (l *SharedLoadBalancer) addMember(service *v1.Service, elbID, poolID string
506510
return err
507511
}
508512

509-
subnetID, err := l.getSubnetID(service, node)
513+
subnetID, err := l.getNodeSubnetIDByHostIP(address)
510514
if err != nil {
511515
return err
512516
}
513517

514-
_, err = l.sharedELBClient.AddMember(poolID, &elbmodel.CreateMemberReq{
518+
req := elbmodel.CreateMemberReq{
515519
ProtocolPort: port,
516520
SubnetId: subnetID,
517521
Address: address,
518-
})
522+
}
523+
_, err = l.sharedELBClient.AddMember(poolID, &req)
519524
if err != nil {
520-
return fmt.Errorf("error creating SharedLoadBalancer pool member for node: %s, %v", node.Name, err)
525+
return fmt.Errorf("error creating SharedLoadBalancer pool member for node: %s, %v, options: %s",
526+
node.Name, err, utils.ToString(req))
521527
}
522528

523529
loadbalancer, err := l.sharedELBClient.WaitStatusActive(elbID)

pkg/cloudprovider/huaweicloud/wrapper/ecs.go

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ import (
2323
"sort"
2424
"strings"
2525

26-
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/sdkerr"
27-
ecs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2"
28-
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2/model"
2926
"google.golang.org/grpc/codes"
3027
"google.golang.org/grpc/status"
3128
v1 "k8s.io/api/core/v1"
3229
"k8s.io/klog/v2"
3330

31+
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/sdkerr"
32+
ecs "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2"
33+
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/ecs/v2/model"
34+
3435
"sigs.k8s.io/cloud-provider-huaweicloud/pkg/config"
3536
"sigs.k8s.io/cloud-provider-huaweicloud/pkg/utils"
3637
)
@@ -94,6 +95,36 @@ func (e *EcsClient) GetByNodeName(name string) (*model.ServerDetail, error) {
9495
return nil, notFound
9596
}
9697

98+
func (e *EcsClient) GetByNodeIP(privateIP string) (*model.ServerDetail, error) {
99+
if privateIP == "" {
100+
return nil, fmt.Errorf("privateIP can be empty")
101+
}
102+
103+
rsp, err := e.List(&model.ListServersDetailsRequest{
104+
IpEq: &privateIP,
105+
})
106+
if err != nil {
107+
return nil, err
108+
}
109+
110+
notFound := fmt.Errorf("not found any ECS, PrivateIP: %s", privateIP)
111+
if rsp.Servers == nil || len(*rsp.Servers) == 0 {
112+
return nil, notFound
113+
}
114+
115+
for _, sv := range *rsp.Servers {
116+
for _, addresses := range sv.Addresses {
117+
for _, addr := range addresses {
118+
if addr.Addr == privateIP {
119+
return &sv, nil
120+
}
121+
}
122+
}
123+
}
124+
125+
return nil, notFound
126+
}
127+
97128
func (e *EcsClient) GetByName(name string) (*model.ServerDetail, error) {
98129
name = fmt.Sprintf("^%s$", name)
99130

0 commit comments

Comments
 (0)