【kubernetes/k8s源码分析】kube-dns 源码解析之sidecar

github地址:https://github.com/kubernetes/dns

sidecar

● 定期检查kubedns和dnsmasq的健康状态(nslookup)

● 为k8s活性检测提供HTTP API

/sidecar 

--v=2 

--logtostderr 

--probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A 

--probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A


一 sidecar启动流程


1 main函数

解析参数,创建参数配置,启动服务

func main() {
   options := sidecar.NewOptions()
   configureFlags(options, pflag.CommandLine)
   flag.InitFlags()
   // Convinces goflags that we have called Parse() to avoid noisy logs.
   // OSS Issue: kubernetes/kubernetes#17162.
   goflag.CommandLine.Parse([]string{})
   logs.InitLogs()
   defer logs.FlushLogs()

   glog.Infof("Version v%s", version.VERSION)

   version.PrintAndExitIfRequested()

   server := sidecar.NewServer()
   server.Run(options)
}

2 Run函数

主要是启动l两个健康检查,kubedns,dnsmasq

--probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local,5,A 

--probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local,5,A

// Run the server (does not return)
func (s *server) Run(options *Options) {
   s.options = options
   glog.Infof("Starting server (options %+v)", *s.options)

   for _, probeOption := range options.Probes {
      probe := &dnsProbe{DNSProbeOption: probeOption}
      s.probes = append(s.probes, probe)
      probe.Start(options)
   }

   s.runMetrics(options)
}

3 Start函数

注册http API

func (p *dnsProbe) Start(options *Options) {
   glog.V(2).Infof("Starting dnsProbe %+v", p.DNSProbeOption)

   p.lastError = fmt.Errorf("waiting for first probe")

   http.HandleFunc("/healthcheck/"+p.Label, p.httpHandler)
   p.registerMetrics(options)

   if p.delayer == nil {
      glog.V(4).Infof("Using defaultLoopDelayer")
      p.delayer = &defaultLoopDelayer{}
   }

   go p.loop()
}

4 loop函数

定期探测,发送DNS请求

func (p *dnsProbe) loop() {
   glog.V(4).Infof("Starting loop")
   p.delayer.Start(p.Interval)

   dnsClient := &dns.Client{}

   for {
      glog.V(4).Infof("Sending DNS request @%v %v", p.Server, p.Name)
      msg, latency, err := dnsClient.Exchange(p.msg(), p.Server)
      glog.V(4).Infof("Got response, err=%v after %v", err, latency)

      if err == nil && len(msg.Answer) == 0 {
         err = fmt.Errorf("no RRs for domain %q", p.Name)
      }

      p.update(err, latency)
      p.delayer.Sleep(latency)
   }
}


猜你喜欢

转载自blog.csdn.net/zhonglinzhang/article/details/80987275