分析和监控CoreDNS日志

阿里云容器服务ACK部署了CoreDNS作为集群内的DNS服务器,您可以通过查看CoreDNS日志来分析CoreDNS解析慢、访问高危请求域名等问题。本文介绍如何开启CoreDNS日志分析与监控能力。

前提条件

  • 已安装日志组件logtail-ds。

    在创建集群时,ACK默认选中日志组件logtail-ds。如果您未安装日志组件logtail-ds,关于如何手动安装的操作,请参见通过日志服务采集Kubernetes容器日志

  • 确保日志应用alibaba-log-controller版本不低于0.2.0.0-76648ee-aliyun。logcontroller

    如果alibaba-log-controller版本低,可直接升级logtail-ds组件。关于如何升级组件,请参见管理组件

步骤一:开启CoreDNS日志插件

注意事项

  • 开启前,请确保CoreDNS组件为最新版本。升级具体操作,请参见管理组件

  • 全新部署的CoreDNS默认开启log插件,如已开启请忽略本步骤。

操作步骤

说明

开启CoreDNS日志会消耗额外的CPU(约10%,与实际请求有关)及网络流量。如果当前已经部署的CoreDNS副本CPU使用量较高,您可以对CoreDNS进行扩容。关于如何扩容CoreDNS副本数,请参见手动伸缩容器组

在命名空间kube-system下,ACK集群有一个coredns配置项。您可以通过在coredns配置项中的Corefile字段中加上log插件,开启CoreDNS域名解析的日志。关于如何修改配置项的具体步骤,请参见修改配置项

默认日志格式的coredns的配置如下。

Corefile: |
    .:53 {
        errors
        log # 此处添加Log插件。
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          upstream
          fallthrough in-addr.arpa ip6.arpa
          ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }
    # 如果有其它的域,且该域容器需要被采集日志,也需要增加Log插件,格式一致。
    demo.com:53 {
        ... 
        log # 此处添加Log插件。
    }

步骤二:开启CoreDNS日志服务

方式一:通过ACK控制台开启

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 日志中心

  3. 日志中心页面,单击网络组件日志页签,然后单击开始安装

    控制台会自动安装相关组件,开启CoreDNS日志服务。

方式二:通过命令行开启

日志采集配置针对ACK进行了自定义资源CRD扩展,您可以直接部署AliyunLogConfig的CRD配置,Log Controller会自动创建日志服务相关采集配置和报表资源。关于如何创建自定义资源AliyunLogConfig的具体步骤,请参见管理自定义资源

    重要

    下述配置只针对默认CoreDNS中的日志格式生效。如果您自定义了CoreDNS的日志格式,请修改上述CRD配置中的正则表达式Regex部分。

    关于自定义CoreDNS的日志格式的更多信息,请参见log

    关于更详细的日志采集流程及采集配置,请参见通过DaemonSet-CRD方式采集容器日志

  1. 创建YAML文件k8s-coredns-log.yaml,YAML文件完整样例如下。

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      #     Your config name, must be unique in you k8s cluster.
      name: k8s-coredns-log
      namespace: kube-system
    spec:
      # logstore name to upload log
      logstore: coredns-log
      # logtail config detail
      productCode: k8s-coredns
      logtailConfig:
        inputType: plugin
        # logtail config name, should be same with [metadata.name]
        configName: k8s-coredns-log
        inputDetail:
          plugin:
            inputs:
            - type: service_docker_stdout
              detail:
                IncludeLabel:
                  io.kubernetes.container.name: coredns
                Stderr: true
                Stdout: true
            processors:
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - level
                - remote
                - port
                - id
                - type
                - class
                - name
                - proto
                - size
                - do
                - bufsize
                - rcode
                - rflags
                - rsize
                - duration
                NoKeyError: true
                NoMatchError: false
                FullMatch: false
                Regex: \[([^]]+)]\s([^:]+):(\S+)\s+-\s+(\S+)\s+"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+([^"]+)"\s+(\S+)\s+(\S+)\s+(\S+)\s+([\d\.]+).*
                SourceKey: content
            - type: processor_regex
              detail:
                KeepSource: false
                KeepSourceIfParseError: true
                Keys:
                - error
                - rcode
                - name
                - type
                - errorMsg
                NoKeyError: false
                NoMatchError: false
                FullMatch: false
                Regex: \[ERROR]\s+(plugin/errors):\s+(\S)+\s+(\S+)\s+([^:]*):\s+(.*)
                SourceKey: content
  2. 执行以下命令,开启CoreDNS日志服务。

    kubectl apply -f k8s-coredns-log.yaml

关于如何配置存储、网络、弹性伸缩等资源的AliyunLogConfig的CRD,请参见步骤一:创建系统插件的日志配置文件

步骤三:查询和分析日志(日志库)

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 日志中心

  3. 日志中心页面,单击网络组件日志页签,然后在CoreDNS页签下单击日志库,即可查询和分析DNS日志。

  4. 在输入框中输入查询和分析语句,然后单击1周(相对),设置查询的时间范围。

  5. 单击查询/分析,查看查询分析结果。

    日志服务为您提供日志分布直方图、原始日志和统计图表形式的展示查询分析结果。关于查询和分析日志的详细信息,请参见查询和分析日志

    • 日志直方图

      日志分布直方图主要展示查询到的日志在时间上的分布。

      image..png

    • 原始日志

      原始日志页签中展示当前查询结果,您可单击表格原始查看日志,通过分析日志来确认当前域名解析是否存在异常。请重点关注返回码RCODE的值,关于RCODE的释义,请参见 DNS解析异常问题排查

      image..png

      各个字段含义如下所示。

      字段

      含义

      示例值

      {level}

      日志级别

      INFO

      {remote}

      客户端IP地址

      172.16.0.10

      {port}

      客户端端口

      58008

      {id}

      查询ID

      34518

      {type}

      请求类型

      A

      {class}

      请求类别

      IN

      {name}

      请求域名的名称

      kube-dns.kube-system.svc.cluster.local.

      {proto}

      使用的协议

      tcp

      {size}

      请求大小(字节)

      56

      {do}

      查询中是否设置了EDNS0 DO(DNSSEC OK)位

      false

      {bufsize}

      在查询中定义的EDNS0缓冲区大小(字节)

      65535

      {rcode}

      响应代码

      NOERROR

      {rflags}

      响应标志位,设置的每个标志位都会显示

      qr,aa,rd

      {rsize}

      未压缩的响应大小(字节)

      110

      {duration}

      响应时间(秒)

      0.00011

    • 统计图表

      执行查询分析语句后,您可以在统计图表页签中查看可视化的查询分析结果。

    • 日志聚类

      日志聚类页签中,单击开启日志聚类,可实现在采集日志时将相似度高的日志聚合。更多信息,请参见日志聚类

步骤四:查看CoreDNS日志采集(仪表盘)

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 日志中心

  3. 日志中心页面,单击网络组件日志页签,然后在CoreDNS页签下单击仪表盘,即可查看Kubernetes CoreDNS日志分析

    Kubernetes CoreDNS日志分析页面,您可以查看CoreDNS请求数、请求成功率和请求延迟等聚合信息,同时提供了各类Top域名请求列表、错误域名列表、慢解析域名列表和高危请求域名访问分析。coredns log

步骤五:创建CoreDNS日志告警

Kubernetes CoreDNS日志分析仪表盘页面中,您可以根据仪表盘中单个图表进行告警设置。此操作仅支持在日志服务控制台上进行操作。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

  3. 集群信息页面,单击基本信息页签,然后单击日志服务Project右侧的链接跳转至日志服务控制台。

  4. 在日志库页面左侧导航栏,单击仪表盘仪表盘图标,然后单击在仪表盘列表中找到并单击Kubernetes CoreDNS日志分析

  5. Kubernetes CoreDNS日志分析页面的目标图表卡片右上方,选择more > 另存为告警

    关于告警配置的参数设置,请参见创建日志告警监控规则alert

    创建完成告警规则后,您可以查看、修改告警规则,关闭告警规则等。更多信息,请参见告警监控规则相关操作

相关操作

关闭日志采集

如果您不再需要CoreDNS日志采集,执行以下命令,可以通过卸载日志采集自定义资源的方式停止采集。

kubectl -n kube-system delete AliyunLogConfig k8s-coredns-log

删除成功后,CoreDNS输出的日志将不再上报到日志服务SLS中。