首页>参考读物>计算机科学与技术>综合

云原生时代的CoreDNS学习指南
作者 : [美]约翰·贝拉马里奇(John Belamaric) [美]克里凯特·刘(Cricket Liu) 著
译者 : 史天 张媛 译
出版日期 : 2021-11-10
ISBN : 978-7-111-69443-4
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 188
开本 : 16
原书名 : Learning CoreDNS: Configuring DNS for Cloud Native Environments
原出版社: O'Reilly Media, Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

本书介绍了CoreDNS与其他DNS服务器的区别、DNS基础理论、CoreDNS基本配置、CoreDNS管理区域数据的选项、基于DNS的服务发现的工作原理,以及如何在etcd和Kubernetes中配置CoreDNS服务发现。此外,还讲解了如何重写查询和响应,如何监控和排查CoreDNS故障以及如何构建CoreDNS的定制版本并编写新的插件。

图书特色

图书前言

为什么需要一个新的DNS服务器
看到本书,你可能会想到的第一个问题是“为什么我们还需要一个新的DNS服务器呢?”毕竟,目前有很多种DNS服务器可供选择。你最先可能想到的就是DNS服务器的鼻祖—BIND(Berkeley Internet Name Domain),它诞生于20世纪80年代,支持几乎所有的DNS标准。除了BIND之外,还有微软的DNS Server,它被广泛地应用于Active Directory环境。NLnet Labs译注1的NSD和Knot也是优秀的权威DNS服务器,同样来自NLnet Labs的Unbound也是一个快速、精简的递归DNS服务器。那么,CoreDNS有哪些优势呢?
CoreDNS是用Go语言编写的,而Go是一种内存安全译注2的编程语言。你可能会好奇为什么这很重要?如果你曾经运行过基于BIND的DNS基础设施,就可能遇到过因为缓冲区溢出而不得不尽快升级100个DNS服务器的情况。所有类型的DNS服务器(至少是那些用C和C++编写的)中有相当比例的漏洞来自缓冲区溢出或指针超支和指针悬空,而使用内存安全的Go语言编写的CoreDNS就不会受这些问题的困扰。
用Go编写的程序也可以很好地支持并发或并行处理,这有助于提高多处理器系统或多任务系统的性能。众所周知,BIND的性能在多处理器系统上不能很好地提升,而CoreDNS的性能在多处理器场景下能够得到明显的提升。
性能提升确实非常重要,因为Go的运行速度往往比C或C++稍微慢一些注1,部分原因是它的诸多特性所带来的开销。然而,在大多数情况下,这并不是问题:重要的是CoreDNS能够很好地处理分配给它的工作负载。
不过,CoreDNS提供的最重要的功能可能是它能够与etcd和Kubernetes等容器基础设施和编排系统进行通信。
谁需要CoreDNS
一个简单的答案是:几乎所有使用Kubernetes的人,以及大多数运行容器化应用程序的人。
CoreDNS在容器化环境中实现了服务目录的功能,我们将在本书后面进行详细讨论。服务目录可以帮助容器确定运行特定服务的容器的IP地址,例如,为了查询一些数据,某个容器可能会查找某个特定应用程序的数据库服务的域名。服务目录的功能至关重要,因为在容器和微服务的世界里,应用程序通常被分解成许多小的服务(所以才称之为微服务),每个服务可能由多个容器提供支持,并且每个运行的容器都有不同的IP地址。
然而,CoreDNS的作用并不局限于容器化环境。CoreDNS的插件模式可以支持一些像BIND这样的巨头都不支持的高级DNS功能。例如,你可以动态地重写查询和响应,可以从GitHub或Amazon Route 53译注3服务中自动加载区域(zone)数据。此外,因为CoreDNS本身比较轻量级而且通常运行在一个容器中,所以它适用于BIND等大型DNS服务器无法使用的场景。
目标读者
本书适合的读者对象如下:
需要基于DNS的服务发现的容器化环境的管理员,特别是当这些环境是由Kubernetes管理时。
正在寻找一个可以在容器中运行的轻量的、灵活的DNS服务器的DNS管理员。
正在寻找满足以下需求的DNS服务器的DNS管理员:
–与Amazon Route 53集成
–支持灵活的查询和响应重写
–支持基于TLS(Transport Layer Security)和gRPC(general-purpose Remote Procedure Call)的DNS
希望通过编写自定义CoreDNS插件来实现特定DNS功能的开发者。
本书涵盖的内容
通过本书,你将了解:
CoreDNS与其他DNS服务器的区别。
DNS基础理论,包括DNS命名空间(namespace)、域名(domain name)、区域(zone)、资源记录(resource record)、递归(recursion)、缓存(caching)、转发(forwarding)等。
CoreDNS基本配置,包括配置通用DNS服务器,如主DNS服务器、辅助DNS服务器和缓存DNS服务器。
CoreDNS管理区域数据的选项,包括一些高级选项,如从Git和Route 53加载数据。
基于DNS的服务发现的工作原理,以及如何在etcd和Kubernetes中配置CoreDNS服务发现。
如何重写查询和响应。
如何监控CoreDNS和排查其故障。
如何构建CoreDNS的自定义版本并编写新的插件。
排版约定
本书中使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
该图示表示一般性说明。
该图示表示警告或注意。
示例代码
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的示例代码则需要获得许可。引用本书的示例代码来回答问题也不需要许可,将本书中的很大一部分示例代码放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处的形式包含书名、作者、出版社和ISBN,例如:
Learning CoreDNS,作者John Belamric 和 Cricket Liu,由O’Reilly出版,书号978-1-492-04796-4
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permission@oreilly.com联系我们。
O’Reilly在线学习平台(O’Reilly Online Learning)
40多年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O’Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
本书配套网站https://oreil.ly/learning-coreDNS上列出了勘误表、示例以及其他信息。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站http://www.oreilly.com。
我们在Facebook上的地址:http://facebook.com/oreilly
我们在Twitter上的地址:http://twitter.com/oreillymedia
我们在YouTube上的地址:http://www.youtube.com/oreillymedia
致谢
首先要感谢优秀的审稿人:Miek Gieben、Fran?ois Tur和Michael Grosser。他们发现了本书中大大小小的各种错误。其次要感谢CoreDNS社区的所有成员,感谢他们创造了这样一个令人难以置信的产品。
John要感谢他了不起的妻子Robin,感谢她的支持、鼓励和帮助。没有她,他不可能成功。他还要感谢儿子Owen和女儿Audrey的支持,他们忍受了父亲写书过程中所有的胡言乱语。感谢Tim Hockin、Bowei Du和其他Kubernetes SIG-Network团队成员,感谢他们将CoreDNS引入Kubernetes。也感谢Infoblox的前同事,特别是Chris O’haver和Sandeep Rajan,他们努力使CoreDNS成为Kubernetes的正确选择。最后,要感谢前同事Alan Conley,没有他的支持,CoreDNS就不会有今天的成就。
Cricket要感谢他在Infoblox的朋友和同事,尤其是老板Alan Conley。如果没有Alan的长期督促,这本书永远不会有进展。感谢妻子Kristin坚定的支持。同时也要感谢孩子Walt和Greta,他们是他快乐和惊奇的源泉。最后,感谢他的狗狗Charlie和Jessie,感谢它们的陪伴,但遗憾的是,它们没能看到本书的出版。

上架指导

计算机/云计算

封底文字

在本书问世之前,学习CoreDNS需要阅读代码或梳理网站上简陋的文档。现在你不用苦恼了!通过学习本书,Docker或Linux容器的开发人员和操作人员将快速掌握如何将这个标准DNS服务器与Kubernetes结合使用。
谷歌的高级软件工程师John Belamaric和Infoblox的首席DNS架构师Cricket Liu将向你展示如何使用真实世界的示例来配置CoreDNS以实现目标。你将学习DNS的基础知识,包括它如何在容器环境中充当位置代理,以及它如何关联Kubernetes。
通过阅读本书,你将:
? 深入学习DNS理论知识,包括DNS命名空间、域名、域和区域。
? 了解如何配置CoreDNS服务器。
? 学会通过CoreDNS管理和服务基础区域数据及高级区域数据。
? 学会使用etcd和Kubernetes配置CoreDNS服务发现。
? 了解CoreDNS的常见用例:与Kubernetes的集成。
? 学会在查询和响应流经插件链时对其进行操作。
? 学会监控DNS服务的可用性和性能并进行故障排查。
? 学会构建CoreDNS的自定义版本并编写自定义插件。
“ 当CoreDNS在2016年刚起步的时候,谁会想到能有一本如此精彩的书呢?如果你想使用或构建自己的专用DNS服务器,本书必不可少。”
——Miek Gieben
CoreDNS创建者
John Belamaric是谷歌的高级软件工程师,专注于Kubernetes和GKE。他是一位经验丰富的软件工程师和架构师,拥有超过20年的软件设计和开发经验。他也是CoreDNS的核心维护者。
Cricket Liu是Infoblox的首席DNS架构师和高级研究员。他毕业后加入惠普,在惠普工作了9年,作为管理员管理hp.com区域。他也是DNS咨询和培训公司Acme Byte & Wire的创始人。

译者序

如今,云原生已经不再是一个新鲜的技术词汇,各家企业正纷纷全面拥抱并落地云原生,加速数字化转型。云原生计算基金会(CNCF)认为,“云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。”
谈到云原生、容器和微服务,我们通常绕不开Kubernetes这个主题。Kubernetes是目前最流行的开源容器平台之一,用于在集群中自动化应用程序容器的编排,包括部署、扩展、维护和监控等。Kubernetes为用户提供了一套以容器为中心的基础设施框架,非常适合基于微服务的云原生系统的设计、开发和管理,能够帮助用户“构建容错性好、易于管理和便于观察的松耦合系统”。现在你很难找到一项没有(或者没有考虑)和Kubernetes进行集成的新技术,公有云供应商也都各自推出了Kubernetes的托管服务,例如亚马逊云科技的Amazon Elastic Kubernetes Service(即Amazon EKS)。
在Kubernetes和微服务的世界中,应用程序通常被分解为许多微小的服务模块,这些服务通常配置一个(或多个)便于访问的域名,后端由弹性扩缩的多个容器支持,而每个容器都使用不同的IP地址运行。在这种经常动态变化、服务众多的环境下,有效地做好DNS管理和服务发现至关重要。CoreDNS为Kubernetes集群提供了一种独特的DNS服务方式,可提供Kubernetes需要的各种灵活性,并且能够通过让请求沿着插件链提供高级功能的处理,以支持不同的服务发现需求。
本书不仅回顾了DNS的基础理论,包括DNS命名空间、域名、区域、资源记录、递归、转发等概念,还介绍了CoreDNS的历史和发展历程、CoreDNS的特性以及与其他DNS服务器的区别,并通过示例讲解了CoreDNS的基本配置,包括配置通用DNS服务器(如主备DNS服务器和缓存DNS服务器等)。针对Kubernetes环境,本书详细讲解了基于DNS的服务发现的工作原理,以及如何在etcd和Kubernetes中配置CoreDNS服务发现。最后,本书讨论了一些高级功能,例如重写查询和响应、自定义构建CoreDNS及编写自定义插件等。希望读完本书后,你可以获得基于CoreDNS云原生DNS系统的设计、开发和管理的相关知识与经验。
感谢编辑们的悉心指导,他们对本书做了大量的编辑和校对工作,最终确保了本书的顺利出版。感谢家人们的鼓励和支持,他们经常关心着本书的出版进度。最后,依然感谢爱人和我再一次合作,翻译过程中我们细致讨论了书中的内容,希望我们的付出对读者能有所帮助。
因时间和能力所限,书中难免有不当之处,请各位读者给出宝贵的建议,我们将会不断努力完善,谢谢。

史天
2021年8月

图书目录

前言 1
第1章 CoreDNS简介 7
1.1 CoreDNS、容器和微服务 8
1.2 CoreDNS的限制 9
1.3 CoreDNS、Kubernetes和CNCF 10
第2章 DNS知识回顾 11
2.1 域名系统 11
2.2 域名和命名空间 12
2.3 域、委派和区域 13
2.4 资源记录 15
2.5 DNS服务器和权威DNS服务器 16
2.6 解析器 17
2.7 解析和递归 18
2.8 缓存 20
2.9 资源记录详解 21
2.9.1 NAME 21
2.9.2 TTL 22
2.9.3 CLASS 22
2.10 资源记录类型 23
2.10.1 A记录 23
2.10.2 AAAA记录 23
2.10.3 CNAME记录 24
2.10.4 MX记录 24
2.10.5 NS记录 25
2.10.6 SRV记录 26
2.10.7 PTR记录 28
2.10.8 SOA记录 29
2.11 区域数据文件示例 31
第3章 配置CoreDNS 35
3.1 下载CoreDNS 35
3.2 CoreDNS命令行选项 37
3.3 Corefile语法 38
3.3.1 环境变量 40
3.3.2 可重用代码段 40
3.3.3 导入 41
3.3.4 服务器块 41
3.3.5 查询处理 42
3.4 插件 43
3.4.1 根插件 44
3.4.2 文件插件 45
3.4.3 辅助插件 46
3.4.4 转发插件 47
3.4.5 缓存插件 49
3.4.6 错误插件 50
3.4.7 日志插件 51
3.5 常见配置选项 55
3.5.1 fallthrough 55
3.5.2 tls 55
3.5.3 transfer to 56
3.6 DNS服务器配置示例 56
3.6.1 缓存DNS服务器 56
3.6.2 主DNS服务器 57
3.6.3 辅助DNS服务器 57
第4章 管理区域数据 59
4.1 文件插件 59
4.2 自动插件 61
4.3 主机插件 63
4.4 route53插件 65
第5章 服务发现 69
5.1 服务发现简介 69
5.2 解决服务发现问题 70
5.3 使用CoreDNS和etcd实现服务发现 72
5.3.1 etcd插件 73
5.3.2 其他服务发现选项 78
5.4 服务发现和容器编排 78
第6章 CoreDNS与Kubernetes 81
6.1 Kubernetes基础知识 81
6.2 Kubernetes网络 83
6.2.1 cluster IP服务 84
6.2.2 headless服务 85
6.3 Kubernetes DNS规范 86
6.4 CoreDNS集成 94
6.5 CoreDNS默认配置 95
6.6 存根域和联邦 99
6.7 集群DNS部署资源 100
6.7.1 基于角色的访问控制 100
6.7.2 服务 102
6.7.3 部署 103
6.8 自动扩缩 107
6.9 优化配置 108
6.10 kubernetes插件 110
6.11 CoreDNS扩展 112
6.11.1 pod选项 113
6.11.2 通配符查询 113
6.11.3 Autopath和ndots:5问题 114
6.11.4 区域传输支持 117
6.11.5 对外公开服务 118
6.11.6 修改可用记录 119
第7章 操作查询和响应 121
7.1 模板插件 121
7.2 重写插件 123
7.2.1 重写EDNS0选项 126
7.2.2 多条重写规则 128
7.3 元数据插件 129
7.4使用DNS安全扩展签名响应 130
7.4.1 管理DNSSEC签名的主区域 130
7.4.2 使用dnssec插件进行动态DNSSEC签名 134
7.5 案例研究:Infoblox的BloxOne威胁防御 136
7.5.1 识别用户 136
7.5.2 应用策略 138
第8章 监控和故障排查 139
8.1 prometheus插件 139
8.2 日志插件 141
8.3 dnstap插件 146
8.4 错误插件 148
8.5 跟踪插件 150
8.6 调试插件 152
第9章 自定义构建 153
9.1 使用外部插件编译CoreDNS 153
9.1.1 使用Docker构建 154
9.1.2 在工作站上构建 155
9.1.3 修改plugin.cfg文件 156
9.1.4 更换主程序 159
9.2 编写自定义插件 165
9.2.1 示例:只保留一条记录 168
9.2.2 与指标、跟踪和元数据集成 172

教学资源推荐
作者: 麻志毅 编著
作者: (印) S. K. Singh 著
作者: 中国计算机学会 主编
参考读物推荐