0 - 通過(guò)本文你會(huì)獲得什么
如何監(jiān)控CoreDNS,通過(guò)了解它的幾個(gè)關(guān)鍵指標(biāo),查詢歷史趨勢(shì)、服務(wù)負(fù)載,可以反饋出運(yùn)行的狀態(tài),及早預(yù)知可能出現(xiàn)的異常,做到心中有數(shù),保證服務(wù)的穩(wěn)定。
涉及知識(shí)點(diǎn):kubernetes prometheus coredns
1 - 開(kāi)始前準(zhǔn)備
需有一套K8S集群,使用CoreDNS作為內(nèi)部的域名解析系統(tǒng),同時(shí)集群內(nèi)設(shè)置了Prometheus作為指標(biāo)收集。
在k8s 1.9之前,可選的dns服務(wù)只有kube-dns(實(shí)際由3個(gè)容器組成的Pod),在1.10之后可選coredns替換kube-dns作為集群內(nèi)解析服務(wù),同時(shí)官方也推薦后續(xù)均由coredns替代kube-dns組件。
CoreDNS在k8s 1.11的時(shí)候GA,正式引入集群作為默認(rèn)服務(wù)是在k8s的1.13版本,DNS在集群中的作用也是至關(guān)重要的,負(fù)責(zé)集群內(nèi)服務(wù)發(fā)現(xiàn)以及外部域名解析,如果出現(xiàn)異常,對(duì)業(yè)務(wù)也會(huì)造成較大影響。
2 - 開(kāi)啟CoreDNS性能指標(biāo)
通過(guò)在Corefile配置文件中開(kāi)啟prometheus插件,語(yǔ)法格式:
. {
prometheus 0.0.0.0:9253
}
默認(rèn)監(jiān)聽(tīng)的地址為: 127.0.0.1:9253,由于需從外部進(jìn)行數(shù)據(jù)抓取,所以必須監(jiān)聽(tīng)在0.0.0.0否則Prometheus無(wú)法獲取coredns性能數(shù)據(jù)。
3 - CoreDNS性能指標(biāo)列表
| 指標(biāo)名稱 | 指標(biāo)類(lèi)型 | 用途描述 |
|---|---|---|
| coredns_dns_request_count_total | counter | 服務(wù)端記錄所有請(qǐng)求查詢的累計(jì)值,單位:次 |
| coredns_dns_request_duration_seconds | histogram | 服務(wù)端每個(gè)查詢所消耗的時(shí)間分布,單位:秒 |
| coredns_dns_request_size_bytes | histogram | 客戶端通過(guò)UDP傳遞的EDNS0數(shù)據(jù)包大小分布,單位:字節(jié) |
| coredns_dns_request_do_count_total | counter | 客戶端設(shè)置了DO標(biāo)志位的請(qǐng)求次數(shù)累計(jì)值,單位:次 |
| coredns_dns_request_type_count_total | counter | 請(qǐng)求查詢記錄類(lèi)型的累計(jì)值,單位:次 |
| coredns_dns_response_size_bytes | histogram | 服務(wù)端響應(yīng)客戶端數(shù)據(jù)包大小分布,單位:字節(jié) |
| coredns_dns_response_rcode_count_total | counter | 服務(wù)端響應(yīng)狀態(tài)碼次數(shù)的累計(jì)值,單位:次 |
| coredns_panic_count_total | counter | 進(jìn)程出現(xiàn)異常中斷次數(shù)的累計(jì)值,單位:次 |
| coredns_plugin_enabled | gauge | 插件的啟用情況 |
| coredns_build_info | gauge | 編譯的版本信息 |
這里主要關(guān)注這6個(gè)指標(biāo):
- coredns_dns_request_count_total
- coredns_dns_request_duration_seconds
- coredns_dns_request_type_count_total
- coredns_dns_response_size_bytes
- coredns_dns_response_rcode_count_total
- coredns_panic_count_total
在下一步我們將會(huì)通過(guò)它們進(jìn)行數(shù)值展示。
3.1 - 幾個(gè)通用維度
大部分指標(biāo)都存在server、zone這兩個(gè)維度
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 客戶端請(qǐng)求解析所使用的dns服務(wù)端地址 |
| zone | 客戶端請(qǐng)求解析所匹配到服務(wù)端設(shè)置的zone |
server 有時(shí)候會(huì)設(shè)置監(jiān)聽(tīng)多個(gè),這樣就有多個(gè)server維度值,格式為:
<scheme>://[<bind>]:<port>
例如:dns://:53 或者 dns://127.0.0.1:53 或者 dns://:9153
3.2 - 指標(biāo):coredns_dns_request_count_total
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 見(jiàn)通用維度 |
| zone | 見(jiàn)通用維度 |
| proto | 響應(yīng)傳輸層的協(xié)議,值為:tcp或udp |
| family | 網(wǎng)絡(luò)層IP協(xié)議版本,值為:1(ipv4)或者2(ipv6) |
3.3 - 指標(biāo):coredns_dns_request_duration_seconds
是一個(gè)histogram類(lèi)型的指標(biāo),所以存在三個(gè)具體的指標(biāo)名:
- coredns_dns_request_duration_seconds_bucket
- coredns_dns_request_duration_seconds_sum
- coredns_dns_request_duration_seconds_count
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| le | 請(qǐng)求所消耗的時(shí)間,單位秒 |
其中l(wèi)e維度只有X_bucket才有。
le維度取值范圍:0.00025,0.0005,..., 后一個(gè)以前值的2被數(shù)增加,最多16個(gè),最后一個(gè)為無(wú)窮大。
3.4 - 指標(biāo):coredns_dns_request_size_bytes
是一個(gè)histogram類(lèi)型的指標(biāo),所以存在三個(gè)具體的指標(biāo)名:
- coredns_dns_request_size_bytes_bucket
- coredns_dns_request_size_bytes_sum
- coredns_dns_request_size_bytes_count
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| proto | 響應(yīng)傳輸層的協(xié)議,值為:tcp或udp |
| le | 通過(guò)UDP傳遞的EDNS0數(shù)據(jù)包大小分布情況,單位字節(jié) |
其中l(wèi)e維度只有X_bucket才有
le維度取值范圍:0, 100, 200, 300, 400, 511, 1023, 2047, 4095, 8291, 16000, 32000, 48000, 64000
3.5 - 指標(biāo):coredns_dns_request_do_count_total
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
有時(shí)候可能會(huì)看不到這個(gè)指標(biāo),可能沒(méi)有存在dnssec的請(qǐng)求,你可以通過(guò)以下dig命令
dig www.google.com +dnssec @127.0.0.1 -p 53
通過(guò)該DNS查詢,這樣該指標(biāo)值累加1次
3.6 - 指標(biāo):coredns_dns_request_type_count_total
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| type | DNS的解析記錄類(lèi)型 |
可支持大部分主流的記錄類(lèi)型,如下表:
| DNS解析記錄 | 說(shuō)明 |
|---|---|
| AAAA | 域名指向一個(gè)IPv6地址 |
| A | 域名指向一個(gè)IPv4地址 |
| CNAME | 域名指向一個(gè)域名 |
| DNSKEY | 在DNSSEC內(nèi)使用的關(guān)鍵記錄 |
| DS | 委托簽發(fā)者,用于鑒定DNSSEC已授權(quán)區(qū)域的簽名密鑰 |
| MX | 電郵交互記錄,引導(dǎo)域名到該域名的郵件傳輸代理列表 |
| NSEC3 | NSEC記錄第三版 |
| NSEC | DNSSEC的一部分,用來(lái)驗(yàn)證一個(gè)未存在的服務(wù)器,使用與NXT記錄的格式 |
| NS | 名稱服務(wù)器記錄,指定DNS區(qū)域使用已有的權(quán)威域名服務(wù)器 |
| PTR | 指針記錄,最常用來(lái)運(yùn)行反向DNS查找 |
| RRSIG | DNSSEC 安全記錄集證書(shū) |
| SOA | 權(quán)威記錄的起始,指定有關(guān)DNS區(qū)域的權(quán)威性信息 |
| SRV | 服務(wù)定位器,被新式協(xié)議使用而避免產(chǎn)生特定協(xié)議的記錄,例如:MX 記錄 |
| TXT | 文本記錄 |
| IXFR | 增量區(qū)域轉(zhuǎn)移,請(qǐng)求只有與先前流水式編號(hào)不同的特定區(qū)域的區(qū)域轉(zhuǎn)移 |
| AXFR | 全域轉(zhuǎn)移,由主域名服務(wù)器轉(zhuǎn)移整個(gè)區(qū)域文件至二級(jí)域名服務(wù)器 |
| ANY | 所有緩存的記錄或者全部已知的記錄類(lèi)型 |
| other | 不屬于以上類(lèi)型的,均歸屬為此類(lèi) |
3.7 - 指標(biāo):coredns_dns_response_size_bytes
是一個(gè)histogram類(lèi)型的指標(biāo),所以存在三個(gè)具體的指標(biāo)名:
- coredns_dns_response_size_bytes_bucket
- coredns_dns_response_size_bytes_sum
- coredns_dns_response_size_bytes_count
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| proto | 響應(yīng)傳輸層的協(xié)議,值為:tcp或udp |
| le | 響應(yīng)返回客戶端的數(shù)據(jù)大小,單位:字節(jié) |
le維度取值范圍:0, 100, 200, 300, 400, 511, 1023, 2047, 4095, 8291, 16000, 32000, 48000, 64000
3.8 - 指標(biāo):coredns_dns_response_rcode_count_total
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| rcode | 響應(yīng)狀態(tài)碼 |
常見(jiàn)的幾個(gè)響應(yīng)狀態(tài)碼,如下表:
| DNS響應(yīng)狀態(tài)碼 | 說(shuō)明 |
|---|---|
| NOERROR | 查詢請(qǐng)求成功完成 |
| FORMERR | 查詢請(qǐng)求格式錯(cuò)誤 |
| SERVFAIL | 服務(wù)端處理失敗 |
| NXDOMAIN | 請(qǐng)求查詢的域名不存在 |
| NOTIMP | 功能未實(shí)現(xiàn) |
| REFUSED | 服務(wù)端拒絕回復(fù)該查詢 |
3.8 - coredns_panic_count_total
進(jìn)程出現(xiàn)中斷的次數(shù),這個(gè)比較嚴(yán)重,需判斷是否新加了什么插件導(dǎo)致的,需要關(guān)注了。
3.9 - 指標(biāo):coredns_plugin_enabled
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| server | 通用維度 |
| zone | 通用維度 |
| name | 啟用插件的名稱 |
當(dāng)前各個(gè)server下的zone開(kāi)啟了哪些插件功能。
3.10 - 指標(biāo):coredns_build_info
| 維度名稱 | 維度說(shuō)明 |
|---|---|
| version | 運(yùn)行coredns的版本 |
| revision | 編譯coredns時(shí)的git修訂號(hào) |
| goversion | 編譯coredns的go版本 |
記錄coredns編譯時(shí)的版本
4 - 關(guān)鍵指標(biāo)展示
同時(shí)制作了一個(gè)視圖模版,可在Grafana官方地址:https://grafana.com/grafana/dashboards/10639 下載,
以下通過(guò)展示幾個(gè)promQL查詢語(yǔ)句,示例均以維度server=172.23.243.136:9153。
4.1 - 請(qǐng)求時(shí)間耗時(shí)
示例1: 以維度server,zone,le分組,最近5分鐘內(nèi),平均每秒耗時(shí)小于le維度的變化數(shù)量
sort_desc(
avg(
rate(
coredns_dns_request_duration_seconds_bucket{instance="172.23.243.136:9153"}[5m]
)
) by(server,zone,le)
)
示例2:計(jì)算示例1結(jié)果90%的范圍小于多少,也就是第90百分位數(shù)
百分位數(shù): 用99個(gè)數(shù)值或99個(gè)點(diǎn),將按從小到大順序排列的觀測(cè)值劃分為100個(gè)等分,則這99個(gè)數(shù)值或99個(gè)點(diǎn)就稱為百分位數(shù),比如:第90百分位數(shù)的值,表示有90%的值均小于該數(shù)值。
histogram_quantile(0.90,
sum(
rate(
coredns_dns_request_duration_seconds_bucket{instance="172.23.243.136:9153"}[5m]
)
) by(server,zone,le)
)
4.2 - 客戶端數(shù)據(jù)包大小
示例1:以維度proto,server,zone,le分組,最近5分鐘內(nèi),平均每秒數(shù)據(jù)包大小小于le維度的變化數(shù)量
sort_desc(
avg(
rate(
coredns_dns_response_size_bytes_bucket{instance="172.23.243.136:9153",zone!="dropped"}[5m]
)
) by (proto,server,zone,le)
)
示例2:計(jì)算示例1結(jié)果90%的范圍小于多少,也就是第90百分位數(shù)
histogram_quantile(0.90,
avg(
rate(
coredns_dns_response_size_bytes_bucket{instance="172.23.243.136:9153",zone!="dropped"}[5m]
)
) by (proto,server,zone,le)
)
4.3 - 服務(wù)端處理請(qǐng)求數(shù)
示例1:最近5分鐘內(nèi),平均每秒處理的請(qǐng)求次數(shù)
sort_desc(
avg(
rate(
coredns_dns_request_count_total{instance="172.23.243.136:9153"}[5m]
)
) by (proto,server,zone)
)
4.4 - 客戶端請(qǐng)求記錄類(lèi)型
示例1:最近5分鐘內(nèi),各請(qǐng)求記錄類(lèi)型,平均每秒處理的次數(shù)
sort_desc(
avg(
rate(
coredns_dns_request_type_count_total{instance="172.23.243.136:9153"}[5m]
)
) by (server,zone,type)
)
4.5 - 服務(wù)端響應(yīng)狀態(tài)碼分布
示例1:最近5分鐘,平均每秒響應(yīng)狀態(tài)碼的次數(shù)
sort_desc(
avg(
rate(
coredns_dns_response_rcode_count_total{instance="172.23.243.136:9153"}[5m]
)
) by(server,zone,rcode)
)
4.6 - 服務(wù)異常統(tǒng)計(jì)
- 出現(xiàn)panic時(shí)候,記錄drop
- 不存在dns question section(向DNS請(qǐng)求的部分)
- 其他原因被拒絕解析的
所以不需要關(guān)注 zone=droped 的數(shù)據(jù),可以通過(guò)rcode其他指標(biāo)反應(yīng)出來(lái)
示例1:響應(yīng)狀態(tài)碼非正常的處理請(qǐng)求,平均每秒次數(shù),單位:次/秒
sort_desc(
avg(
rate(
coredns_dns_response_rcode_count_total{instance="172.23.243.136:9153",rcode!="NOERROR"}[10m]
)
) by(server,zone,rcode)
)
示例2: 進(jìn)程出現(xiàn)panic的次數(shù)
avg(coredns_panic_count_total{instance="172.23.243.136:9153"})
5 - 總結(jié)討論
在配合prometheus的alertmanager組件,根據(jù)以上指標(biāo)設(shè)置告警規(guī)則,做到及時(shí)預(yù)警。Kubernetes是分布式系統(tǒng),帶來(lái)了一定的維護(hù)復(fù)雜度,必須有一套完善的監(jiān)控體系去做支撐。
本人關(guān)注云原生生態(tài),今天這里只是針對(duì)DNS服務(wù)的內(nèi)容,后續(xù)還會(huì)有其他相關(guān)的分享,如有興趣,歡迎關(guān)注我,對(duì)于存在的疑問(wèn)點(diǎn),歡迎留言討論。