翻译:如何监控Coredns

Consultant_chyIP属地: 湖北
字数 1,048

K8S集群中的许多问题和终端都是来自Coredns组件,因此学习如何监控CoreDns是很重要的。
想象一下你的前端突然挂了,你随后排查了一下,你发现你的后端因为DNS返回500的报错而没有解析,你很快就发现了这个结论并尽可能快的恢复了你的应用
监控你的Coredns能够让你在你集群挂掉之前有时间解决问题而不是挂了之后再去解决,那样太迟了


image.png

什么是CoreDns?

CoreDns是k8s从v1.12之后推荐的很关键的默认dns组件,每一个pod和service都有一个完全合格的域名(FQDN),如果dns挂了,整个集群 也没了。


image.png

怎么监控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, andprometheus.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添加一个控制面板:


image.png

执行命令:

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,岂不美哉?而且安装也简单,还有告警功能,推荐一用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
1人点赞
Consultant_chy努力,奋斗
总资产0共写了9274字获得6个赞共5个粉丝

推荐阅读更多精彩内容