Kubernetes運(yùn)維,讀懂這6個(gè)關(guān)鍵指標(biāo),保證DNS服務(wù)的穩(wěn)定

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),歡迎留言討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容