code: func GetEtcdProbeAddress(cfg *kubeadmapi.Etcd) string {
  	if cfg.Local != nil && cfg.Local.ExtraArgs != nil {
  		if arg, exists := cfg.Local.ExtraArgs[etcdListenClientURLsArg]; exists {
  			// Use the first url in the listen-client-urls if multiple url's are specified.
  			if strings.ContainsAny(arg, ",") {
  				arg = strings.Split(arg, ",")[0]
  			}
  			parsedURL, err := url.Parse(arg)
  			if err != nil || parsedURL.Hostname() == "" {
  				return "127.0.0.1"
  			}
  			// Return the IP if the URL contains an address instead of a name.
  			if ip := net.ParseIP(parsedURL.Hostname()); ip != nil {
  				// etcdctl doesn't support auto-converting zero addresses into loopback addresses
  				if ip.Equal(net.IPv4zero) {
  					return "127.0.0.1"
  				}
  				if ip.Equal(net.IPv6zero) {
  					return net.IPv6loopback.String()
  				}
  				return ip.String()
  			}
  			// Use the local resolver to try resolving the name within the URL.
  			// If the name can not be resolved, return an IPv4 loopback address.
  			// Otherwise, select the first valid IPv4 address.
  			// If the name does not resolve to an IPv4 address, select the first valid IPv6 address.
  			addrs, err := net.LookupIP(parsedURL.Hostname())
  			if err != nil {
  				return "127.0.0.1"
  			}
  			var ip net.IP
  			for _, addr := range addrs {
  				if addr.To4() != nil {
  					ip = addr
  					break
  				}
  				if addr.To16() != nil && ip == nil {
  					ip = addr
  				}
  			}
  			return ip.String()
  		}
  	}
  	return "127.0.0.1"
  }
docs: // GetEtcdProbeAddress returns the etcd probe address