本書介紹了CoreDNS與其他DNS服務(wù)器的區(qū)別、DNS基礎(chǔ)理論、CoreDNS基本配置、CoreDNS管理區(qū)域數(shù)據(jù)的選項、基于DNS的服務(wù)發(fā)現(xiàn)的工作原理,以及如何在etcd和Kubernetes中配置CoreDNS服務(wù)發(fā)現(xiàn)。此外,還講解了如何重寫查詢和響應(yīng),如何監(jiān)控和排查CoreDNS故障以及如何構(gòu)建CoreDNS的定制版本并編寫新的插件。
適讀人群 :CoreDNS技術(shù)愛好者
在本書問世之前,學習CoreDNS需要閱讀代碼或梳理網(wǎng)站上簡陋的文檔,F(xiàn)在你不用苦惱了!通過學習本書,Docker或Linux容器的開發(fā)人員和操作人員將快速掌握如何將這個標準DNS服務(wù)器與Kubernetes結(jié)合使用。
谷歌的高級軟件工程師John Belamaric和Infoblox的首席DNS架構(gòu)師Cricket Liu將向你展示如何使用真實世界的示例來配置CoreDNS以實現(xiàn)目標。你將學習DNS的基礎(chǔ)知識,包括它如何在容器環(huán)境中充當位置代理,以及它如何關(guān)聯(lián)Kubernetes。
閱讀本書,你將:
?? 深入學習DNS理論知識,包括DNS命名空間、域名、域和區(qū)域。
?? 了解如何配置CoreDNS服務(wù)器。
?? 學會通過CoreDNS管理和服務(wù)基礎(chǔ)區(qū)域數(shù)據(jù)及高級區(qū)域數(shù)據(jù)。
?? 學會使用etcd和Kubernetes配置CoreDNS服務(wù)發(fā)現(xiàn)。
?? 了解CoreDNS的常見用例:與Kubernetes的集成。
?? 學會在查詢和響應(yīng)流經(jīng)插件鏈時對其進行操作。
?? 學會監(jiān)控DNS服務(wù)的可用性和性能并進行故障排查。
?? 學會構(gòu)建CoreDNS的自定義版本并編寫自定義插件。
為什么需要一個新的DNS服務(wù)器
看到本書,你可能會想到的第一個問題是“為什么我們還需要一個新的DNS服務(wù)器呢?”畢竟,目前有很多種DNS服務(wù)器可供選擇。你最先可能想到的就是DNS服務(wù)器的鼻祖—BIND(Berkeley Internet Name Domain),它誕生于20世紀80年代,支持幾乎所有的DNS標準。除了BIND之外,還有微軟的DNS Server,它被廣泛地應(yīng)用于Active Directory環(huán)境。NLnet Labs譯注1的NSD和Knot也是優(yōu)秀的權(quán)威DNS服務(wù)器,同樣來自NLnet Labs的Unbound也是一個快速、精簡的遞歸DNS服務(wù)器。那么,CoreDNS有哪些優(yōu)勢呢?
CoreDNS是用Go語言編寫的,而Go是一種內(nèi)存安全譯注2的編程語言。你可能會好奇為什么這很重要?如果你曾經(jīng)運行過基于BIND的DNS基礎(chǔ)設(shè)施,就可能遇到過因為緩沖區(qū)溢出而不得不盡快升級100個DNS服務(wù)器的情況。所有類型的DNS服務(wù)器(至少是那些用C和C++編寫的)中有相當比例的漏洞來自緩沖區(qū)溢出或指針超支和指針懸空,而使用內(nèi)存安全的Go語言編寫的CoreDNS就不會受這些問題的困擾。
用Go編寫的程序也可以很好地支持并發(fā)或并行處理,這有助于提高多處理器系統(tǒng)或多任務(wù)系統(tǒng)的性能。眾所周知,BIND的性能在多處理器系統(tǒng)上不能很好地提升,而CoreDNS的性能在多處理器場景下能夠得到明顯的提升。
性能提升確實非常重要,因為Go的運行速度往往比C或C++稍微慢一些注1,部分原因是它的諸多特性所帶來的開銷。然而,在大多數(shù)情況下,這并不是問題:重要的是CoreDNS能夠很好地處理分配給它的工作負載。
不過,CoreDNS提供的最重要的功能可能是它能夠與etcd和Kubernetes等容器基礎(chǔ)設(shè)施和編排系統(tǒng)進行通信。
誰需要CoreDNS
一個簡單的答案是:幾乎所有使用Kubernetes的人,以及大多數(shù)運行容器化應(yīng)用程序的人。
CoreDNS在容器化環(huán)境中實現(xiàn)了服務(wù)目錄的功能,我們將在本書后面進行詳細討論。服務(wù)目錄可以幫助容器確定運行特定服務(wù)的容器的IP地址,例如,為了查詢一些數(shù)據(jù),某個容器可能會查找某個特定應(yīng)用程序的數(shù)據(jù)庫服務(wù)的域名。服務(wù)目錄的功能至關(guān)重要,因為在容器和微服務(wù)的世界里,應(yīng)用程序通常被分解成許多小的服務(wù)(所以才稱之為微服務(wù)),每個服務(wù)可能由多個容器提供支持,并且每個運行的容器都有不同的IP地址。
然而,CoreDNS的作用并不局限于容器化環(huán)境。CoreDNS的插件模式可以支持一些像BIND這樣的巨頭都不支持的高級DNS功能。例如,你可以動態(tài)地重寫查詢和響應(yīng),可以從GitHub或Amazon Route 53譯注3服務(wù)中自動加載區(qū)域(zone)數(shù)據(jù)。此外,因為CoreDNS本身比較輕量級而且通常運行在一個容器中,所以它適用于BIND等大型DNS服務(wù)器無法使用的場景。
目標讀者
本書適合的讀者對象如下:
需要基于DNS的服務(wù)發(fā)現(xiàn)的容器化環(huán)境的管理員,特別是當這些環(huán)境是由Kubernetes管理時。
正在尋找一個可以在容器中運行的輕量的、靈活的DNS服務(wù)器的DNS管理員。
正在尋找滿足以下需求的DNS服務(wù)器的DNS管理員:
–與Amazon Route 53集成
–支持靈活的查詢和響應(yīng)重寫
–支持基于TLS(Transport Layer Security)和gRPC(general-purpose Remote Procedure Call)的DNS
希望通過編寫自定義CoreDNS插件來實現(xiàn)特定DNS功能的開發(fā)者。
本書涵蓋的內(nèi)容
通過本書,你將了解:
CoreDNS與其他DNS服務(wù)器的區(qū)別。
DNS基礎(chǔ)理論,包括DNS命名空間(namespace)、域名(domain name)、區(qū)域(zone)、資源記錄(resource record)、遞歸(recursion)、緩存(caching)、轉(zhuǎn)發(fā)(forwarding)等。
CoreDNS基本配置,包括配置通用DNS服務(wù)器,如主DNS服務(wù)器、輔助DNS服務(wù)器和緩存DNS服務(wù)器。
CoreDNS管理區(qū)域數(shù)據(jù)的選項,包括一些高級選項,如從Git和Route 53加載數(shù)據(jù)。
基于DNS的服務(wù)發(fā)現(xiàn)的工作原理,以及如何在etcd和Kubernetes中配置CoreDNS服務(wù)發(fā)現(xiàn)。
如何重寫查詢和響應(yīng)。
如何監(jiān)控CoreDNS和排查其故障。
如何構(gòu)建CoreDNS的自定義版本并編寫新的插件。
排版約定
本書中使用以下排版約定:
斜體(Italic)
表示新的術(shù)語、URL、電子郵件地址、文件名和文件擴展名。
等寬字體(Constant width)
用于程序清單,以及段落中的程序元素,例如變量名、函數(shù)名、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句以及關(guān)鍵字。
該圖示表示一般性說明。
該圖示表示警告或注意。
示例代碼
這里的代碼是為了幫助你更好地理解本書的內(nèi)容。通常,可以在程序或文檔中使用本書中的代碼,而不需要聯(lián)系O’Reilly獲得許可,除非需要大段地復(fù)制代碼。例如,使用本書中所提供的幾個代碼片段來編寫一個程序不需要得到我們的許可,但銷售或發(fā)布O’Reilly的示例代碼則需要獲得許可。引用本書的示例代碼來回答問題也不需要許可,將本書中的很大一部分示例代碼放到自己的產(chǎn)品文檔中則需要獲得許可。
非常歡迎讀者使用本書中的代碼,希望(但不強制)注明出處。注明出處的形式包含書名、作者、出版社和ISBN,例如:
Learning CoreDNS,作者John Belamric 和 Cricket Liu,由O’Reilly出版,書號978-1-49
前言 1
第1章 CoreDNS簡介 7
11 CoreDNS、容器和微服務(wù) 8
12 CoreDNS的限制 9
13 CoreDNS、Kubernetes和CNCF 10
第2章 DNS知識回顧 11
21 域名系統(tǒng) 11
22 域名和命名空間 12
23 域、委派和區(qū)域 13
24 資源記錄 15
25 DNS服務(wù)器和權(quán)威DNS服務(wù)器 16
26 解析器 17
27 解析和遞歸 18
28 緩存 20
29 資源記錄詳解 21
291 NAME 21
292 TTL 22
293 CLASS 22
210 資源記錄類型 23
2101 A記錄 23
2102 AAAA記錄 23
2103 CNAME記錄 24
2104 MX記錄 24
2105 NS記錄 25
2106 SRV記錄 26
2107 PTR記錄 28
2108 SOA記錄 29
211 區(qū)域數(shù)據(jù)文件示例 31
第3章 配置CoreDNS 35
31 下載CoreDNS 35
32 CoreDNS命令行選項 37
33 Corefile語法 38
331 環(huán)境變量 40
332 可重用代碼段 40
333 導(dǎo)入 41
334 服務(wù)器塊 41
335 查詢處理 42
34 插件 43
341 根插件 44
342 文件插件 45
343 輔助插件 46
344 轉(zhuǎn)發(fā)插件 47
345 緩存插件 49
346 錯誤插件 50
347 日志插件 51
35 常見配置選項 55
351 fallthrough 55
352 tls 55
353 transfer to 56
36 DNS服務(wù)器配置示例 56
361 緩存DNS服務(wù)器 56
362 主DNS服務(wù)器 57
363 輔助DNS服務(wù)器 57
第4章 管理區(qū)域數(shù)據(jù) 59
41 文件插件 59
42 自動插件 61
43 主機插件 63
44 route53插件 65
第5章 服務(wù)發(fā)現(xiàn) 69
51 服務(wù)發(fā)現(xiàn)簡介 69
52 解決服務(wù)發(fā)現(xiàn)問題 70
53 使用CoreDNS和etcd實現(xiàn)服務(wù)發(fā)現(xiàn) 72
531 etcd插件 73
532 其他服務(wù)發(fā)現(xiàn)選項 78
54 服務(wù)發(fā)現(xiàn)和容器編排 78
第6章 CoreDNS與Kubernetes 81
61 Kubernetes基礎(chǔ)知識 81
62 Kubernetes網(wǎng)絡(luò) 83
621 cluster IP服務(wù) 84
622 headless服務(wù) 85
63 Kubernetes DNS規(guī)范 86
64 CoreDNS集成 94
65 CoreDNS默認配置 95
66 存根域和聯(lián)邦 99
67 集群DNS部署資源 100
671 基于角色的訪問控制 100
672 服務(wù) 102
673 部署 103
68 自動擴縮 107
69 優(yōu)化配置 108
610 kubernetes插件 110
611 CoreDNS擴展 112
6111 pod選項 113
6112 通配符查詢 113
6113 Autopath和ndots:5問題 114
6114 區(qū)域傳輸支持 117
6115 對外公開服務(wù) 118
6116 修改可用記錄 119
第7章 操作查詢和響應(yīng) 121
71 模板插件 121
72 重寫插件 123
721 重寫EDNS0選項 126
722 多條重寫規(guī)則 128
73 元數(shù)據(jù)插件 129
74使用DNS安全擴展簽名響應(yīng) 130
741 管理DNSSEC簽名的主區(qū)域 130
742 使用dnssec插件進行動態(tài)DNSSEC簽名 134
75 案例研究:Infoblox的BloxOne威脅防御 136
751 識別用戶 136
752 應(yīng)用策略 138
第8章 監(jiān)控和故障排查 139
81 prometheus插件 139
82 日志插件 141
83 dnstap插件 146
84 錯誤插件 148
85 跟蹤插件 150
86 調(diào)試插件 152
第9章 自定義構(gòu)建 153
91 使用外部插件編譯CoreDNS 153
911 使用Docker構(gòu)建 154
912 在工作站上構(gòu)建 155
913 修改plugincfg文件 156
914 更換主程序 159
92 編寫自定義插件 165
921 示例:只保留一條記錄 168
922 與指標、跟蹤和元數(shù)據(jù)集成 172