diff --git a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_instances.go b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_instances.go index 48ea14f5bb0..7cf3282307f 100644 --- a/staging/src/k8s.io/legacy-cloud-providers/gce/gce_instances.go +++ b/staging/src/k8s.io/legacy-cloud-providers/gce/gce_instances.go @@ -42,7 +42,10 @@ import ( ) const ( - defaultZone = "" + defaultZone = "" + networkInterfaceIP = "instance/network-interfaces/%s/ip" + networkInterfaceAccessConfigs = "instance/network-interfaces/%s/access-configs" + networkInterfaceExternalIP = "instance/network-interfaces/%s/access-configs/%s/external-ip" ) func newInstancesMetricContext(request, zone string) *metricContext { @@ -93,28 +96,60 @@ func (g *Cloud) NodeAddresses(ctx context.Context, nodeName types.NodeName) ([]v // Use metadata server if possible if g.isCurrentInstance(instanceName) { - internalIP, err := metadata.Get("instance/network-interfaces/0/ip") + nics, err := metadata.Get("instance/network-interfaces/") if err != nil { - return nil, fmt.Errorf("couldn't get internal IP: %v", err) - } - externalIP, err := metadata.Get("instance/network-interfaces/0/access-configs/0/external-ip") - if err != nil { - return nil, fmt.Errorf("couldn't get external IP: %v", err) - } - addresses := []v1.NodeAddress{ - {Type: v1.NodeInternalIP, Address: internalIP}, - {Type: v1.NodeExternalIP, Address: externalIP}, + return nil, fmt.Errorf("couldn't get network interfaces: %v", err) } - if internalDNSFull, err := metadata.Get("instance/hostname"); err != nil { + nicsArr := strings.Split(nics, "/\n") + nodeAddresses := []v1.NodeAddress{} + + for _, nic := range nicsArr { + + if nic == "" { + continue + } + + internalIP, err := metadata.Get(fmt.Sprintf(networkInterfaceIP, nic)) + if err != nil { + return nil, fmt.Errorf("couldn't get internal IP: %v", err) + } + nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: internalIP}) + + acs, err := metadata.Get(fmt.Sprintf(networkInterfaceAccessConfigs, nic)) + if err != nil { + return nil, fmt.Errorf("couldn't get access configs: %v", err) + } + + acsArr := strings.Split(acs, "/\n") + + for _, ac := range acsArr { + + if ac == "" { + continue + } + + externalIP, err := metadata.Get(fmt.Sprintf(networkInterfaceExternalIP, nic, ac)) + if err != nil { + return nil, fmt.Errorf("couldn't get external IP: %v", err) + } + + if externalIP != "" { + nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: externalIP}) + } + } + } + + internalDNSFull, err := metadata.Get("instance/hostname") + if err != nil { klog.Warningf("couldn't get full internal DNS name: %v", err) } else { - addresses = append(addresses, + nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeInternalDNS, Address: internalDNSFull}, v1.NodeAddress{Type: v1.NodeHostName, Address: internalDNSFull}, ) } - return addresses, nil + return nodeAddresses, nil } } @@ -209,12 +244,15 @@ func nodeAddressesFromInstance(instance *compute.Instance) ([]v1.NodeAddress, er if len(instance.NetworkInterfaces) < 1 { return nil, fmt.Errorf("could not find network interfaces for instanceID %q", instance.Id) } - networkInterface := instance.NetworkInterfaces[0] + nodeAddresses := []v1.NodeAddress{} - nodeAddresses := []v1.NodeAddress{{Type: v1.NodeInternalIP, Address: networkInterface.NetworkIP}} - for _, config := range networkInterface.AccessConfigs { - nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: config.NatIP}) + for _, nic := range instance.NetworkInterfaces { + nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: nic.NetworkIP}) + for _, config := range nic.AccessConfigs { + nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: config.NatIP}) + } } + return nodeAddresses, nil }