0 - 通過本文你會獲得什么
如何監(jiān)控CoreDNS娃惯,通過了解它的幾個關(guān)鍵指標,查詢歷史趨勢肥败、服務負載趾浅,可以反饋出運行的狀態(tài),及早預知可能出現(xiàn)的異常馒稍,做到心中有數(shù)皿哨,保證服務的穩(wěn)定。
涉及知識點:kubernetes prometheus coredns
1 - 開始前準備
需有一套K8S集群纽谒,使用CoreDNS作為內(nèi)部的域名解析系統(tǒng)证膨,同時集群內(nèi)設置了Prometheus作為指標收集。
在k8s 1.9之前鼓黔,可選的dns服務只有kube-dns(實際由3個容器組成的Pod)央勒,在1.10之后可選coredns替換kube-dns作為集群內(nèi)解析服務,同時官方也推薦后續(xù)均由coredns替代kube-dns組件澳化。
CoreDNS在k8s 1.11的時候GA崔步,正式引入集群作為默認服務是在k8s的1.13版本,DNS在集群中的作用也是至關(guān)重要的缎谷,負責集群內(nèi)服務發(fā)現(xiàn)以及外部域名解析井濒,如果出現(xiàn)異常,對業(yè)務也會造成較大影響列林。
2 - 開啟CoreDNS性能指標
通過在Corefile配置文件中開啟prometheus插件瑞你,語法格式:
. {
prometheus 0.0.0.0:9253
}
默認監(jiān)聽的地址為: 127.0.0.1:9253,由于需從外部進行數(shù)據(jù)抓取希痴,所以必須監(jiān)聽在0.0.0.0否則Prometheus無法獲取coredns性能數(shù)據(jù)者甲。
3 - CoreDNS性能指標列表
指標名稱 | 指標類型 | 用途描述 |
---|---|---|
coredns_dns_request_count_total | counter | 服務端記錄所有請求查詢的累計值,單位:次 |
coredns_dns_request_duration_seconds | histogram | 服務端每個查詢所消耗的時間分布润梯,單位:秒 |
coredns_dns_request_size_bytes | histogram | 客戶端通過UDP傳遞的EDNS0數(shù)據(jù)包大小分布过牙,單位:字節(jié) |
coredns_dns_request_do_count_total | counter | 客戶端設置了DO標志位的請求次數(shù)累計值,單位:次 |
coredns_dns_request_type_count_total | counter | 請求查詢記錄類型的累計值纺铭,單位:次 |
coredns_dns_response_size_bytes | histogram | 服務端響應客戶端數(shù)據(jù)包大小分布寇钉,單位:字節(jié) |
coredns_dns_response_rcode_count_total | counter | 服務端響應狀態(tài)碼次數(shù)的累計值,單位:次 |
coredns_panic_count_total | counter | 進程出現(xiàn)異常中斷次數(shù)的累計值舶赔,單位:次 |
coredns_plugin_enabled | gauge | 插件的啟用情況 |
coredns_build_info | gauge | 編譯的版本信息 |
這里主要關(guān)注這6個指標:
- 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
在下一步我們將會通過它們進行數(shù)值展示扫倡。
3.1 - 幾個通用維度
大部分指標都存在server、zone這兩個維度
維度名稱 | 維度說明 |
---|---|
server | 客戶端請求解析所使用的dns服務端地址 |
zone | 客戶端請求解析所匹配到服務端設置的zone |
server 有時候會設置監(jiān)聽多個,這樣就有多個server維度值撵溃,格式為:
<scheme>://[<bind>]:<port>
例如:dns://:53 或者 dns://127.0.0.1:53 或者 dns://:9153
3.2 - 指標:coredns_dns_request_count_total
維度名稱 | 維度說明 |
---|---|
server | 見通用維度 |
zone | 見通用維度 |
proto | 響應傳輸層的協(xié)議疚鲤,值為:tcp或udp |
family | 網(wǎng)絡層IP協(xié)議版本,值為:1(ipv4)或者2(ipv6) |
3.3 - 指標:coredns_dns_request_duration_seconds
是一個histogram類型的指標缘挑,所以存在三個具體的指標名:
- coredns_dns_request_duration_seconds_bucket
- coredns_dns_request_duration_seconds_sum
- coredns_dns_request_duration_seconds_count
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
le | 請求所消耗的時間集歇,單位秒 |
其中l(wèi)e維度只有X_bucket才有。
le維度取值范圍:0.00025语淘,0.0005诲宇,..., 后一個以前值的2被數(shù)增加,最多16個惶翻,最后一個為無窮大姑蓝。
3.4 - 指標:coredns_dns_request_size_bytes
是一個histogram類型的指標,所以存在三個具體的指標名:
- coredns_dns_request_size_bytes_bucket
- coredns_dns_request_size_bytes_sum
- coredns_dns_request_size_bytes_count
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
proto | 響應傳輸層的協(xié)議吕粗,值為:tcp或udp |
le | 通過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 - 指標:coredns_dns_request_do_count_total
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
有時候可能會看不到這個指標,可能沒有存在dnssec的請求颅筋,你可以通過以下dig命令
dig www.google.com +dnssec @127.0.0.1 -p 53
通過該DNS查詢宙暇,這樣該指標值累加1次
3.6 - 指標:coredns_dns_request_type_count_total
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
type | DNS的解析記錄類型 |
可支持大部分主流的記錄類型,如下表:
DNS解析記錄 | 說明 |
---|---|
AAAA | 域名指向一個IPv6地址 |
A | 域名指向一個IPv4地址 |
CNAME | 域名指向一個域名 |
DNSKEY | 在DNSSEC內(nèi)使用的關(guān)鍵記錄 |
DS | 委托簽發(fā)者垃沦,用于鑒定DNSSEC已授權(quán)區(qū)域的簽名密鑰 |
MX | 電郵交互記錄客给,引導域名到該域名的郵件傳輸代理列表 |
NSEC3 | NSEC記錄第三版 |
NSEC | DNSSEC的一部分,用來驗證一個未存在的服務器肢簿,使用與NXT記錄的格式 |
NS | 名稱服務器記錄,指定DNS區(qū)域使用已有的權(quán)威域名服務器 |
PTR | 指針記錄蜻拨,最常用來運行反向DNS查找 |
RRSIG | DNSSEC 安全記錄集證書 |
SOA | 權(quán)威記錄的起始池充,指定有關(guān)DNS區(qū)域的權(quán)威性信息 |
SRV | 服務定位器,被新式協(xié)議使用而避免產(chǎn)生特定協(xié)議的記錄缎讼,例如:MX 記錄 |
TXT | 文本記錄 |
IXFR | 增量區(qū)域轉(zhuǎn)移收夸,請求只有與先前流水式編號不同的特定區(qū)域的區(qū)域轉(zhuǎn)移 |
AXFR | 全域轉(zhuǎn)移,由主域名服務器轉(zhuǎn)移整個區(qū)域文件至二級域名服務器 |
ANY | 所有緩存的記錄或者全部已知的記錄類型 |
other | 不屬于以上類型的血崭,均歸屬為此類 |
3.7 - 指標:coredns_dns_response_size_bytes
是一個histogram類型的指標卧惜,所以存在三個具體的指標名:
- coredns_dns_response_size_bytes_bucket
- coredns_dns_response_size_bytes_sum
- coredns_dns_response_size_bytes_count
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
proto | 響應傳輸層的協(xié)議,值為:tcp或udp |
le | 響應返回客戶端的數(shù)據(jù)大小夹纫,單位:字節(jié) |
le維度取值范圍:0, 100, 200, 300, 400, 511, 1023, 2047, 4095, 8291, 16000, 32000, 48000, 64000
3.8 - 指標:coredns_dns_response_rcode_count_total
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
rcode | 響應狀態(tài)碼 |
常見的幾個響應狀態(tài)碼咽瓷,如下表:
DNS響應狀態(tài)碼 | 說明 |
---|---|
NOERROR | 查詢請求成功完成 |
FORMERR | 查詢請求格式錯誤 |
SERVFAIL | 服務端處理失敗 |
NXDOMAIN | 請求查詢的域名不存在 |
NOTIMP | 功能未實現(xiàn) |
REFUSED | 服務端拒絕回復該查詢 |
3.8 - coredns_panic_count_total
進程出現(xiàn)中斷的次數(shù),這個比較嚴重舰讹,需判斷是否新加了什么插件導致的茅姜,需要關(guān)注了。
3.9 - 指標:coredns_plugin_enabled
維度名稱 | 維度說明 |
---|---|
server | 通用維度 |
zone | 通用維度 |
name | 啟用插件的名稱 |
當前各個server下的zone開啟了哪些插件功能月匣。
3.10 - 指標:coredns_build_info
維度名稱 | 維度說明 |
---|---|
version | 運行coredns的版本 |
revision | 編譯coredns時的git修訂號 |
goversion | 編譯coredns的go版本 |
記錄coredns編譯時的版本
4 - 關(guān)鍵指標展示
同時制作了一個視圖模版钻洒,可在Grafana官方地址:https://grafana.com/grafana/dashboards/10639 下載奋姿,
以下通過展示幾個promQL查詢語句,示例均以維度server=172.23.243.136:9153素标。
4.1 - 請求時間耗時
示例1: 以維度server,zone,le分組称诗,最近5分鐘內(nèi),平均每秒耗時小于le維度的變化數(shù)量
sort_desc(
avg(
rate(
coredns_dns_request_duration_seconds_bucket{instance="172.23.243.136:9153"}[5m]
)
) by(server,zone,le)
)
示例2:計算示例1結(jié)果90%的范圍小于多少头遭,也就是第90百分位數(shù)
百分位數(shù): 用99個數(shù)值或99個點寓免,將按從小到大順序排列的觀測值劃分為100個等分,則這99個數(shù)值或99個點就稱為百分位數(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:計算示例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 - 服務端處理請求數(shù)
示例1:最近5分鐘內(nèi)剑按,平均每秒處理的請求次數(shù)
sort_desc(
avg(
rate(
coredns_dns_request_count_total{instance="172.23.243.136:9153"}[5m]
)
) by (proto,server,zone)
)
4.4 - 客戶端請求記錄類型
示例1:最近5分鐘內(nè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 - 服務端響應狀態(tài)碼分布
示例1:最近5分鐘艺蝴,平均每秒響應狀態(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 - 服務異常統(tǒng)計
- 出現(xiàn)panic時候猬腰,記錄drop
- 不存在dns question section(向DNS請求的部分)
- 其他原因被拒絕解析的
所以不需要關(guān)注 zone=droped 的數(shù)據(jù),可以通過rcode其他指標反應出來
示例1:響應狀態(tài)碼非正常的處理請求猜敢,平均每秒次數(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: 進程出現(xiàn)panic的次數(shù)
avg(coredns_panic_count_total{instance="172.23.243.136:9153"})
5 - 總結(jié)討論
在配合prometheus的alertmanager組件,根據(jù)以上指標設置告警規(guī)則缩擂,做到及時預警鼠冕。Kubernetes是分布式系統(tǒng),帶來了一定的維護復雜度胯盯,必須有一套完善的監(jiān)控體系去做支撐懈费。
本人關(guān)注云原生生態(tài),今天這里只是針對DNS服務的內(nèi)容博脑,后續(xù)還會有其他相關(guān)的分享憎乙,如有興趣,歡迎關(guān)注我叉趣,對于存在的疑問點泞边,歡迎留言討論。