func TestSkySimpleSRVLookup(t *testing.T) { kd := newKubeDNS() skydnsConfig := &skyServer.Config{Domain: testDomain, DnsAddr: "0.0.0.0:53"} skyServer.SetDefaults(skydnsConfig) s := skyServer.New(kd, skydnsConfig) service := newHeadlessService() endpointIPs := []string{"10.0.0.1", "10.0.0.2"} endpoints := newEndpoints(service, newSubsetWithOnePort("", 80, endpointIPs...)) assert.NoError(t, kd.endpointsStore.Add(endpoints)) kd.newService(service) name := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".") question := dns.Question{Name: name, Qtype: dns.TypeSRV, Qclass: dns.ClassINET} rec, extra, err := s.SRVRecords(question, name, 512, false) if err != nil { t.Fatalf("Failed srv record lookup on service with fqdn %v", name) } assertARecordsMatchIPs(t, extra, endpointIPs...) targets := []string{} for _, eip := range endpointIPs { // A portal service is always created with a port of '0' targets = append(targets, fmt.Sprintf("%v.%v", fmt.Sprintf("%x", hashServiceRecord(newServiceRecord(eip, 0))), name)) } assertSRVRecordsMatchTarget(t, rec, targets...) }
func TestSkyNamedPortSRVLookup(t *testing.T) { kd := newKubeDNS() skydnsConfig := &skyserver.Config{Domain: testDomain, DnsAddr: "0.0.0.0:53"} skyserver.SetDefaults(skydnsConfig) s := skyserver.New(kd, skydnsConfig) service := newHeadlessService() eip := "10.0.0.1" endpoints := newEndpoints(service, newSubsetWithOnePort("http", 8081, eip)) assert.NoError(t, kd.endpointsStore.Add(endpoints)) kd.newService(service) name := strings.Join([]string{"_http", "_tcp", testService, testNamespace, "svc", testDomain}, ".") question := dns.Question{Name: name, Qtype: dns.TypeSRV, Qclass: dns.ClassINET} rec, extra, err := s.SRVRecords(question, name, 512, false) if err != nil { t.Fatalf("Failed srv record lookup on service with fqdn %v", name) } svcDomain := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".") assertARecordsMatchIPs(t, extra, eip) assertSRVRecordsMatchTarget( t, rec, fmt.Sprintf("%x.%v", util.HashServiceRecord(util.NewServiceRecord(eip, 0)), svcDomain)) assertSRVRecordsMatchPort(t, rec, 8081) }
func main() { flag.Parse() if nameserver != "" { for _, hostPort := range strings.Split(nameserver, ",") { if err := validateHostPort(hostPort); err != nil { log.Fatalf("skydns: nameserver is invalid: %s", err) } config.Nameservers = append(config.Nameservers, hostPort) } } if err := validateHostPort(config.DnsAddr); err != nil { log.Fatalf("skydns: addr is invalid: %s", err) } if err := server.SetDefaults(config); err != nil { log.Fatalf("skydns defaults could not be set from /etc/resolv.conf: %v", err) } if config.Local != "" { config.Local = dns.Fqdn(config.Local) } backend := NewBackend() s := server.New(backend, config) stats.Collect() // Graphite server.Metrics() // Prometheus if err := s.Run(); err != nil { log.Fatalf("skydns: %s", err) } }
func (d *Domain) Run() { for i, j := range d.entries { logger.Info("%s %v", i, j) } server.Metrics() server.SetDefaults(d.DNSConfig) s := server.New(d, d.DNSConfig) s.Run() }
func (d *KubeDNSServer) startSkyDNSServer() { skydnsConfig := &server.Config{Domain: d.domain, DnsAddr: "0.0.0.0:53"} server.SetDefaults(skydnsConfig) s := server.New(d.kd, skydnsConfig) if err := metrics.Metrics(); err != nil { glog.Fatalf("skydns: %s", err) } else { glog.Infof("skydns: metrics enabled on :%s%s", metrics.Port, metrics.Path) } go s.Run() }
func (d *KubeDNSServer) startSkyDNSServer() { glog.Infof("Starting SkyDNS server. Listening on port:%d", d.dnsPort) skydnsConfig := &server.Config{Domain: d.domain, DnsAddr: fmt.Sprintf("0.0.0.0:%d", d.dnsPort)} server.SetDefaults(skydnsConfig) s := server.New(d.kd, skydnsConfig) if err := metrics.Metrics(); err != nil { glog.Fatalf("skydns: %s", err) } glog.Infof("skydns: metrics enabled on : %s:%s", metrics.Path, metrics.Port) go s.Run() }
// ListenAndServe starts a DNS server that exposes services and values stored in etcd (if etcdclient // is not nil). It will block until the server exits. func (s *Server) ListenAndServe() error { resolver := NewServiceResolver(s.Config, s.Services, s.Endpoints, openshiftFallback) resolvers := server.FirstBackend{resolver} if len(s.MetricsName) > 0 { metrics.RegisterPrometheusMetrics(s.MetricsName, "") } dns := server.New(resolvers, s.Config) if s.Stop != nil { defer close(s.Stop) } return dns.Run() }
// ListenAndServe starts a DNS server that exposes services and values stored in etcd (if etcdclient // is not nil). It will block until the server exits. // TODO: hoist the service accessor out of this package so it can be reused. func ListenAndServe(config *server.Config, client *client.Client, etcdclient *etcd.Client) error { stop := make(chan struct{}) accessor := NewCachedServiceAccessor(client, stop) resolver := NewServiceResolver(config, accessor, client, openshiftFallback) resolvers := server.FirstBackend{resolver} if etcdclient != nil { resolvers = append(resolvers, backendetcd.NewBackend(etcdclient, &backendetcd.Config{ Ttl: config.Ttl, Priority: config.Priority, })) } s := server.New(resolvers, config) defer close(stop) return s.Run() }
func (d *KubeDNSServer) startSkyDNSServer() { glog.V(0).Infof("Starting SkyDNS server (%v:%v)", d.dnsBindAddress, d.dnsPort) skydnsConfig := &server.Config{ Domain: d.domain, DnsAddr: fmt.Sprintf("%s:%d", d.dnsBindAddress, d.dnsPort), } server.SetDefaults(skydnsConfig) s := server.New(d.kd, skydnsConfig) if err := metrics.Metrics(); err != nil { glog.Fatalf("Skydns metrics error: %s", err) } else if metrics.Port != "" { glog.V(0).Infof("Skydns metrics enabled (%v:%v)", metrics.Path, metrics.Port) } else { glog.V(0).Infof("Skydns metrics not enabled") } go s.Run() }
func TestSkyPodHostnameSRVLookup(t *testing.T) { kd := newKubeDNS() skydnsConfig := &skyServer.Config{Domain: testDomain, DnsAddr: "0.0.0.0:53"} skyServer.SetDefaults(skydnsConfig) s := skyServer.New(kd, skydnsConfig) service := newHeadlessService() endpointIPs := []string{"10.0.0.1", "10.0.0.2"} endpoints := newEndpoints(service, newSubsetWithOnePort("", 80, endpointIPs...)) // The format of thes annotations is: // endpoints.beta.kubernetes.io/hostnames-map: '{"ep-ip":{"HostName":"pod request hostname"}}' epRecords := map[string]endpointsapi.HostRecord{} for i, ep := range endpointIPs { epRecords[ep] = endpointsapi.HostRecord{HostName: fmt.Sprintf("ep-%d", i)} } b, err := json.Marshal(epRecords) if err != nil { t.Fatalf("%v", err) } endpoints.Annotations = map[string]string{ endpointsapi.PodHostnamesAnnotation: string(b), } assert.NoError(t, kd.endpointsStore.Add(endpoints)) kd.newService(service) name := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".") question := dns.Question{Name: name, Qtype: dns.TypeSRV, Qclass: dns.ClassINET} rec, _, err := s.SRVRecords(question, name, 512, false) if err != nil { t.Fatalf("Failed srv record lookup on service with fqdn %v", name) } targets := []string{} for i := range endpointIPs { targets = append(targets, fmt.Sprintf("%v.%v", fmt.Sprintf("ep-%d", i), name)) } assertSRVRecordsMatchTarget(t, rec, targets...) }
func main() { flag.Parse() machines := strings.Split(machine, ",") client := newClient(machines, tlspem, tlskey, cacert) if nameserver != "" { for _, hostPort := range strings.Split(nameserver, ",") { if err := validateHostPort(hostPort); err != nil { log.Fatalf("skydns: nameserver is invalid: %s", err) } config.Nameservers = append(config.Nameservers, hostPort) } } if err := validateHostPort(config.DnsAddr); err != nil { log.Fatalf("skydns: addr is invalid: %s", err) } if err := loadConfig(client, config); err != nil { log.Fatalf("skydns: %s", err) } if err := server.SetDefaults(config); err != nil { log.Fatalf("skydns defaults could not be set from /etc/resolv.conf: %v", err) } if config.Local != "" { config.Local = dns.Fqdn(config.Local) } backend := backendetcd.NewBackend(client, &backendetcd.Config{ Ttl: config.Ttl, Priority: config.Priority, }) s := server.New(backend, config) if discover { go func() { recv := make(chan *etcd.Response) go client.Watch("/_etcd/machines/", 0, true, recv, nil) duration := 1 * time.Second for { select { case n := <-recv: if n != nil { if client := updateClient(n, tlskey, tlspem, cacert); client != nil { backend.UpdateClient(client) } duration = 1 * time.Second // reset } else { // we can see an n == nil, probably when we can't connect to etcd. log.Printf("skydns: etcd machine cluster update failed, sleeping %s + ~3s", duration) time.Sleep(duration + (time.Duration(rand.Float32() * 3e9))) // Add some random. duration *= 2 if duration > 32*time.Second { duration = 32 * time.Second } } } } }() } if stub { s.UpdateStubZones() go func() { recv := make(chan *etcd.Response) go client.Watch(msg.Path(config.Domain)+"/dns/stub/", 0, true, recv, nil) duration := 1 * time.Second for { select { case n := <-recv: if n != nil { s.UpdateStubZones() log.Printf("skydns: stubzone update") duration = 1 * time.Second // reset } else { // we can see an n == nil, probably when we can't connect to etcd. log.Printf("skydns: stubzone update failed, sleeping %s + ~3s", duration) time.Sleep(duration + (time.Duration(rand.Float32() * 3e9))) // Add some random. duration *= 2 if duration > 32*time.Second { duration = 32 * time.Second } } } } }() } stats.Collect() // Graphite server.Metrics() // Prometheus if err := s.Run(); err != nil { log.Fatalf("skydns: %s", err) } }
func (lk LocalkubeServer) NewDNSServer(rootDomain, clusterIP, kubeAPIServer string) (*DNSServer, error) { // setup backing etcd store peerURLs := []string{"http://localhost:9256"} DNSEtcdURLs := []string{"http://localhost:49090"} publicIP, err := lk.GetHostIP() if err != nil { return nil, err } serverAddress := fmt.Sprintf("%s:%d", publicIP.String(), 53) etcdServer, err := lk.NewEtcd(DNSEtcdURLs, peerURLs, DNSName, lk.GetDNSDataDirectory()) if err != nil { return nil, err } // setup skydns cfg := etcd.Config{ Endpoints: DNSEtcdURLs, Transport: etcd.DefaultTransport, } etcdClient, err := etcd.New(cfg) if err != nil { return nil, err } keysApi := etcd.NewKeysAPI(etcdClient) skyConfig := &skydns.Config{ DnsAddr: serverAddress, Domain: rootDomain, } dnsAddress, err := net.ResolveUDPAddr("udp", serverAddress) if err != nil { return nil, err } skydns.SetDefaults(skyConfig) backend := backendetcd.NewBackend( keysApi, context.Background(), &backendetcd.Config{ Ttl: skyConfig.Ttl, Priority: skyConfig.Priority, }) skyServer := skydns.New(backend, skyConfig) // setup so prometheus doesn't run into nil metrics.Metrics() // setup kube2sky k2s := kube2sky.NewKube2Sky(rootDomain, DNSEtcdURLs[0], "", kubeAPIServer, 10*time.Second, 8081) return &DNSServer{ etcd: etcdServer, sky: skyServer, kube2sky: k2s, dnsServerAddr: dnsAddress, clusterIP: clusterIP, }, nil }
func main() { flag.Parse() machines := strings.Split(machine, ",") client, err := newEtcdClient(machines, tlspem, tlskey, cacert) if err != nil { panic(err) } if nameserver != "" { for _, hostPort := range strings.Split(nameserver, ",") { if err := validateHostPort(hostPort); err != nil { log.Fatalf("skydns: nameserver is invalid: %s", err) } config.Nameservers = append(config.Nameservers, hostPort) } } if err := validateHostPort(config.DnsAddr); err != nil { log.Fatalf("skydns: addr is invalid: %s", err) } if err := loadConfig(client, config); err != nil { log.Fatalf("skydns: %s", err) } if err := server.SetDefaults(config); err != nil { log.Fatalf("skydns: defaults could not be set from /etc/resolv.conf: %v", err) } if config.Local != "" { config.Local = dns.Fqdn(config.Local) } backend := backendetcd.NewBackend(client, ctx, &backendetcd.Config{ Ttl: config.Ttl, Priority: config.Priority, }) s := server.New(backend, config) if stub { s.UpdateStubZones() go func() { duration := 1 * time.Second var watcher etcd.Watcher watcher = client.Watcher(msg.Path(config.Domain)+"/dns/stub/", &etcd.WatcherOptions{AfterIndex: 0, Recursive: true}) for { _, err := watcher.Next(ctx) if err != nil { // log.Printf("skydns: stubzone update failed, sleeping %s + ~3s", duration) time.Sleep(duration + (time.Duration(rand.Float32() * 3e9))) // Add some random. duration *= 2 if duration > 32*time.Second { duration = 32 * time.Second } } else { s.UpdateStubZones() log.Printf("skydns: stubzone update") duration = 1 * time.Second // reset } } }() } if err := metrics.Metrics(); err != nil { log.Fatalf("skydns: %s", err) } else { log.Printf("skydns: metrics enabled on :%s%s", metrics.Port, metrics.Path) } if err := s.Run(); err != nil { log.Fatalf("skydns: %s", err) } }
func main() { flag.Parse() if config.Version { fmt.Printf("skydns server version: %s\n", server.Version) os.Exit(0) } machines := strings.Split(machine, ",") var clientptr *etcdv3.Client var err error var clientv3 etcdv3.Client var clientv2 etcd.KeysAPI if config.Etcd3 { clientptr, err = newEtcdV3Client(machines, tlspem, tlskey, cacert) clientv3 = *clientptr } else { clientv2, err = newEtcdV2Client(machines, tlspem, tlskey, cacert, username, password) } if err != nil { panic(err) } if nameserver != "" { for _, hostPort := range strings.Split(nameserver, ",") { if err := validateHostPort(hostPort); err != nil { log.Fatalf("skydns: nameserver is invalid: %s", err) } config.Nameservers = append(config.Nameservers, hostPort) } } if err := validateHostPort(config.DnsAddr); err != nil { log.Fatalf("skydns: addr is invalid: %s", err) } if config.Etcd3 { if err := loadEtcdV3Config(clientv3, config); err != nil { log.Fatalf("skydns: %s", err) } } else { if err := loadEtcdV2Config(clientv2, config); err != nil { log.Fatalf("skydns: %s", err) } } if err := server.SetDefaults(config); err != nil { log.Fatalf("skydns: defaults could not be set from /etc/resolv.conf: %v", err) } if config.Local != "" { config.Local = dns.Fqdn(config.Local) } var backend server.Backend if config.Etcd3 { backend = backendetcdv3.NewBackendv3(clientv3, ctx, &backendetcdv3.Config{ Ttl: config.Ttl, Priority: config.Priority, }) } else { backend = backendetcd.NewBackend(clientv2, ctx, &backendetcd.Config{ Ttl: config.Ttl, Priority: config.Priority, }) } s := server.New(backend, config) if stub { s.UpdateStubZones() go func() { duration := 1 * time.Second if config.Etcd3 { var watcher etcdv3.WatchChan watcher = clientv3.Watch(ctx, msg.Path(config.Domain)+"/dns/stub/", etcdv3.WithPrefix()) for wresp := range watcher { if wresp.Err() != nil { log.Printf("skydns: stubzone update failed, sleeping %s + ~3s", duration) time.Sleep(duration + (time.Duration(rand.Float32() * 3e9))) duration *= 2 if duration > 32*time.Second { duration = 32 * time.Second } } else { s.UpdateStubZones() log.Printf("skydns: stubzone update") duration = 1 * time.Second //reset } } } else { var watcher etcd.Watcher watcher = clientv2.Watcher(msg.Path(config.Domain)+"/dns/stub/", &etcd.WatcherOptions{AfterIndex: 0, Recursive: true}) for { _, err := watcher.Next(ctx) if err != nil { // log.Printf("skydns: stubzone update failed, sleeping %s + ~3s", duration) time.Sleep(duration + (time.Duration(rand.Float32() * 3e9))) // Add some random. duration *= 2 if duration > 32*time.Second { duration = 32 * time.Second } } else { s.UpdateStubZones() log.Printf("skydns: stubzone update") duration = 1 * time.Second // reset } } } }() } if err := metrics.Metrics(); err != nil { log.Fatalf("skydns: %s", err) } else { log.Printf("skydns: metrics enabled on :%s%s", metrics.Port, metrics.Path) } if err := s.Run(); err != nil { log.Fatalf("skydns: %s", err) } }