func (dns *DNSServer) Start() { if dns.done != nil { fmt.Fprint(os.Stderr, util.Pad("DNS server already started")) return } dns.done = make(chan struct{}) dns.etcd.Start() go util.Until(dns.kube2sky, os.Stderr, "kube2sky", 2*time.Second, dns.done) go util.Until(dns.sky.Run, os.Stderr, "skydns", 1*time.Second, dns.done) go func() { var err error client := kubeClient() meta := kube.ObjectMeta{ Name: DNSServiceName, Namespace: DNSServiceNamespace, Labels: map[string]string{ "k8s-app": "kube-dns", "kubernetes.io/name": "KubeDNS", }, } for { if err != nil { time.Sleep(2 * time.Second) } if _, err = client.Namespaces().Get(DNSServiceNamespace); notFoundErr(err) { err = createKubeSystemIfNotPresent(client) if err != nil { glog.Infof("Failed to create the kube-system namespace: %v\n", err) continue } } else if err != nil { glog.Infof("Failed to check for kube-system namespace existence: %v\n", err) continue } // setup service if _, err = client.Services(meta.Namespace).Get(meta.Name); notFoundErr(err) { // create service if doesn't exist err = createService(client, meta, dns.clusterIP, dns.dnsServerAddr.Port) if err != nil { glog.Infof("Failed to create Service for DNS: %v\n", err) continue } } else if err != nil { // error if cannot check for Service glog.Infof("Failed to check for DNS Service existence: %v\n", err) continue } // setup endpoint if _, err = client.Endpoints(meta.Namespace).Get(meta.Name); notFoundErr(err) { // create endpoint if doesn't exist err = createEndpoint(client, meta, dns.dnsServerAddr.IP.String(), int32(dns.dnsServerAddr.Port)) if err != nil { glog.Infof("Failed to create Endpoint for DNS: %v\n", err) continue } } else if err != nil { // error if cannot check for Endpoint glog.Infof("Failed to check for DNS Endpoint existence: %v\n", err) continue } // setup successful glog.Infof("DNS started succesfully.") break } }() }
// Start calls startup function. func (s *SimpleServer) Start() { go util.Until(s.serverRoutine, os.Stdout, s.ComponentName, s.Interval, s.stopChannel) }