in internal/node/hybrid/ip_validator.go [144:189]
func getNodeIP(kubeletArgs []string, nodeName string, network Network) (net.IP, error) {
// Follows algorithm used by kubelet to assign nodeIP
// Implementation adapted for hybrid nodes
// 1) Use nodeIP if set (and not "0.0.0.0"/"::")
// 2) If the user has specified an IP to HostnameOverride, use it (not allowed for hybrid nodes)
// 3) Lookup the IP from node name by DNS
// 4) Try to get the IP from the network interface used as default gateway
// Source: https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/nodestatus/setters.go#L206
nodeIP, err := extractNodeIPFromFlags(kubeletArgs)
if err != nil {
return nil, err
}
var ipAddr net.IP
nodeIPSpecified := nodeIP != nil && nodeIP.To4() != nil && !nodeIP.IsUnspecified()
if nodeIPSpecified {
ipAddr = nodeIP
} else {
// If using SSM, the node name will be set at initialization to the SSM instance ID,
// so it won't resolve to anything via DNS, hence we're only checking in the case of IAM-RA
if nodeName != "" {
addrs, _ := network.LookupIP(nodeName)
for _, addr := range addrs {
if err = validateNodeIP(addr, network.InterfaceAddrs); addr.To4() != nil && err == nil {
ipAddr = addr
break
}
}
}
if ipAddr == nil {
ipAddr, err = network.ResolveBindAddress(nodeIP)
}
if err != nil || ipAddr == nil {
// We tried everything we could, but the IP address wasn't fetchable; error out
return nil, fmt.Errorf("couldn't get ip address of node: %w", err)
}
}
return ipAddr, nil
}