第一篇说的DNS三剑客,已经介绍两个了。还差最后一个组件sidecar,它负责其他两个组件的监控服务。之所以叫sidecar:做轻快的双轮马车,是应为以前的exechealth只监控dnsmaq服务,而现在监控其它两个组件。代码相对不叫简单,先看服务启动:
func main() {
options := sidecar.NewOptions()
configureFlags(options, pflag.CommandLine)
flag.InitFlags()
logs.InitLogs()
defer logs.FlushLogs()
glog.Infof("Version v%s", version.VERSION)
verflag.PrintAndExitIfRequested()
server := sidecar.NewServer()
server.Run(options)
}
和其它服务一样,先是解析参数,创建服务,启动服务。看看服务运行:
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)
}
遍历探针,放到probes里面,然后启动探针。读者可能会有疑问这个probes有那些呢,看看官网给的启动sidecar例子
probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,A
probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,A
提供了2个探针。分别监控kubedns的10053端口DNS服务和dnsmasq的53端口的DNS服务。
具体发送dns请求的方法(pkg/sidecar/dnsprobe.go):
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)
}
}
通过健康检查还可以提供给prometheus性能数据,关于prometheus后面会分析,现在只需了解他是一个监控数据采集和存储的组件。