in providers/gce/gce_instances.go [91:200]
func (g *Cloud) NodeAddresses(ctx context.Context, nodeName types.NodeName) ([]v1.NodeAddress, error) {
timeoutCtx, cancel := context.WithTimeout(ctx, 1*time.Hour)
defer cancel()
instanceName := string(nodeName)
if g.useMetadataServer {
// Use metadata server if possible
if g.isCurrentInstance(instanceName) {
nics, err := metadata.Get("instance/network-interfaces/")
if err != nil {
return nil, fmt.Errorf("couldn't get network interfaces: %v", err)
}
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})
if g.stackType == NetworkStackDualStack {
// Both internal and external IPv6 addresses are written to this array
ipv6s, err := metadata.Get(fmt.Sprintf(networkInterfaceIPV6, nic))
if err != nil {
return nil, fmt.Errorf("couldn't get internal IPV6 addresses for node %v: %v", nodeName, err)
}
ipv6Arr := strings.Split(ipv6s, "/\n")
var internalIPV6 string
for _, ip := range ipv6Arr {
if ip == "" {
continue
}
internalIPV6 = ip
break
}
if internalIPV6 != "" {
nodeAddresses = append(nodeAddresses, v1.NodeAddress{Type: v1.NodeInternalIP, Address: internalIPV6})
} else {
klog.Warningf("internal IPV6 range is empty for node %v", nodeName)
}
}
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 {
nodeAddresses = append(nodeAddresses,
v1.NodeAddress{Type: v1.NodeInternalDNS, Address: internalDNSFull},
v1.NodeAddress{Type: v1.NodeHostName, Address: internalDNSFull},
)
}
return nodeAddresses, nil
}
}
// Use GCE API
instanceObj, err := g.getInstanceByName(instanceName)
if err != nil {
return nil, fmt.Errorf("couldn't get instance details: %v", err)
}
if g.stackType == NetworkStackDualStack {
instance, err := g.c.Instances().Get(timeoutCtx, meta.ZonalKey(canonicalizeInstanceName(instanceObj.Name), instanceObj.Zone))
if err != nil {
return nil, fmt.Errorf("error while querying for instance: %v", err)
}
return g.nodeAddressesFromInstance(instance)
}
instance, err := g.c.Instances().Get(timeoutCtx, meta.ZonalKey(canonicalizeInstanceName(instanceObj.Name), instanceObj.Zone))
if err != nil {
return nil, fmt.Errorf("error while querying for instance: %v", err)
}
return g.nodeAddressesFromInstance(instance)
}