第一篇说的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后面会分析,现在只需了解他是一个监控数据采集和存储的组件。

Logo

聚焦前沿AI与大模型技术探索,汇聚开发者及爱好者,共享开源项目、学习资源与行业资讯。

更多推荐