关于运维:Kubernetes-集群中日志采集的几种玩法

4次阅读

共计 8432 个字符,预计需要花费 22 分钟才能阅读完成。

简介
对于企业的利用零碎来说,日志的位置十分重要,特地是在 Kubernetes 环境,日志采集就更简单,因而 DataKit 对日志采集提供了十分强劲的反对,反对多种环境、多种技术栈。接下来就对 DataKit 日志采集的应用形式做具体阐明。

前置条件
登录 观测云,【集成】->【Datakit】->【Kubernetes】,请依照指引在 Kubernetes 集群中装置 DataKit,其中部署应用的 datakit.yaml 文件,在接下来的操作中会应用到。

DataKit 高级配置
1 设置日志级别
DataKit 默认日志级别是 Info,如果须要把日志级别调整为 Debug,请在 datakit.yaml 中减少环境变量。– name: ENV_LOG_LEVEL

      value: debug

2 设置日志输入形式 DataKit 默认会把日志输入到 /var/log/datakit/gin.log 和 /var/log/datakit/log,如果不想在容器中生成日志文件,请在 datakit.yaml 中减少环境变量。– name: ENV_LOG

  value: stdout
- name: ENV_GIN_LOG
  value: stdout     

DataKit 产生的日志能够通过 kubectl 命令加 POD 名称查看日志。kubectl logs datakit-2fnrz -n datakit #
『留神』:ENV_LOG_LEVEL 设置成 debug 后,会产生大量日志,此时不倡议再把 ENV_LOG 设置成 stdout。日志采集 1 stdout 采集 1.1 stdout 日志全采集 DataKit 能够采集输入到 stdout 的容器日志,应用 datakit.yaml 部署 DataKit 后默认曾经开启了 container 采集器。– name: ENV_DEFAULT_ENABLED_INPUTS

      value: cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container

此时会在 DataKit 容器中生成 /usr/local/datakit/conf.d/container/container.conf 配置文件,默认配置是采集除了 pubrepo.jiagouyun.com/datakit/logfwd 结尾的镜像外的所有 stdout 日志。container_include_log = [] # 相当于 image:*
container_exclude_log = [“image:pubrepo.jiagouyun.com/datakit/logfwd*”]
1.2 自定义 stdout 日志采集为了更好的辨别日志起源,减少 tag 及 指定日志切割 pipeline 文件,这是就须要应用自定义形式了。即在部署的 yaml 文件中减少 annotations。apiVersion: apps/v1
kind: Deployment
metadata:
name: log-demo-service
labels:

app: log-demo-service

spec:
replicas: 1
selector:

matchLabels:
  app: log-demo-service

template:

metadata:
  labels:
    app: log-demo-service
  annotations:
    # 减少如下局部
    datakit/logs: |
      [
        {
          "source": "pod-logging-testing-demo",
          "service": "pod-logging-testing-demo",
          "pipeline": "pod-logging-demo.p",
          "multiline_match": "^\\d{4}-\\d{2}-\\d{2}"
        }
      ]

Annotations 参数阐明 source: 数据起源 service: tag 标记 pipeline: pipeline 脚本名 ignore_status:multiline_match: 正则表达式匹配一行日志,如示例中以日期 (比方 2021-11-26) 开始的为一行日志,上行中如果不是此日期开始则认为此行日志是上条日志一部分 remove_ansi_escape_codes: 是否删除 ANSI 本义码,例如规范输入的文本色彩等 1.3 不采集容器的 stdout 日志开启了容器采集器,会主动采集容器输入到 stdout 的日志,对于不想采集的日志,有以下几种形式。1.3.1 敞开 POD 的 stdout 日志采集在部署利用的 yaml 文件中减少 annotations,把 disable 设置成 true。apiVersion: apps/v1
kind: Deployment
metadata:

spec:

template:

metadata:      
  annotations:
    ## 减少上面内容
    datakit/logs: |
      [
        {"disable": true}
      ]

1.3.2 规范输入重定向如果开启了 stdout 日志收集,容器的日志也输入到 stdout,两者都不想做批改的状况下,能够批改启动命令,让规范输入重定向。java ${JAVA_OPTS} -jar ${jar} ${PARAMS} 2>&1 > /dev/null
1.3.3 container 采集器的过滤性能如果想更不便的管制 stdout 日志的采集,倡议重写 container.conf 文件,即应用 ConfigMap 定义 container.conf,批改 container_include_log 和 container_exclude_log 的值,再挂载到 datakit 中。在 datakit.yaml 批改如下:—
apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:

#### container
container.conf: |-  
  [inputs.container]
    docker_endpoint = "unix:///var/run/docker.sock"
    containerd_address = "/var/run/containerd/containerd.sock"

    enable_container_metric = true
    enable_k8s_metric = true
    enable_pod_metric = true

    ## Containers logs to include and exclude, default collect all containers. Globs accepted.
    container_include_log = []
    container_exclude_log = ["image:pubrepo.jiagouyun.com/datakit/logfwd*", "image:pubrepo.jiagouyun.com/datakit/datakit*"]

    exclude_pause_container = true

    ## Removes ANSI escape codes from text strings
    logging_remove_ansi_escape_codes = false

    kubernetes_url = "https://kubernetes.default:443"

    ## Authorization level:
    ##   bearer_token -> bearer_token_string -> TLS
    ## Use bearer token for authorization. ('bearer_token' takes priority)
    ## linux at:   /run/secrets/kubernetes.io/serviceaccount/token
    ## windows at: C:\var\run\secrets\kubernetes.io\serviceaccount\token
    bearer_token = "/run/secrets/kubernetes.io/serviceaccount/token"
    # bearer_token_string = "<your-token-string>"

    [inputs.container.tags]
      # some_tag = "some_value"
      # more_tag = "some_other_value"
    volumeMounts:
    - mountPath: /usr/local/datakit/conf.d/container/container.conf
      name: datakit-conf
      subPath: container.conf

container_include 和 container_exclude 必须以 image 结尾,格局为 “image:<glob 规定 >”,示意 glob 规定是针对容器 image 失效 Glob 规定是一种轻量级的正则表达式,反对 ? 等根本匹配单元比方只想采集镜像名蕴含 log-order,且镜像名不蕴含 log-pay,能够做如下配置。container_include_log = [“image:log-order*”]

    container_exclude_log = ["image:*log-pay*"]

『留神』:如果某一 POD 开启了采集 stdout 日志,请不要在应用 logfwd 或者 socket 日志采集,否则日志会被反复收集。2 logfwd 采集这是一种应用 Sidecar 模式的日志采集形式,即利用同一个 POD 内的容器共享存储,让 logfwd 以 Sidecar 的模式读取业务容器的日志文件,而后发送给 DataKit。具体应用,请参考 Pod 日志采集最佳实际 计划二。3 socket 采集 DataKit 开明 Socket 端口比方 9542,日志会被推送到这个端口,Java 的 log4j、logback 反对日志推送。上面以 SpringBoot 集成 Logback 为例来实现 socket 日志采集。3.1 增加 Appender 在 logback-spring.xml 文件中减少 socket Appender。<?xml version=”1.0″ encoding=”UTF-8″?>

<configuration scan=”true” scanPeriod=”60 seconds” debug=”false”>

<springProperty scope="context" name="dkSocketHost" source="datakit.socket.host" />
<springProperty scope="context" name="dkSocketPort" source="datakit.socket.port" />
<contextName>logback</contextName>

<!-- 日志根目录 -->
<property name="log.path" value="./logs"/>
<!-- 日志输入格局 -->
<property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] -  - %msg%n" />

<!-- 打印日志到控制台 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>${log.pattern}</pattern>
    </encoder>
</appender>
... 
<!-- 上面是减少的 Socket appender--> 
<appender name="socket" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!-- datakit host: logsocket_port -->
    <destination>${dkSocketHost}:${dkSocketPort}</destination>
    <!-- 日志输入编码 -->
    <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
        <providers>
            <timestamp>
                <timeZone>UTC+8</timeZone>
            </timestamp>
            <pattern>
                <pattern>
                    {
                    "severity": "%level",
                    "appName": "${logName:-}",
                    "trace": "%X{dd.trace_id:-}",
                    "span": "%X{dd.span_id:-}",
                    "pid": "${PID:-}",
                    "thread": "%thread",
                    "class": "%logger{40}",
                    "msg": "%message\n%exception"
                    }
                </pattern>
            </pattern>
        </providers>
    </encoder>
</appender>
<root level="INFO">
    <appender-ref ref="Console"/>
    <appender-ref ref="file_info"/>
    <appender-ref ref="socket" />
</root>

</configuration>
3.2 减少配置在 SpringBoot 我的项目的 application.yml 文件中减少配置。datakit:
socket:

host: 120.26.218.200  # 
port: 9542

3.3 增加依赖在 SpringBoot 我的项目的 pom.xml 中增加依赖。<dependency>

<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.9</version>

</dependency>
3.4 DataKit 减少 logging-socket.conf 文件在 DataKit 的 datakit.yaml 文件中 volumeMounts: # 此地位减少上面三行

    - mountPath: /usr/local/datakit/conf.d/log/logging-socket.conf
      name: datakit-conf
      subPath: logging-socket.conf
      

apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:

logging-socket.conf: |-
  [[inputs.logging]]
    # only two protocols are supported:TCP and UDP
    sockets = [
      "tcp://0.0.0.0:9542",
    #"udp://0.0.0.0:9531",                  
    ]
    ignore = [""]
    source = "demo-socket-service"
    service = ""pipeline =""
    ignore_status = []
    character_encoding = ""# multiline_match ='''^\S'''
    remove_ansi_escape_codes = false

    [inputs.logging.tags]
    # some_tag = "some_value"
    # more_tag = "some_other_value"

对于 Socket 日志采集的更多内容,请参考 logback socket 日志采集最佳实际。4 日志文件采集 Linux 主机装置的 DataKit 采集该主机上的日志的形式是复制 logging.conf 文件,而后再批改 logging.conf 文件中的 logfiles 的值为日志的绝对路径。cd /usr/local/datakit/conf.d/log
cp logging.conf.sample logging.conf
在 Kubernetes 环境下,须要先把的 Pod 生成的日志目录 /data/app/logs/demo-system 挂载到宿主机上 /var/log/k8s/demo-system,再应用 Daemonset 部署 DataKit,挂载 /var/log/k8s/demo-system 目录,这样 datakit 就能采集到宿主机上的 /rootfs/var/log/k8s/demo-system/info.log 日志文件。volumeMounts:

    - name: app-log
      mountPath: /data/app/logs/demo-system
      
  ...

  volumes:   
  - name: app-log
    hostPath:
      path: /var/log/k8s/demo-system
    volumeMounts:  # 此地位减少上面三行
    - mountPath: /usr/local/datakit/conf.d/log/logging.conf
      name: datakit-conf
      subPath: logging.conf
      

apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:

#### logging
logging.conf: |-
    [[inputs.logging]]
      ## required
      logfiles = ["/rootfs/var/log/k8s/demo-system/info.log",]

      ## glob filteer
      ignore = [""]

      ## your logging source, if it's empty, use'default'source ="k8s-demo-system-log"## add service tag, if it's empty, use $source.
      #service = "k8s-demo-system-log"

      ## grok pipeline script path
      pipeline = ""
      ## optional status:
      ##   "emerg","alert","critical","error","warning","info","debug","OK"
      ignore_status = []

      ## optional encodings:
      ##    "utf-8", "utf-16le", "utf-16le", "gbk", "gb18030" or ""character_encoding =""

      ## The pattern should be a regexp. Note the use of '''this regexp'''
      ## regexp link: https://golang.org/pkg/regexp/syntax/#hdr-Syntax
      multiline_match = '''^\d{4}-\d{2}-\d{2}'''

      [inputs.logging.tags]
      # some_tag = "some_value"
      # more_tag = "some_other_value" 

『留神』:既然应用观测云收集日志,日志曾经被长久化了,没必要再把日志落盘到宿主机,所以 Kubernetes 环境下不倡议应用这种采集形式。PipelinePipeline 次要用于切割非结构化的文本数据,或者用于从结构化的文本中(如 JSON)提取局部信息。对日志来说次要是提取日志产生工夫、日志级别等信息。这里特地阐明 Socket 采集到的日志是 JSON 格局,须要切割后能力在搜寻框按关键字搜寻。Pipeline 应用详情,请参阅上面的文章。Pod 日志采集最佳实际 logback socket 日志采集最佳实际 Kubernetes 利用的 RUM-APM-LOG 联动剖析异样检测当日志出现异常,对利用影响很大的时候,应用观测云的日志异样检测性能,并配置告警,能及时把异样告诉到观测对象,观测云的告警反对邮箱、钉钉、短信、企业微信、飞书等告诉形式。上面以邮箱为例介绍一下告警。1 创立告诉对象登录 观测云,【治理】->【告诉对象治理】->【新建告诉对象】,抉择邮件组,输出名称和邮件地址。

2 新建监控器点击【监控】->【新建监控器】->【日志监测】。

输出规定名称,检测指标 log_fwd_demo 是采集日志时候配置的 source,前面的 error 是日志蕴含的内容,host_ip 是日志的标签,在事件内容能够应用 {{host_ip}} 把具体标签的值输入。触发条件填 1,题目和内容会以邮件的形式发送。填完后点击【保留】。

3 配置告警在【监控器】界面,点击方才创立的监控器,点击【告警配置】。

告警告诉对象抉择第一步中创立的邮件组,抉择告警缄默工夫,点击【确定】。

4 触发告警利用触发 error 日志,这时会收到告诉邮件。

正文完
 0