通过SLS CRD采集日志

本文介绍在ACK Serverless集群中,如何通过SLS CRD来配置日志采集,实现通过阿里云日志服务SLS自动采集容器日志。

背景信息

阿里云日志服务SLS(Log Service)是针对日志数据的一站式服务,您无需开发就能快捷完成日志数据采集、消费、投递以及查询分析等功能。更多信息,请参见日志服务简介

前提条件

已开通日志服务。登录日志服务控制台时,如果没有开通日志服务,将收到相关提示,您可以根据页面提示开通。

注意事项

通过SLS CRD开启日志采集仅对后续创建的ECI Pod生效。如果想要采集存量Pod的日志,需要对存量Pod进行一次滚动发布。

配置日志采集

在集群内部署alibaba-log-controller组件后,您可以通过日志采集配置CRD(AliyunLogConfig CRD)来配置日志采集。

部署alibaba-log-controller组件

  1. 登录容器服务管理控制台

  2. 集群页面,单击目标集群名称,进入集群管理页面。

  3. 在集群中部署alibaba-log-controller组件。

    1. 在集群管理页左侧导航栏,选择运维管理>组件管理

    2. 单击日志与监控页签,找到alibaba-log-controller卡片,然后单击安装

    3. 在弹出的对话框中,单击确定

      安装完成后,alibaba-log-controller卡片右上角会显示已安装。

创建Logtail采集配置

  1. 连接ACK Serverless集群。

  2. 编写日志采集配置CRD的YAML配置文件。

    重要

    创建日志采集配置CRD后,您可以在日志服务控制台查看生成的日志库及logtail配置。通过CRD方式创建的配置,在控制台上对其修改不会同步到CRD中。如果后续需要更新配置,请直接修改CRD资源,不要在控制台操作,避免导致配置不一致。

    AliyunLogConfig CRD YAML模板

    apiVersion: log.alibabacloud.com/v1alpha1      # 使用默认值,无需修改。
    kind: AliyunLogConfig                          # 使用默认值,无需修改。
    metadata:
      name: simple-stdout-example                  # 设置资源名,在当前Kubernetes集群内唯一。
    spec:
      project: k8s-my-project                      # [可选]设置Project名称。默认为安装Logtail组件时设置的Project。
      logstore: k8s-stdout                         # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstoreMode: standard                       # [可选]设置Logstore类型,该参数值仅在新建Logstore时生效。
      shardCount: 2                                # [可选]设置Shard数量。默认值为2,取值范围1~10。
      lifeCycle: 90                                # [可选]设置Logstore中数据的存储时间,该参数值仅在新建Logstore时生效。默认值为90,取值范围为1~3650。其中,3650天为永久存储。
      logtailConfig:                               # 设置Logtail配置。
        inputType: plugin                          # 设置采集的数据源类型。file表示采集文本日志或plugin表示采集标准输出。
        configName: simple-stdout-example          # 设置Logtail配置的名称,必须与资源名(metadata.name)相同。
        inputDetail:                               # 设置Logtail配置的详细信息,具体配置请参见本文下方的示例。
          ...

    参数说明

    • 基本参数

      参数

      类型

      是否必填

      说明

      project

      string

      Project名称。默认为安装Logtail组件时设置的Project。

      logstore

      string

      Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。

      logstoreMode

      string

      Logstore类型。该参数值仅在新建Logstore时生效。取值范围:

      • query:查询型Logstore。

      • standard:标准型Logstore。

      更多信息,请参见管理Logstore

      shardCount

      int

      Shard数量。默认值为2,取值范围为1~10。

      lifeCycle

      int

      Logstore中数据的存储时间。默认值为90,取值范围为1~3650。其中,3650天为永久存储。该参数值仅在新建Logstore时生效。

      machineGroups

      array

      机器组。安装Logtail组件时,日志服务会自动创建名为k8s-group-${your_k8s_cluster_id}的机器组。

      logtailConfig

      object

      Logtail配置。包含以下参数:

      • configName:Logtail配置的名称。

      • inputType:日志输入的方式。可选值如下:

        • plugin:通过Logtail插件采集MySQL Binlog等日志。

        • file:通过固定模式(正则模式、分隔符模式等)采集文本文件中的日志。

      • inputDetail:日志输入的相关配置。

      • outputType:日志输出的方式,只支持LogService,即只支持将数据上传到日志服务。

      • outputDetail:日志输出的相关配置。

      • logSample:日志样例。

      详细的参数说明请参见Logtail配置

    • 容器过滤

      • Logtail 1.0.34以下版本,只支持通过环境变量、容器Label进行容器过滤。

        Kubernetes中的命名空间名和容器名会映射到容器Label中,分别为io.kubernetes.pod.namespaceio.kubernetes.container.name。推荐使用这两个容器Label进行容器过滤。如果这两个容器Label未满足需求,请使用环境变量的黑白名单进行容器过滤。

      • Logtail 1.0.34及以上版本,可以使用Kubernetes层级的信息(Pod名称、Namespace、容器名称、容器Label等)进行容器过滤。

        容器过滤参数请配置在logtailConfig>inputDetail>advanced>k8s字段下。支持的参数如下:

        • IncludeK8sLabel:Kubernetes Label白名单,用于指定待采集的容器。

        • ExcludeK8sLabel:Kubernetes Label黑名单,用于排除不采集的容器。

        • K8sNamespaceRegex:指定Namespace。

        • K8sPodRegex:指定Pod名称。

        • K8sContainerRegex:指定容器名称。

    更多信息,请参见通过DaemonSet方式采集Kubernetes容器文本日志通过DaemonSet方式采集Kubernetes容器标准输出

    AliyunLogConfig CRD YAML示例

    文本日志CRD YAML示例

    将以下内容保存为log-file.yaml

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      name: test-file                  # 资源名,在当前Kubernetes集群内唯一。
    spec:
      project: k8s-log-c326bc86****    # 可选配置,Project名称,可自定义,推荐使用[k8s-log-集群ID]命名
      logstore: test-file              # 必选配置,Logstore名称,如果不存在,日志服务会自动创建   
      logtailConfig:                   # Logtail配置
        inputType: file                # 采集的数据源类型,file表示文本日志,plugin表示标准输出
        configName: test-file          # Logtail配置的名称,必须与资源名(metadata.name)相同 
        inputDetail:                   # Logtail配置的详细信息
          logType: common_reg_log      # 通过极简模式采集文本日志
          logPath: /log/               # 日志文件所在路径
          filePattern: "*.log"         # 日志文件的名称,支持通配符星号(*)和半角问号(?),例如log_*.log。
          dockerFile: true             # 采集容器内的文件,dockerFile设置为true
          advanced:                    # 设置容器过滤条件
            k8s:
              K8sNamespaceRegex: ^(default)$
              K8sPodRegex: '^(eci-sls-demo.*)$'

    标准输出CRD YAML示例

    将以下内容保存为log-stdout.yaml。

    apiVersion: log.alibabacloud.com/v1alpha1      
    kind: AliyunLogConfig                         
    metadata:
      name: test-stdout               # 资源名,在当前Kubernetes集群内唯一。
    spec:
      project: k8s-log-c326bc86****   # 可选配置,Project名称,可自定义,推荐使用[k8s-log-集群ID]命名
      logstore: test-stdout           # 必选配置,Logstore名称,如果不存在,日志服务会自动创建                  
      shardCount: 2                   # 可选配置,Shard数量,默认为2,取值范围为1~10                         
      lifeCycle: 90                   # 可选配置,Logstore中日志保留时间,单位为天,该参数值仅在新建Logstore时生效。默认为90,取值范围为1~3650。3650表示永久保留
      logtailConfig:                  # Logtail配置
        inputType: plugin             # 采集的数据源类型,file表示文本日志,plugin表示标准输出                                
        configName: test-stdout       # Logtail配置的名称,必须与资源名(metadata.name)相同 
        inputDetail:                  # Logtail配置的详细信息
          plugin:
            inputs:
              - type: service_docker_stdout
                detail:
                  Stdout: true
                  Stderr: true
    #              IncludeEnv:
    #                aliyun_logs_test-stdout: "stdout"
  3. 创建日志采集配置CRD。

    命令示例如下。Logtail配置生效后,Logtail开始采集各个容器上的标准输出或文本日志,并发送到日志服务中。

    kubectl apply -f log-file.yaml
    kubectl apply -f log-stdout.yaml
    重要

    采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引

测试日志采集

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

  1. 创建应用。

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

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: eci-sls-demo
      labels:
        app: sls
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sls
      template:
        metadata:
          name: sls-test
          labels:
            app: sls
            alibabacloud.com/eci: "true" 
        spec:
          containers:
          - args:
            - -c
            - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;done
            command:
            - /bin/sh
            image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/busybox:1.30
            imagePullPolicy: Always
            name: busybox

    将以上YAML保存为test-sls-crd.yaml,执行以下命令创建应用。

    kubectl create -f test-sls-crd.yaml
  2. 确认应用状态。

    kubetcl get pod

    预期返回:

    NAME                            READY   STATUS    RESTARTS   AGE
    eci-sls-demo-7bf8849b9f-cgpbn   1/1     Running   0          2m14s
  3. 查看日志。

    1. 登录日志服务控制台

    2. 单击目标Project名称。

    3. 找到目标日志库,单击日志库名称查看日志。

      文本日志

      日志crd1

      标准输出

      日志crd0

关闭日志采集

创建日志采集配置CRD后,系统会自动采集所有符合条件的Pod的日志。对于一些不想要采集日志的Pod,您可以配置Annotation(k8s.aliyun.com/eci-sls-enable: "false")来关闭日志采集,避免系统自动创建Logtail而造成资源浪费。

重要
  • Annotation请添加在Pod的metadata下,例如:创建Deployment时,Annotation需添加在spec>template>metadata下。

  • 仅支持在创建ECI Pod时添加ECI相关Annotation来生效ECI功能,更新ECI Pod时添加或者修改ECI相关Annotation均不会生效。

配置示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: eci-sls-demo2
  labels:
    app: sls
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sls
  template:
    metadata:
      name: sls-test
      labels:
        app: sls
        alibabacloud.com/eci: "true"
      annotations:
        k8s.aliyun.com/eci-sls-enable: "false"    #关闭日志采集
    spec:
      containers:
      - args:
        - -c
        - mkdir -p /log;while true; do echo hello world; date; echo hello sls >> /log/busy.log; sleep 1;
          done
        command:
        - /bin/sh
        image: registry.cn-shanghai.aliyuncs.com/eci_open/busybox:1.30
        imagePullPolicy: Always
        name: busybox