tencent cloud

文档反馈

通过 YAML 配置日志采集

最后更新时间:2022-04-21 18:16:02

    本文介绍通过 YAML 方式使用 CRD 配置 EKS 集群的日志采集功能。

    前提条件

    登录 弹性容器服务控制台,并为弹性集群开启日志采集功能。操作详情请参见 开启日志采集

    创建 CRD

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

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig                          ## 默认值
    metadata:
     name: test                                ## CRD资源名,在集群内唯一
    spec:
     clsDetail:
       # 注意:topic指定后不允许修改
       # 自动创建日志主题,需要同时指定日志集和主题的name
       logsetName: test                        ## CLS日志集的name,若无该name的日志集,会自动创建,若有,会在该日志集下创建日志主题
       topicName: test                         ## CLS日志主题的name,若无该name的日志主题,会自动创建
        
       # 选择已有日志主题
       topicId: xxxxxx-xx-xx-xx-xxxxxxxx       ## CLS日志主题的ID,日志主题需要在CLS中提前创建,且没有被其它采集配置占用
       logType: minimalist_log                 ## 日志采集格式,json_log代表 json 格式,delimiter_log代表分隔符格式,minimalist_log代表单行全文格式,multiline_log代表多行全文格式,fullregex_log代表单行-完全正则格式,multiline_fullregex_log代表多行-完全正则格式
       extractRule:                            ## 提取、过滤规则
          ...
     inputDetail:
       type: container_stdout                  ## 采集日志的类型,包括container_stdout(容器标准输出)、container_file(容器文件)、host_file(主机文件)
       
       containerStdout:                        ## 容器标准输出
         namespace: default                    ## 采集容器的kubernetes命名空间,如果不指定,代表所有命名空间
         allContainers: false                  ## 是否采集指定命名空间中的所有容器的标准输出
         container: xxx                        ## 采集日志的容器名,为空时,代表采集所有符合容器的日志名
         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                ## 日志文件名,支持通配符 * 和 ? ,* 表示匹配多个任意字符,? 表示匹配单个任意字符
          
    
    注意

    如果选择采集类型为“容器文件路径”时,对应的“容器文件路径”不能为软链接,否则会导致软链接的实际路径在采集器的容器内不存在,采集日志失败。

    日志解析格式

    单行全文日志是指一行日志内容为一条完整的日志。日志服务在采集的时候,将使用换行符 \n 来作为一条日志日志的结束符。为了统一结构化管理,每条日志都会存在一个默认的键值 __CONTENT__,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。详情请参见 单行文本格式

    假设一条日志原始数据为:

    Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
    

    LogConfig 配置参考示例如下:
    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      clsDetail:
        topicId: xxxxxx-xx-xx-xx-xxxxxxxx
        # 单行日志
        logType: minimalist_log
    

    采集到日志服务的数据为:
    __CONTENT__:Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
    

    采集日志的类型

    容器标准输出

    示例1:采集 default 命名空间中的所有容器的标准输出

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      inputDetail:
        type: container_stdout
        containerStdout:
          namespace: default
          allContainers: true
    ...
    

    示例2:采集 production 命名空间中属于 ingress-gateway deployment 的 pod 中的容器的标准输出

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      inputDetail:
        type: container_stdout
        containerStdout:
          allContainers: false
          workloads:
          - namespace: production
            name: ingress-gateway
            kind: deployment
     ...
    

    示例3:采集 production 命名空间下 pod 标签中包含 “k8s-app=nginx” 的 pod 中的容器的标准输出

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      inputDetail:
        type: container_stdout
        containerStdout:
          namespace: production
          allContainers: false
          includeLabels:
            k8s-app: nginx
     ...
    

    容器文件

    示例1:采集 production 命名空间下属于 ingress-gateway deployment 的 pod 中的 nginx 容器中 /data/nginx/log/ 路径下名为 access.log 的文件

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      topicId: xxxxxx-xx-xx-xx-xxxxxxxx
      inputDetail:
        type: container_file
        containerFile:
          namespace: production
          workload:
            name: ingress-gateway
            type: deployment
          container: nginx
          logPath: /data/nginx/log
          filePattern: access.log
     ...
    

    示例2:采集 production 命名空间下 pod 标签包含 “k8s-app=ingress-gateway” 的 pod 中的 nginx 容器中 /data/nginx/log/ 路径下名为 access.log 的文件

    apiVersion: cls.cloud.tencent.com/v1
    kind: LogConfig
    spec:
      inputDetail:
        type: container_file
        containerFile:
          namespace: production
          includeLabels:
            k8s-app: ingress-gateway
          container: nginx
          logPath: /data/nginx/log
          filePattern: access.log
     ...
    

    元数据(Metadata)

    容器标准输出(container_stdout)以及容器文件(container_file),除原始的日志内容外,还需携带容器场景的元数据(例如产生日志的容器 ID)一起上报至日志服务。方便用户查看日志时追溯来源或根据容器标识、特征(例如容器名及 labels)进行检索。

    元数据如下表:

    字段名 含义
    cluster_id 日志所属的集群 ID。
    container_name 日志所属的容器名称。
    image_name 日志所属容器的镜像名称 IP。
    namespace 日志所属 pod 的 namespace。
    pod_uid 日志所属 pod 的 UID。
    pod_name 日志所属 pod 的名字。
    pod_ip 日志所属 pod 的IP。
    pod_lable_{label name} 日志所属 pod 的 label(例如一个 pod 带有两个 label:app=nginx,env=prod, 则在上传的日志会附带两个 metedata:pod_label_app:nginx,pod_label_env:prod)。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持