1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| // pkg/kubelet/network/dns/dns.go
func (c *Configurer) GetPodDNS(pod *v1.Pod) (*runtimeapi.DNSConfig, error) {
// 1.先读取host上的dns配置,读取kubelet配置文件中ResolverConfig,在我们集群是/etc/kubernetes/resolv.conf dnsConfig, err := c.getHostDNSConfig() 2. 查看pod中设置的dnsPolicy,默认你配置的是什么就是什么,但是对于clusterfirst+hostnetwrok的pod, dnstype会设置为host模式。 dnsType, err := getPodDNSType(pod) switch dnsType { case podDNSNone: // DNSNone should use empty DNS settings as the base. dnsConfig = &runtimeapi.DNSConfig{} // 将集群的dns配置作为nameserver,c.clusterDNS // 只需要传入server, search和options两个参数是固定的,见最下面 case podDNSCluster: if len(c.clusterDNS) != 0 { dnsConfig.Servers = []string{} for _, ip := range c.clusterDNS { dnsConfig.Servers = append(dnsConfig.Servers, ip.String()) } dnsConfig.Searches = c.generateSearchesForDNSClusterFirst(dnsConfig.Searches, pod) dnsConfig.Options = defaultDNSOptions break } // clusterDNS is not known. Pod with ClusterDNSFirst Policy cannot be created. nodeErrorMsg := fmt.Sprintf("kubelet does not have ClusterDNS IP configured and cannot create Pod using %q policy. Falling back to %q policy.", v1.DNSClusterFirst, v1.DNSDefault) c.recorder.Eventf(c.nodeRef, v1.EventTypeWarning, "MissingClusterDNS", nodeErrorMsg) c.recorder.Eventf(pod, v1.EventTypeWarning, "MissingClusterDNS", "pod: %q. %s", format.Pod(pod), nodeErrorMsg) // Fallback to DNSDefault. fallthrough // 使用 kubelet --resolv-conf flag设置的配置,如果没有指定就生成默认的配置。 case podDNSHost: if c.ResolverConfig == "" { for _, nodeIP := range c.nodeIPs { if utilnet.IsIPv6(nodeIP) { dnsConfig.Servers = append(dnsConfig.Servers, "::1") } else { dnsConfig.Servers = append(dnsConfig.Servers, "127.0.0.1") } } if len(dnsConfig.Servers) == 0 { dnsConfig.Servers = append(dnsConfig.Servers, "127.0.0.1") } dnsConfig.Searches = []string{"."} } } // 使用自定义的dns配置 if pod.Spec.DNSConfig != nil { dnsConfig = appendDNSConfig(dnsConfig, pod.Spec.DNSConfig) } // nameserver只有前3个起作用 // search 只有前6个起作用 return c.formDNSConfigFitsLimits(dnsConfig, pod), nil }
|