kube-dns的主要变化和实现原理.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
kube-dns的主要变化及实现原理大纲主要变化实现原理kubedns容器详解dnsmasq容器简介exechealthz容器简介主要变化●服务发现机制未变化也就是说kube-dns对外的接口是基本没变的。变化主要在于kube-dns插件的内部组成,由原来的四个容器变为了三个。现在回顾一下上一期所讲的1.2版本kube-dns的组成。Kube2sky通过K8S API监视K8S Service资源的变化,并根据Service的信息生成DNS记录写入到etcd中。Skydns为集群中的Pod提供DNS查询服务,DNS记录从etcd中读取。Exechealthz提供健康检查功能。接下来我们再看一下1.4版本kube-dns的组成。对比两张图,可以很直观的看到kube-dns对外接口没有发生变化。Exechealthz是唯一保留的容器,依然提供健康检查。不同点:1.会检查两个容器的健康状态。2.为集群提供DNS查询服务的容器由skydns变为了dnsmasq。3.Kubedns容器替代了kube2sky来监视Service资源。4.Etcd容器不见了。相信有些人会好奇DNS记录现在保存在哪了呢?那为了回答这个问题以及了解新版kube-dns的工作原理,我们就进入下一章内容来了解其实现原理。实现原理●kubedns容器的实现。本着“Talk is cheap, show me the code”原则,我们将会以源码分析的方式介绍其原理。对另外两个容器会进行简要介绍。先来看一下源码位置,这里列出的是kube-dns插件相关的源码,不仅仅是kubedns容器的。之前的源码是集中在cluster/addons/dns下面的,那么1.4版本中分成了三个目录:第一个目录会有K8S DNS相关的README以及kubedns容器的Dockerfile。第二个目录存放kube-dns插件的编排文件。第三个是kubedns源码目录,kubedns容器使用的命令行就是从这构建出来的。●kubedns容器的功能:接入SkyDNS,为dnsmasq提供查询服务替换etcd容器,使用树形结构在内存中保存DNS记录通过K8S API监视Service资源变化并更新DNS记录服务10053端口对功能有了大概了解之后,我们下面就结合源码来看看各个功能是如何实现的。●kubedns实现——SkyDNS接入下面是kubedns启动的部分代码,这部分显示的是kubedns在启动的时候会初始化一个SkyDNS Server,初始化的时候传入了一个KubeDNSServer.kd。下面是KubeDNSServer.kd的初始化代码,使用的是K8S提供的包。使用K8S提供的包可以初始化一个SkyDNS Server?相信很多人能够想到,这个KubeDNSServer.kd应该实现了一个接口。SkyDNS Server在初始化的时候需要传入一个Backend接口,其定义如下。SkyDNS基于Etcd实现了该接口,也会使用它初始化Server。得益于SkyDNS的良好设计,K8S只要实现该接口便可以接入SkyDNS来提供DNS查询服务,并定制存储功能。skydns/server/server.goskydns/server/backend.go●kubedns实现——etcd替换在服务发现的流程中,主要用到了Records这个方法,下面我们就来看看K8S是如何实现这个方法。主要步骤是先将域名按“.”拆分,并将各部分颠倒顺序生成一个path数组。调用getRecordsForPath方法获取DNS记录并返回。kubernetes/pkg/dns/dns.gogetRecordsForPath会调用cache的相关方法。这个cache会被初始化为一个TreeCache结构,定义如下:kubernetes/pkg/dns/dns.gokubernetes/pkg/dns/treecache.go如下图所示,TreeCache的结构类似于目录树。从根节点到叶子节点的每个路径与一个域名是相对应的,顺序是颠倒的。它的叶子节点只包含Entries,非叶子节点只包含ChildNodes。叶子节点中保存的就是SkyDNS定义的msg.Service结构,可以理解为DNS记录。在Records接口方法实现中,只需根据域名查找到对应的叶子节点,并返回叶子节点中保存的所有msg.Service数据。K8S就是通过这样的一个数据结构来保存DNS记录的,并替换了Etcd。●kubedns实现——监视Service最后我们来看一下监视Service资源的相关代码。如下图所示,这里使用了k8s.io/kubernetes/pkg/client/cache包的NewInformer方法,这个方法在K8S源码里会经

文档评论(0)

xuefei111 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档