注:阅读DNS源码前,可以阅读DNS原理入门增加对DNS的认识。

架构图

容器编排Kubernetes之kube-dns源码解读

这是我简单画的架构图,希望能帮助大家理解。

代码结构

| dns

| cmd // 三大组件的入口

| dnsmasq-nanny // DNS缓存

| kube-dns // dns主项目

| sidecar // 附加组件

| pkg 组件代码库,主要实现代码在该目录下

| dns // kube-dns代码库, 监听service、pod等资源,动态更新DNS记录

| dnsmasq // 内部封装dnsmasq程序用于缓存,并可从dns服务器获取dns监控指标

| sidecar 用于监控和健康检查

主要的代码都集中在上述树形结构中,下面依次讲解。

kube-dns是提供DNS功能的组件,我们重点关注。

首先看main方法:

func main() {
   config := options.NewKubeDNSConfig()
   config.AddFlags(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() // 初始化日志

   version.PrintAndExitIfRequested()

   glog.V(0).Infof("version: %+v", version.VERSION)

   // 实例化KubeDNSServer并运行
   server := app.NewKubeDNSServerDefault(config)
   server.Run()
}

下面我们分析app包里的server.go文件

type KubeDNSServer struct {
   // DNS domain name.
   domain         string
   healthzPort    int
   dnsBindAddress string
   dnsPort        int
   nameServers    string
   kd             *dns.KubeDNS
} // KubeDNSServer类里前几个变量都是main函数里传递过来的参数直接赋值,没啥可讲的。kd是pkg/dns包里的KubeDNS类的实例,我们后续再讲。
func NewKubeDNSServerDefault(config *options.KubeDNSConfig) *KubeDNSServer {} // 根据参数,填充KubeDNSServer对象
func newKubeClient(dnsConfig *options.KubeDNSConfig) (kubernetes.Interface, error) {} // 根据参数,实例化一个与apiserver通信的client,有两种模式的client可以使用。集群内client(通过serviceAccount认证)以及集群外client(当前Kubernetes集群配置的其他认证方式进行认证)
// main函数中的server.Run()调用的函数
func (server *KubeDNSServer) Run() {
   pflag.VisitAll(func(flag *pflag.Flag) {
      glog.V(0).Infof("FLAG: --%s=%q", flag.Name, flag.Value)
   })
   setupSignalHandlers() // 监听系统事件,主要作用是等待日志处理完成
   server.

相关文章:

  • 2021-05-01
  • 2021-08-01
  • 2021-11-08
  • 2021-04-15
  • 2021-06-04
  • 2021-05-09
  • 2021-05-15
猜你喜欢
  • 2022-12-23
  • 2021-07-05
  • 2021-06-18
  • 2021-05-10
  • 2022-12-23
  • 2021-06-13
  • 2022-12-23
相关资源
相似解决方案