K8S集群中的许多问题和终端都是来自Coredns组件,因此学习如何监控CoreDns是很重要的。
想象一下你的前端突然挂了,你随后排查了一下,你发现你的后端因为DNS返回500的报错而没有解析,你很快就发现了这个结论并尽可能快的恢复了你的应用
监控你的Coredns能够让你在你集群挂掉之前有时间解决问题而不是挂了之后再去解决,那样太迟了
什么是CoreDns?
CoreDns是k8s从v1.12之后推荐的很关键的默认dns组件,每一个pod和service都有一个完全合格的域名(FQDN),如果dns挂了,整个集群 也没了。
怎么监控CoreDns
我们通常将CoreDns运行在master节点上,但是我们也可以将它运行在没有k8s集群环境的裸机上比如docker。
从CoreDns获取指标信息
CoreDns和k8s面板一样是一个组件暴露了9153端口可以让prom获取监控指标。监控指标提供了关于dns服务和里面插件的请求信息。基于集群规模,副本可以是一个或者多个,我们可以收集每一个CoreDns的信息。
我们从endpoint获取指标信息
curl localhost:9153/metrics
它将返回带有此结构的一长列指标(被截断):
# 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监视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_(.+)
监视coreDNS:看什么指标?
注意:CoreDns监控指标在不同的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/,请求延迟是一个很重要的指标去发现任何恶化的服务。为了检查这个,我们应该经常拿百分位数和平均值比较,在prom中执行此操作的方法是使用运算符直方图。
histogram_quantile(0.99, sum(rate(coredns_dns_request_duration_seconds_bucket{job="kube-dns"}[5m])) by(server, zone, le))
错误率:错误率是一个非常重要的监控指标。尽管错误不一定都是dns引起,但它是我们必须仔细观察的指标。coredns_dns_responses_total是一个CoreDns出错时紧密联系的重要指标。比如,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中监控CoreDns指标
类似于我们监控etcd https://sysdig.com/blog/monitor-etcd/,默认情况下不对coreDNS的pod进行注释。为了让Sysdig客户端获得CoreDns指标,我们得对其进行注释
想偷懒,可以按照https://promcat.io/apps/kubernetes-control-plane 中给出的步骤进行监视,以监控整个控制平面,并仅使用所需指标将Prom服务器联合起来,丢弃其他的一切。
如果你有helm了那就都简单了,如果没有,那就去官网下一个 https://helm.sh/docs/intro/install/ 然后去github上找一个https://github.com/roboll/helmfile,然后直接用helm部署一套prom配置一套正确的规则。包含一些文件如:helmfile.yaml,
recording_rules.yaml,
prometheus.yaml, and
prometheus.yml.gotmpl.
也可以执行这行命令
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添加一个控制面板:
执行命令:
docker run -it --rm \
sysdiglabs/promcat-connect:0.1 \
install \
kubernetes-control-plane:1.18.0\
-t YOUR-API-TOKEN
总结
CoreDns在K8S集群中经常出问题,如果DNS挂了,很多服务都无法使用应用也挂了。监控Coredns能帮我们解决很多问题省去麻烦
用Sysdig监控Coredns是比较简单的,只用一个工具就监控CoreDns和K8S,岂不美哉?而且安装也简单,还有告警功能,推荐一用。