in pkg/dnsmasq/nanny.go [58:120]
func (n *Nanny) Configure(args []string, config *config.Config, kubednsServer string) {
n.args = args
munge := func(s string) string {
if colonIndex := strings.LastIndex(s, ":"); colonIndex != -1 {
bracketIndex := strings.Index(s, "]")
isV4 := strings.Count(s, ":") == 1
isBracketedV6 := bracketIndex != -1
if isV4 || isBracketedV6 && colonIndex > bracketIndex {
s = s[:colonIndex] + "#" + s[colonIndex+1:]
}
}
return s
}
for domain, serverList := range config.StubDomains {
resolver := &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
d := net.Dialer{}
return d.DialContext(ctx, "udp", kubednsServer)
},
}
for _, server := range serverList {
if isIP := (net.ParseIP(server) != nil); !isIP {
switch {
case strings.HasSuffix(server, "cluster.local"):
if IPs, err := resolver.LookupIPAddr(context.Background(), server); err != nil {
klog.Errorf("Error looking up IP for name %q: %v", server, err)
} else if len(IPs) > 0 {
server = IPs[0].String()
} else {
klog.Errorf("Name %q does not resolve to any IPs", server)
}
default:
if IPs, err := net.LookupIP(server); err != nil {
klog.Errorf("Error looking up IP for name %q: %v", server, err)
} else if len(IPs) > 0 {
server = IPs[0].String()
} else {
klog.Errorf("Name %q does not resolve to any IPs", server)
}
}
}
// dnsmasq port separator is '#' for some reason.
server = munge(server)
n.args = append(
n.args, "--server", fmt.Sprintf("/%v/%v", domain, server))
}
}
for _, server := range config.UpstreamNameservers {
// dnsmasq port separator is '#' for some reason.
server = munge(server)
n.args = append(n.args, "--server", server)
}
// If upstream nameservers are explicitly specified, then do not look
// at /etc/resolv.conf.
if len(config.UpstreamNameservers) > 0 {
n.args = append(n.args, "--no-resolv")
}
}