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)
}
}