阿里云容器服务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日志会消耗额外的CPU(约10%,与实际请求有关)及网络流量。如果当前已经部署的CoreDNS副本CPU使用量较高,您可以对CoreDNS进行扩容。关于如何扩容CoreDNS副本数,请参见手动伸缩容器组
注意
  • 开启前,请确保CoreDNS组件为最新版本。升级具体操作,请参见管理组件
  • 全新部署的CoreDNS默认开启log插件,如已开启请忽略本步骤。

在命名空间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,请参见步骤一:创建系统插件的日志配置文件

步骤三:查看CoreDNS日志采集

  1. 登录容器服务管理控制台,在左侧导航栏中选择集群
  2. 集群列表页面中,单击目标集群名称,然后在左侧导航栏中,选择运维管理 > 日志中心
  3. 日志中心页面,单击网络组件日志页签,然后单击仪表盘即可查看Kubernetes CoreDNS日志分析
    Kubernetes CoreDNS日志分析页面,您可以查看CoreDNS请求数、请求成功率和请求延迟等聚合信息,同时提供了各类Top域名请求列表、错误域名列表、慢解析域名列表和高危请求域名访问分析。

步骤四:创建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中。