K8S集群中的許多問題和終端都是來自Coredns組件局雄,因此學習如何監(jiān)控CoreDns是很重要的存炮。
想象一下你的前端突然掛了,你隨后排查了一下宫盔,你發(fā)現(xiàn)你的后端因為DNS返回500的報錯而沒有解析享完,你很快就發(fā)現(xiàn)了這個結(jié)論并盡可能快的恢復了你的應用
監(jiān)控你的Coredns能夠讓你在你集群掛掉之前有時間解決問題而不是掛了之后再去解決,那樣太遲了
什么是CoreDns彼绷?
CoreDns是k8s從v1.12之后推薦的很關鍵的默認dns組件茴迁,每一個pod和service都有一個完全合格的域名(FQDN),如果dns掛了猜旬,整個集群 也沒了。
怎么監(jiān)控CoreDns
我們通常將CoreDns運行在master節(jié)點上椿争,但是我們也可以將它運行在沒有k8s集群環(huán)境的裸機上比如docker秘遏。
從CoreDns獲取指標信息
CoreDns和k8s面板一樣是一個組件暴露了9153端口可以讓prom獲取監(jiān)控指標嘉竟。監(jiān)控指標提供了關于dns服務和里面插件的請求信息【腧剑基于集群規(guī)模边苹,副本可以是一個或者多個,我們可以收集每一個CoreDns的信息个束。
我們從endpoint獲取指標信息
curl localhost:9153/metrics
它將返回帶有此結(jié)構的一長列指標(被截斷):
# HELP coredns_build_info A metric with a constant '1' value labeled by version, revision, and goversion from which CoreDNS was built.
# TYPE coredns_build_info gauge
coredns_build_info{goversion="go1.14.4",revision="f59c03d",version="1.7.0"} 1
# HELP coredns_cache_entries The number of elements in the cache.
# TYPE coredns_cache_entries gauge
coredns_cache_entries{server="dns://:53",type="denial"} 41
coredns_cache_entries{server="dns://:53",type="success"} 15
# HELP coredns_cache_hits_total The count of cache hits.
# TYPE coredns_cache_hits_total counter
coredns_cache_hits_total{server="dns://:53",type="denial"} 366066
coredns_cache_hits_total{server="dns://:53",type="success"} 135
# HELP coredns_cache_misses_total The count of cache misses.
# TYPE coredns_cache_misses_total counter
coredns_cache_misses_total{server="dns://:53"} 106654
# HELP coredns_dns_request_duration_seconds Histogram of the time (in seconds) each request took.
# TYPE coredns_dns_request_duration_seconds histogram
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.00025"} 189356
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.0005"} 189945
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.001"} 190102
coredns_dns_request_duration_seconds_bucket{server="dns://:53",type="A",zone=".",le="0.002"} 235026
要使用Prometheus監(jiān)視coreDNS茬底,您只需添加相應的job:
- job_name: kube-dns
honor_labels: true
kubernetes_sd_configs:
- role: pod
relabel_configs:
- action: keep
source_labels:
- __meta_kubernetes_namespace
- __meta_kubernetes_pod_name
separator: '/'
regex: 'kube-system/coredns.+'
- source_labels:
- __meta_kubernetes_pod_container_port_name
action: keep
regex: metrics
- source_labels:
- __meta_kubernetes_pod_name
action: replace
target_label: instance
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
監(jiān)視coreDNS:看什么指標阱表?
注意:CoreDns監(jiān)控指標在不同的K8S版本之間可能不同,這里拿k8s 1.18的版本距離最爬,具體信息查看下列鏈接
(https://github.com/kubernetes/kubernetes/releases/tag/v1.18.8) (link for the 1.18.8 version).*
請求延遲:按照https://sysdig.com/blog/golden-signals-kubernetes/,請求延遲是一個很重要的指標去發(fā)現(xiàn)任何惡化的服務烤送。為了檢查這個糠悯,我們應該經(jīng)常拿百分位數(shù)和平均值比較,在prom中執(zhí)行此操作的方法是使用運算符直方圖叶沛。
histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{job="kube-dns"}[5m])) by(server, zone, le))
錯誤率:錯誤率是一個非常重要的監(jiān)控指標忘朝。盡管錯誤不一定都是dns引起,但它是我們必須仔細觀察的指標。coredns_dns_responses_total是一個CoreDns出錯時緊密聯(lián)系的重要指標晦墙。比如肴茄,NXDOMAIN錯誤意味著DNS請求失敗因為域名請求不存在。
# HELP coredns_dns_responses_total Counter of response status codes.
# TYPE coredns_dns_responses_total counter
coredns_dns_responses_total{rcode="NOERROR",server="dns://:53",zone="."} 1336
coredns_dns_responses_total{rcode="NXDOMAIN",server="dns://:53",zone="."} 471519
在Sysdia中監(jiān)控CoreDns指標
類似于我們監(jiān)控etcd https://sysdig.com/blog/monitor-etcd/抗楔,默認情況下不對coreDNS的pod進行注釋拦坠。為了讓Sysdig客戶端獲得CoreDns指標,我們得對其進行注釋
想偷懶贞滨,可以按照https://promcat.io/apps/kubernetes-control-plane 中給出的步驟進行監(jiān)視晓铆,以監(jiān)控整個控制平面,并僅使用所需指標將Prom服務器聯(lián)合起來骄噪,丟棄其他的一切。
如果你有helm了那就都簡單了尾组,如果沒有示弓,那就去官網(wǎng)下一個 https://helm.sh/docs/intro/install/ 然后去github上找一個https://github.com/roboll/helmfile奏属,然后直接用helm部署一套prom配置一套正確的規(guī)則。包含一些文件如:helmfile.yaml,
recording_rules.yaml,
prometheus.yaml, and
prometheus.yml.gotmpl.
也可以執(zhí)行這行命令
helmfile sync
只要你裝好了prom server勇婴,接下來配置sysdig 客戶端嘱腥,直接粘貼復制
apiVersion: v1
kind: ConfigMap
metadata:
name: sysdig-agent
namespace: sysdig-agent
data:
prometheus.yaml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus' # config for federation
honor_labels: true
metrics_path: '/federate'
metric_relabel_configs:
- regex: 'kubernetes_pod_name'
action: labeldrop
params:
'match[]':
- '{sysdig="true"}'
sysdig_sd_configs:
- tags:
namespace: monitoring
然后從promcat添加一個控制面板:
執(zhí)行命令:
docker run -it --rm \
sysdiglabs/promcat-connect:0.1 \
install \
kubernetes-control-plane:1.18.0\
-t YOUR-API-TOKEN
總結(jié)
CoreDns在K8S集群中經(jīng)常出問題齿兔,如果DNS掛了础米,很多服務都無法使用應用也掛了添诉。監(jiān)控Coredns能幫我們解決很多問題省去麻煩
用Sysdig監(jiān)控Coredns是比較簡單的,只用一個工具就監(jiān)控CoreDns和K8S栏赴,豈不美哉?而且安裝也簡單竖瘾,還有告警功能柒爸,推薦一用事扭。