From 7bb6c47212e2de9a0f2fa2bc0b188dd2fd8f43d8 Mon Sep 17 00:00:00 2001 From: Maclon Date: Tue, 10 Sep 2024 10:02:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Daks=E6=89=A9=E5=AE=B9?= =?UTF-8?q?=E5=AE=9E=E4=BE=8Bip=E8=8E=B7=E5=8F=96=E9=97=AE=E9=A2=98=20(#35?= =?UTF-8?q?01)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/cloudprovider/azure/api/utils.go | 2 +- .../azure/tasks/updateDesiredNodes.go | 59 ++++++++++++++----- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/api/utils.go b/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/api/utils.go index 544da00fa4..bc58f0c044 100644 --- a/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/api/utils.go +++ b/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/api/utils.go @@ -1418,7 +1418,7 @@ func handlerIPConfig(config *armnetwork.InterfaceIPConfiguration) (string, bool) // (https://learn.microsoft.com/zh-cn/azure/virtual-network // /virtual-networks-faq#what-address-ranges-can-i-use-in-my-vnets) ip := net.ParseIP(*config.Properties.PrivateIPAddress) - if !(ip != nil && ip.IsPrivate()) { // 取反 + if ip == nil { return "", false } return ip.String(), true diff --git a/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/tasks/updateDesiredNodes.go b/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/tasks/updateDesiredNodes.go index 584e78a215..a850203465 100644 --- a/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/tasks/updateDesiredNodes.go +++ b/bcs-services/bcs-cluster-manager/internal/cloudprovider/azure/tasks/updateDesiredNodes.go @@ -387,6 +387,7 @@ func differentInstance(rootCtx context.Context, client api.AksService, info *clo for i, vm := range vmList { nodeID := fmt.Sprintf("%s/%s/%s", *vm.Name, *vm.InstanceID, asg.AutoScalingName) if _, ok := nodeMap[nodeID]; !ok { + blog.Infof("differentInstance[%s] got new instance %s", taskID, nodeID) // 如果当前vm不存在于nodeMap中,则为扩容出来的机器 res = append(res, vmList[i]) } @@ -420,24 +421,14 @@ func getNodeMap(ctx context.Context, taskID string, info *cloudprovider.CloudDep func transInstancesToNode(rootCtx context.Context, info *cloudprovider.CloudDependBasicInfo, client api.AksService, vmList []*armcompute.VirtualMachineScaleSetVM) ([]string, error) { var ( - err error - nodeIPs = make([]string, 0) - nodes []*proto.Node - asg = info.NodeGroup.AutoScaling - interfaceList = make([]*armnetwork.Interface, 0) - taskID = cloudprovider.GetTaskIDFromContext(rootCtx) - ctx, cancel = context.WithTimeout(rootCtx, 30*time.Second) + err error + nodeIPs = make([]string, 0) + nodes []*proto.Node + taskID = cloudprovider.GetTaskIDFromContext(rootCtx) ) - defer cancel() - // 获取 interface list - err = retry.Do(func() error { - interfaceList, err = client.ListSetInterfaceAndReturn(ctx, asg.AutoScalingName, asg.AutoScalingID) - if err != nil { - return errors.Wrapf(err, "transInstancesToNode[%s] ListSetInterfaceAndReturn failed", taskID) - } - return nil - }, retry.Context(ctx), retry.Attempts(3)) + // ensure instance ip is attached + interfaceList, err := checkInstance(client, info, vmList) if err != nil { return nil, errors.Wrapf(err, "transInstancesToNode[%s] get vm network interface failed", taskID) } @@ -462,6 +453,42 @@ func transInstancesToNode(rootCtx context.Context, info *cloudprovider.CloudDepe return nodeIPs, nil } +func checkInstance(client api.AksService, info *cloudprovider.CloudDependBasicInfo, + vmList []*armcompute.VirtualMachineScaleSetVM) ([]*armnetwork.Interface, error) { + var ( + asg = info.NodeGroup.AutoScaling + interfaceList = make([]*armnetwork.Interface, 0) + err error + ) + + timeCtx, cancel := context.WithTimeout(context.TODO(), 5*time.Minute) + defer cancel() + errLoop := loop.LoopDoFunc(timeCtx, func() error { + var success int + interfaceList, err = client.ListSetInterfaceAndReturn(context.TODO(), asg.AutoScalingName, asg.AutoScalingID) + if err != nil { + return err + } + ipMap := api.VmMatchInterface(vmList, interfaceList) + + for _, vm := range vmList { // 字段对齐 + if ip, ok := ipMap[*vm.Name]; ok && len(ip) != 0 { + success++ + } + } + blog.Infof("checkInstance ip count, current %d, desired %d", success, len(vmList)) + if success == len(vmList) { + return loop.EndLoop + } + return nil + }) + if errLoop != nil { + return nil, errLoop + } + + return interfaceList, nil +} + // vmToNode vm to node func vmToNode(client api.AksService, info *cloudprovider.CloudDependBasicInfo, vmList []*armcompute.VirtualMachineScaleSetVM, interfaceList []*armnetwork.Interface) ([]*proto.Node, error) { // nolint