通过CRD方式采集应用日志

容器计算服务 ACS(Container Compute Service)集成了阿里云日志服务SLS。您可在创建集群时启用日志服务,快速采集ACS集群的容器日志,包括容器的标准输出以及容器内的文本文件。本文介绍如何在ACS集群中通过AliyunLogConfig CRD采集容器应用日志。

步骤一:启用日志服务组件

您可以在创建ACS集群时勾选使用日志服务来自动启用日志服务组件。若创建时未勾选,您也可以通过以下步骤为已有集群启用日志服务组件。

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

  2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择运维管理组件管理

  3. 日志与监控区域找到alibaba-log-controller。单击安装,并在安装组件对话框中单击确定

重要

如果您已安装的alibaba-log-controller组件为旧版本,可以对组件进行升级。升级组件后,集群会重置组件参数。如果您曾自定义alibaba-log-controller的配置和环境变量,参数将被覆盖,请重新配置。

步骤二:创建AliyunLogConfig CR日志采集配置

AliyunLogConfig CR支持采集特定应用的标准输出日志和文件日志。您可以通过集群左侧导航栏自定义资源 > 资源定义(CustomResourceDefinition) > 使用YAML创建资源来创建AliyunLogConfig CR。AliyunLogConfig CR的主要配置参数如下表所示。

配置参数

说明

示例值

.metadata.name

日志采集配置资源名,在当前ACS集群内唯一。

test-stdout

.spec.project

可选配置,Project名称。可自定义,推荐使用k8s-log-ACS集群ID命名。

k8s-log-c326bc86****

.spec.logstore

必选配置,Logstore名称。如果不存在,日志服务会自动创建。

test-stdout

.spec.logtailConfig.inputType

采集的数据源类型,file表示文件日志,plugin表示标准输出。

plugin

.spec.logtailConfig.configName

Logtail配置的名称,必须与资源名metadata.name相同。

test-stdout

.spec.logtailConfig.inputDetail

Logtail配置的详细信息。其中主要包括采集标准输出日志和采集文件日志等配置。

plugin:
  inputs:
    - type: service_docker_stdout
      detail:
        Stdout: true
        Stderr: true

表示采集容器的标准输出Stdout和错误输出Stderr

.spec.logtailConfig.inputDetail.advanced

Logtail配置的扩展功能。其中k8s配置主要包括:

  • K8sNamespaceRegex:Pod Namespace过滤,支持正则表达式。

  • K8sContainerRegex:容器名过滤,支持正则表达式。

  • K8sPodRegex:Pod名过滤,支持正则表达式。

  • IncludeK8sLabel:根据Pod labels匹配。

k8s:
  K8sNamespaceRegex: ^(default)$
  K8sContainerRegex: ^(busybox)$
  K8sPodRegex: ^backend.+$
  IncludeK8sLabel:
    app: backend
    application: prod

表示指定收集同时符合以下规则的容器日志:

  • 命名空间名称为default

  • Pod名称以backend为开头。

  • 容器名称为busybox

  • 带有标签app: backendapplication: prod

关于更多配置参数的详细说明,请参见Logtail配置

场景一:采集特定应用的标准输出日志

采集的日志为标准输出(包括错误输出),在logtailConfig配置中的 detail 添加相关配置来匹配特定的Pod或容器,将下述配置下发到ACS集群中即可完成标准输出日志的采集。

apiVersion: log.alibabacloud.com/v1alpha1      
kind: AliyunLogConfig                         
metadata:
  name: test-stdout               
spec:
  project: k8s-log-c326bc86****    # 请修改为实际Project名称
  logstore: test-stdout                           
  shardCount: 2                                           
  lifeCycle: 90                    
  logtailConfig:                   
    inputType: plugin                                             
    configName: test-stdout        
    inputDetail:                   
      plugin:
        inputs:
          - type: service_docker_stdout
            detail:
              Stdout: true
              Stderr: true
              K8sNamespaceRegex: ^(default)$    
              K8sContainerRegex: ^(busybox)$    
              K8sPodRegex: ^backend.+$          
              IncludeK8sLabel:                  
                app: backend
                application: prod

场景二:采集特定应用的文件日志

采集的日志为文件日志,在logtailConfig配置中增加 advanced 配置来匹配特定的Pod或容器,将下述配置下发到ACS集群中即可完成文件日志的采集。

apiVersion: log.alibabacloud.com/v1alpha1
kind: AliyunLogConfig
metadata:
  name: test-file                  
spec:
  project: k8s-log-c326bc86****    # 请修改为实际Project名称
  logstore: test-file                 
  logtailConfig:                   
    inputType: file                
    configName: test-file           
    inputDetail:                  
      logType: common_reg_log      
      logPath: /log/               
      filePattern: "*.log"         
      dockerFile: true             
      advanced:
        k8s:
          K8sNamespaceRegex: ^(default)$    
          K8sContainerRegex: ^(busybox)$    
          K8sPodRegex: ^backend.+$          
          IncludeK8sLabel:                  
            app: backend
            application: prod
说明

以上场景的AliyunLogConfig CR test-stdouttest-file创建完成后,您可以先通过步骤四:通过日志服务控制台查看日志查看是否已成功创建对应的日志库。若没有,请结合Logtail配置重新检查和修改配置项。

image

步骤三:创建示例应用

创建日志采集配置CR后,日志服务会自动采集后续创建的Pod的日志。您可以创建以下示例应用来测试日志采集的效果。

  1. 示例应用以Deployment为例,YAML内容示例如下。其中容器启动后会执行相关命令,不断打印标准输出和日志文件。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: backend-busybox
      labels:
        app: backend
        application: prod
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: backend
          application: prod
      template:
        metadata:
          name: backend-busybox
          labels:
            app: backend
            application: prod
        spec:
          containers:
          - args:
            - -c
            - mkdir -p /log; while true; do echo hello world; date; echo hello sls >> /log/busybox.log; sleep 1; done
            command:
            - /bin/sh
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28
            imagePullPolicy: Always
            name: busybox

步骤四:通过日志服务控制台查看日志

完成配置后,示例应用的日志已被采集并存储到日志服务SLS中,您可以在日志服务控制台查看容器日志。

  1. 登录日志服务控制台

  2. Project列表区域选择ACS集群对应的Project(默认为k8s-log-{ACS集群ID}),进入日志库列表页签。

  3. 在列表中找到相应的Logstore(采集配置中指定),将鼠标悬浮在相应的Logstore名称的右侧,单击button图标,并单击查询分析

    本示例中,在日志查询页面,可以查看标准输出日志(test-stdout)和容器内文件日志(test-file)。

    image

    image

更多信息

关于如何进行异常排查,请参见Logtail采集日志失败的排查思路