网络知识 娱乐 通过DaemonSet-CRD方式采集TKE日志

通过DaemonSet-CRD方式采集TKE日志

在TKE中LogListener是以DaemonSet模式运行,可通过CRD方式创建采集配置采集TKE集群日志。本文介绍如何通过CRD方式创建采集配置。

前提条件

需要开启日志采集功能,详情请参考开启日志采集

创建采集配置

您只需要定义 LogConfig CRD 即可创建采集配置,LogListener 根据 LogConfig CRD 的变化修改相应的日志服务 CLS 日志主题,并设置绑定的机器组。CRD 的格式如下:

apiVersion: cls.cloud.tencent.com/v1
   kind: LogConfig                          ## 默认值
metadata:
  name: test                                ## CRD资源名,在集群内唯一
spec:
  clsDetail:
    topicId: xxxxxx-xx-xx-xx-xxxxxxxx       ## CLS日志主题的ID,日志主题需要在CLS中提前创建,且没有被其它采集配置占用
    logType: minimalist_log                 ## 日志采集格式,json_log代表 json 格式,delimiter_log代表分隔符格式,minimalist_log代表单行全文格式,multiline_log代表多行全文格式,fullregex_log代表完全正则格式
    extractRule:                            ## 提取、过滤规则
      ...
  inputDetail:
    type: container_stdout                  ## 采集日志的类型,包括container_stdout(容器标准输出)、container_file(容器文件)、host_file(主机文件)

    containerStdout:                        ## 容器标准输出
      namespace: default                    ## 采集容器的kubernetes命名空间,如果不指定,代表所有命名空间
      allContainers: false                  ## 是否采集指定命名空间中的所有容器的标准输出
      container: xxx                        ## 满足includeLabels的Pod中的容器名,只有在指定includeLabels时使用
     includeLabels:                         ## 采集包含指定label的Pod
        k8s-app: xxx                        ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workloads、allContainers=true不能同时指定
      workloads:                            ## 要采集的容器的Pod所属的kubernetes workload
      - namespace: prod                     ## workload的命名空间
        name: sample-app                    ## workload的名字
        kind: deployment                    ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
        container: xxx                      ## 要采集的容器名,如果不指定,代表workload Pod中的所有容器

    containerFile:                          ## 容器内文件
      namespace: default                    ## 采集容器的kubernetes命名空间
      container: xxx                        ## 采集容器名
     includeLabels:                         ## 采集包含指定label的Pod
        k8s-app: xxx                        ## 只采pod标签中配置"k8s-app=xxx"的pod产生的日志,与workload不能同时指定
      workload:                             ## 要采集的容器的Pod所属的kubernetes workload
        name: sample-app                    ## workload的名字                  
        kind: deployment                    ## workload类型,支持deployment、daemonset、statefulset、job、cronjob
      logPath: /opt/logs                    ## 日志文件夹,不支持通配符
      filePattern: app_*.log                ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符

    hostFile:                               ## 主机文件
      logPath: /opt/logs                    ## 日志文件夹,支持通配符
      filePattern: app_*.log                ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符
      customLablels
        k1: v1

查看采集配置

  • 查看所有采集配置
[root@VM-1-24-centos ~]# kubectl get logconfigs
NAME            AGE
cls-delimiter   48m
stdout-lgs      4h21m
www-nginx       75m

  • 查看采集配置的详细信息和状态
  1. 其中stdout-lgs 为配置的名称,可以根据实际情况进行替换;
  2. status字段值为Synced表示应用配置成功,否则表示应用配置失败。
[root@VM-1-24-centos ~]# kubectl get logconfigs stdout-lgs -o yaml
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
  creationTimestamp: "2021-04-07T09:33:42Z"
  generation: 2
  managedFields:
  - apiVersion: cls.cloud.tencent.com/v1
  ......
  name: stdout-lgs
spec:
  clsDetail:
    extractRule:
      beginningRegex: (S+)s-[^-]+(S+)s[([^]]+)]s"(w+)s(S+)s([^"]+)"s(d+)s(d+)s(S+)[^-]+([^"]+)"s"([^"]+)[^-]+([^"]+)"s"([^"]+).*
      keys:
      - client_ip
      - remote_user
      - request_time
      - request_method
      - request_url
      - http_protocol
      - status_code
      - body_bytes_sent
      - handle_time
      - http_referer
      - http_user_agent
      - real_ip
      - log_time
      logRegex: (S+)s-[^-]+(S+)s[([^]]+)]s"(w+)s(S+)s([^"]+)"s(d+)s(d+)s(S+)[^-]+([^"]+)"s"([^"]+)[^-]+([^"]+)"s"([^"]+).*
    logType: fullregex_log
    topicId: 4511efaa-2cad-4c3c-8c7c-d3bb5a58d903
  inputDetail:
    containerStdout:
      includeLabels:
        k8s-app: tke-cls-nginx-std
      namespace: cls-wk
    type: container_stdout
status:
  status: Synced
  

采集示例

标准输出

  • 采集一个namespace是cls-wk,标签是tke-cls-nginx的所有容器的标准输出的配置
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
    # 配置名称,集群唯一
    name: test123
spec:
    # 消费端配置
   clsDetail:
       # 消费的topic id
       topicId: 4224b4f3-9ee8-46e3-822a-xxxxxxxxx
       # 提取模式
       logType: minimalist_log
   inputDetail:
       # 采集类型
       type: container_stdout
       containerStdout:
           # 所属namespace
           namespace: cls-wk
           # 对应容器的标签
           includeLabels:
               k8s-app: tke-cls-nginx

  • 正则表达提取模式
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
    # 配置名称,集群唯一
    name: stdout-lgs
spec:
    clsDetail:
        extractRule:
            beginningRegex: (S+)s-[^-]+(S+)s[([^]]+)]s"(w+)s(S+)s([^"]+)"s(d+)s(d+)s(S+)[^-]+([^"]+)"s"([^"]+)[^-]+([^"]+)"s"([^"]+).*
            # 提起的键值
            keys:
            - client_ip
            - remote_user
            - request_time
            - request_method
            - request_url
            - http_protocol
            - status_code
            - body_bytes_sent
            - handle_time
            - http_referer
            - http_user_agent
            - real_ip
            - log_time
            # 正则表达式,会根据()捕获组提取对应的value
            logRegex: (S+)s-[^-]+(S+)s[([^]]+)]s"(w+)s(S+)s([^"]+)"s(d+)s(d+)s(S+)[^-]+([^"]+)"s"([^"]+)[^-]+([^"]+)"s"([^"]+).*
        # 日志采集格式:完全正则提取模式
        logType: fullregex_log
        topicId: 4511efaa-2cad-4c3c-8c7c-xxxxxxxxx
    inputDetail:
        containerStdout:
            # pod 标签
            includeLabels:
                k8s-app: tke-cls-nginx-std
            namespace: cls-wk
        # 采集类型
        type: container_stdout

应用配置后,日志服务的数据格式如下:

容器文件

  • 采集deployment为nginx-logfile,容器名为nginx-logfile的日志文件,其中日志文件路径为/data/log/nginx,*.log结尾的文件。
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
  # 配置名称,集群唯一
  name: www-nginx
spec:
  clsDetail:
    # 日志采集格式
    logType: minimalist_log
    topicId: 56a32d6f-77da-4c4a-a7d1-xxxxxxxxx
  inputDetail:
    containerFile:
      container: nginx-logfile
      # 文件名,支持通配符*和?
      filePattern: '*.log'
      logPath: /data/log/nginx
      namespace: cls-wk
      workload:
        kind: deployment
        name: nginx-logfile
    # 采集类型为容器文件
    type: container_file
  • 分隔符模式的日志文件
apiVersion: cls.cloud.tencent.com/v1
kind: LogConfig
metadata:
  # 配置名称,集群唯一
  name: cls-delimiter
spec:
  clsDetail:
      # 分隔符
      delimiter: '::'
      # 提取的key
      keys:
      - remote_addr
      - remote_user
      - time_local
      - request
      - status
      - body_bytes_sent
      - request_time
      - http_referer
      - http_user_agent
      - http_x_forwarded_for
      - msec
      # 日志时间使用日志中字段时间
      timeFormat: '%d/%b/%Y %H:%M:%S'
      timeKey: time_local
    # 日志采集格式为分隔符模式
    logType: delimiter_log
    topicId: e850733e-f32b-4a8e-a246-xxxxxxxx
  inputDetail:
    containerFile:
      container: nginxdelimiter
      filePattern: '*.log'
      logPath: /data/log/nginx
      namespace: cls-wk
      workload:
        kind: deployment
        name: nginxdelimiter
    # 采集类型为容器文件
    type: container_file

应用配置后,日志服务的数据格式如下:

更多CLS和TKE日志采集相关请参考如下链接:

CLS日志服务

使用 CRD 配置日志采集

友情提醒:

  • 通过CRD的方式采集配置TKE日志,索引需要在日志控制台打开和相关配置;
  • 建议通过TKE控制台的方式配置,默认全文索引和部分键值索引打开的状态。