容器编排Kubernetes之kube-dns源码解读
注:阅读DNS源码前,可以阅读DNS原理入门增加对DNS的认识。
架构图
这是我简单画的架构图,希望能帮助大家理解。
代码结构
| dns
| cmd // 三大组件的入口
| dnsmasq-nanny // DNS缓存
| kube-dns // dns主项目
| sidecar // 附加组件
| pkg 组件代码库,主要实现代码在该目录下
| dns // kube-dns代码库, 监听service、pod等资源,动态更新DNS记录
| dnsmasq // 内部封装dnsmasq程序用于缓存,并可从dns服务器获取dns监控指标
| sidecar 用于监控和健康检查
主要的代码都集中在上述树形结构中,下面依次讲解。
kube-dns
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.