采集阿里云ACK集群文本日志(DaemonSet方式部署Logtail)

日志服务提供DaemonSetSidecar两种方式部署Logtail以供采集K8s日志,两种方式的差异请参考K8s集群场景Logtail安装采集指引。本文介绍如何通过DaemonSet方式部署Logtail采集阿里云ACK集群文本日志的流程。

前提条件

注意事项

操作步骤

在使用DaemonSet方式部署Logtail并采集ACK集群文本日志时,主要有三个步骤:

  1. 安装Logtail组件:为您的ACK集群安装Logtail组件,包含DaemonSet logtail-ds,ConfigMap alibaba-log-configuration,Deployment alibaba-log-controller等,以供后续日志服务下发采集配置到Logtail并执行日志采集操作。

  2. 创建Logtail采集配置:Logtail组件会根据采集配置将增量日志采集并处理后上传到Logstore中。本文介绍CRD-AliyunPipelineConfig(推荐)、CRD-AliyunLogConfig、控制台和环境变量四种创建采集配置的方式。

  3. 查询分析日志:配置成功后会为您自动创建Logstore,您可以查看日志数据。

步骤一:安装Logtail组件

已有的ACK集群中安装Logtail组件

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

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

  3. 日志与监控页签中,找到logtail-ds,然后单击安装

新建ACK集群时安装Logtail组件

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 单击创建集群,在组件配置页面,选中使用日志服务

    本文只描述日志服务相关配置,关于更多配置项说明,请参见创建ACK托管集群

    当选中使用日志服务后,会出现创建项目(Project)的提示。

    • 使用已有Project

      您可以选择一个已有的Project来管理采集到的容器日志。

      安装logtail组件

    • 创建新Project

      日志服务自动创建一个Project来管理采集到的容器日志。其中ClusterID为您新建的Kubernetes集群的唯一标识。

      安装logtail组件

重要

组件配置页中,默认开启控制面组件日志,开启此配置会在Project中自动配置并采集集群控制面组件日志并遵循按量计费,因此请您根据自身情况选择是否需要开启,相关信息请参考管理控制面组件日志image

安装完成后,日志服务会自动生成名为k8s-log-${your_k8s_cluster_id}Project,并在该Project下生成如下资源。

资源类型

资源名称

作用

示例

机器组

k8s-group-${your_k8s_cluster_id}

logtail-daemonset的机器组,主要用于日志采集场景。

k8s-group-my-cluster-123

k8s-group-${your_k8s_cluster_id}-statefulset

logtail-statefulset的机器组,主要用于指标采集场景。

k8s-group-my-cluster-123-statefulset

k8s-group-${your_k8s_cluster_id}-singleton

单实例机器组,主要用于部分单实例采集配置。

k8s-group-my-cluster-123-singleton

Logstore

config-operation-log

用于存储Logtail组件中的alibaba-log-controller日志。建议不要在此Logstore下创建采集配置。

重要

请勿删除名为config-operation-logLogstore。

步骤二:创建Logtail采集配置

这里为您介绍四种采集配置方式。建议您只使用一种方法管理Logtail采集配置:

  • CRD-AliyunPipelineConfig(推荐):适合希望通过K8s资源的方式来管理日志采集配置的场景,能够支持复杂的数据处理逻辑,通过CRD的方式管理采集配置,可以与应用同时更新部署,确保版本保持一致。

    此方式需要ACKlogtail-ds组件版本高于1.8.10,如需升级请参见自动安装的Logtail组件升级

  • 日志服务控制台:图形化界面直接管理,面向希望快速部署配置,而不深入到配置文件的场景。但某些高级功能和自定义需求可能无法通过控制台实现。

  • 环境变量:适合希望通过环境变量快速配置基本日志参数的场景,简单的配置调整,不支持复杂的处理逻辑。

  • CRD-AliyunLogConfig:旧版CRD。新版CRD-AliyunPipelineConfig较旧版提升了扩展性、稳定性,降低了配置复杂度,建议使用新版。详细能力对比请参考CRD类型差异

CRD-AliyunPipelineConfig(推荐)

您只需要创建AliyunPipelineConfig自定义资源即可创建Logtail采集配置,资源创建完成后自动生效。

重要

对于通过自定义资源创建的Logtail采集配置,其修改只能通过更新相应的自定义资源来实现,在日志服务控制台上对Logtail采集配置的修改不会同步到自定义资源中。

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

  2. 在左侧导航栏中,单击集群列表

  3. 集群列表页面中,单击目标集群的详情后选择连接信息页签

  4. 单击右上角通过Workbench管理集群

  5. 新建一个YAML文件,并按实际情况修改后使用如下示例脚本:

    YAML将创建名为example-k8s-fileLogtail采集配置,并对集群内名称包含app的所有容器,以多行文本模式采集/data/logs/app_1路径下的test.LOG文件内容,发送到名为k8s-log-testProject中的名为k8s-fileLogstore。

    您需要修改示例中的Project,例如登录日志服务控制台使用安装Logtail时在日志服务中为您生成的名为k8s-log-<your_cluster_id>project;修改示例中的FilePaths,使用您的容器内文件路径,更多请参考容器文件路径映射。如果您希望自定义YAML文件内容,请参考CR参数说明详细了解AliyunPipelineConfig自定义资源的参数。如果您对YAML文件中的config项提供的Logtail采集配置详情感兴趣,如支持的输入,输出,处理插件类型与容器过滤方式等,请参考PiplineConfig

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的Logtail采集配置名,如果名称重复则不会生效。
      name: example-k8s-file
    spec:
      # 指定目标Project
      project:
        name: k8s-log-test
      logstores:
      # 创建名为 k8s-fileLogstore
        - name: k8s-file
      # 定义Logtail采集配置
      config:
        # 日志样例(可不填写)
        sample: |
          2024-06-19 16:35:00 INFO test log
          line-1
          line-2
          end
        # 定义输入插件
        inputs:
          # 使用input_file插件采集容器内多行文本日志
          - Type: input_file
            # 容器内的文件路径
            FilePaths:
              - /data/logs/app_1/**/test.LOG
            # 启用容器发现功能。
            EnableContainerDiscovery: true
            # 添加容器信息过滤条件,多个选项之间为“且”的关系。
            ContainerFilters:
              # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。
              K8sNamespaceRegex: default
              # 指定待采集容器的名称,支持正则匹配。
              K8sContainerRegex: ^(.*app.*)$
            # 开启多行日志采集  单行日志采集请删除该配置  
            Multiline:
              # 选择自定义行首正则表达式模式
              Mode: custom
              # 配置行首正则表达式
              StartPattern: \d+-\d+-\d+.*
        # 定义处理插件
        processors:
          # 使用正则解析插件解析日志
          - Type: processor_parse_regex_native
            # 源字段名
            SourceKey: content
            # 解析用的正则表达式,用捕获组"()"捕获待提取的字段
            Regex: (\d+-\d+-\d+\s*\d+:\d+:\d+)\s*(\S+)\s*(.*)
            # 提取的字段列表
            Keys: ["time", "level", "msg"]
        # 定义输出插件
        flushers:
          # 使用flusher_sls插件输出到指定Logstore。
          - Type: flusher_sls
            # 需要确保该 Logstore 存在
            Logstore: k8s-file
            # 需要确保 endpoint 正确
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs
  6. 执行kubectl apply -f example.yaml,其中example.yaml替换为您创建的 YAML 文件名称,Logtail开始采集容器上的文本日志,并发送到日志服务中。

CRD-AliyunLogConfig

您只需要创建AliyunLogConfig自定义资源即可创建Logtail采集配置,创建完成后自动生效。

重要

对于通过自定义资源创建的Logtail采集配置,其修改只能通过更新相应的自定义资源来实现,在日志服务控制台上对Logtail采集配置的修改不会同步到自定义资源中。

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

  2. 在左侧导航栏中,单击集群列表

  3. 集群列表页面中,单击目标集群的详情后选择连接信息页签

  4. 单击右上角通过Workbench管理集群

  5. Workbench中新建一个YAML文件,并按实际情况修改后使用如下示例脚本:

    YAML脚本将创建名为example-k8s-fileLogtail采集配置,并对集群内名称开头为app的所有容器,以极简文本模式采集/data/logs/app_1路径下的test.LOG文件内容,发送到名为k8s-log-<your_cluster_id>Project中的名为k8s-fileLogstore。

    您可能需要修改示例中的logPath为您真实的日志文件路径。如果您希望自定义YAML文件内容,请参考CR参数说明详细了解AliyunLogConfig自定义资源的参数。如果您对于YAML文件中的logtailConfig项提供的Logtail采集配置详情感兴趣,如支持的输入,输出,处理插件类型与容器过滤方式等,请参考AliyunLogConfigDetail

    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: example-k8s-file
      # 设置资源所在命名空间。
      namespace: kube-system
    spec:
      # 设置目标project名称(可不填写,默认为k8s-log-<your_cluster_id>)
      # project: k8s-log-test
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-file
      # 设置Logtail采集配置。
      logtailConfig:
        # 设置采集的数据源类型。采集文本日志时,需设置为file。
        inputType: file
        # 设置Logtail采集配置的名称,必须与metadata.name一致。
        configName: example-k8s-file
        inputDetail:
          # 指定通过极简模式采集文本日志。
          logType: common_reg_log
          # 设置日志文件所在路径。
          logPath: /data/logs/app_1
          # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
          filePattern: test.LOG
          # 采集容器的文本日志时,需设置dockerFiletrue。
          dockerFile: true
          # 开启多行日志采集 单行日志采集删除该配置
          # 行首正则表达式,以该正则表示一行日志的开始
          logBeginRegex: \d+-\d+-\d+.*
          #设置容器过滤条件。
          advanced:
            k8s:
              K8sPodRegex: '^(app.*)$'
  6. 执行kubectl apply -f example.yaml,其中example.yaml替换为您创建的 YAML 文件名称,Logtail开始采集容器上的文本日志,并发送到日志服务中。

日志服务控制台

说明

此方式适合少量Logtail采集配置的创建和管理,无需登录Kubernetes集群,操作步骤简单但无法批量配置。

  1. 登录日志服务控制台

  2. 选择Project列表中您在安装Logtail组件时所使用的Project,如k8s-log-<your_cluster_id>。在Project页面中单击目标LogstoreLogtail配置,添加Logtail配置,并单击Kubernetes-文件立即接入image

  3. 机器组配置页面K8s场景的ACK Daemonset方式下勾选k8s-group-${your_k8s_cluster_id}机器组并单击>添加到应用机器组,单击下一步image

  4. 创建Logtail采集配置,按下文填写必须配置后单击下一步即可,Logtail采集配置生效大概需要1分钟,请耐心等待。

    此处仅介绍主要配置,详细配置请参见Logtail采集配置

    • 全局配置

      全局配置中输入配置名称。

      image

    • 输入配置

      • Logtail部署模式:选择DaemonSet

      • 文件路径类型:选择待采集的文件路径是容器内路径或宿主机路径。对于通过hostPath方式挂载数据卷的容器,如果您希望直接采集其在宿主机上映射的日志文件,请选择宿主机路径,其余情况请选择容器内路径。

      • 文件路径:代表日志采集的路径,日志路径必须以正斜线(/)开头,例如下图/data/wwwlogs/main/**/*.Log表示/data/wwwlogs/main目录下后缀名为.Log的文件。如果需要设置日志目录被监控的最大深度,即文件路径中通配符**匹配的最大目录深度。可以修改最大目录监控深度的取值,0代表只监控本层目录。image

  5. 创建索引预览数据:日志服务默认开启全文索引,此时查询会索引日志中所有字段。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将生成字段索引,通过此索引针对特定字段进行精确查询,从而减少索引费用和提高查询效率。更多信息请参见创建索引image

环境变量

说明

此方式仅支持单行文本,如果要配置多行文本或其他日志格式,必须使用自定义资源方式或在日志服务控制台配置。

  1. 创建应用时配置日志服务。

    通过容器控制台配置

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

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面上方的命名空间下拉框中设置命名空间,然后单击页面右上角的使用镜像创建

    4. 应用基本信息页签,设置应用名称,单击下一步,进入容器配置页面,设置镜像名称。

      以下仅介绍日志服务相关的配置。关于其他的应用配置,请参见创建无状态工作负载Deployment

    5. 日志配置区域,配置日志相关信息。

      1. 设置采集配置。

        单击采集配置创建新的采集配置,每个采集配置由日志库容器内日志路径两项构成。

        • 日志库:配置Logstore名称,用于指定所采集的日志存储于该Logstore。如果该Logstore不存在,ACK将会自动为您在集群关联的日志服务Project下创建相应的Logstore。

          说明

          新创建的Logstore中的日志默认保存时间为90天。

        • 容器内日志路径:指定希望采集的日志所在的路径,例如使用/usr/local/tomcat/logs/catalina.*.log来采集Tomcat的文本日志。 image

          每一项采集配置都会被自动创建为对应Logstore的一个采集配置,默认采用极简模式(按行)进行采集。

      2. 设置自定义Tag。

        单击自定义Tag创建新的自定义Tag,每一个自定义Tag都是一个键值对,会拼接到所采集到的日志中,您可以使用它来为容器的日志数据进行标记,例如版本号。 image

    6. 当完成所有配置后,可单击右上角的下一步进入后续流程。

      后续操作,可参见创建无状态工作负载Deployment

    通过YAML模板

    1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

    2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    3. 无状态页面上方的命名空间下拉框中设置命名空间,然后单击页面右上角的使用YAML创建资源

    4. 配置YAML文件。

      YAML模板的语法同Kubernetes语法,但是为了给容器指定采集配置,需要使用env来为容器增加采集配置自定义Tag,并根据采集配置,创建对应的volumeMountsvolumes。以下是一个简单的Pod示例:

      apiVersion: v1
      kind: Pod
      metadata:
        name: my-demo
      spec:
        containers:
        - name: my-demo-app
          image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest'
          env:
          # 配置环境变量
          - name: aliyun_logs_log-varlog
            value: /var/log/*.log
          - name: aliyun_logs_mytag1_tags
            value: tag1=v1
          # 配置volume mount
          volumeMounts:
          - name: volumn-sls-mydemo
            mountPath: /var/log
          # 如果Pod不断重启,启动参数可以添加sleep
          command: ["sh", "-c"]  # 使用 shell 来运行命令
          args: ["sleep 3600"]   # 设置休眠时间为 1 小时(3600 秒)
        volumes:
        - name: volumn-sls-mydemo
          emptyDir: {}
      1. 通过环境变量来创建您的采集配置自定义Tag,所有与配置相关的环境变量都采用aliyun_logs_作为前缀。

        • 创建采集配置的规则如下:

          - name: aliyun_logs_log-varlog
            value: /var/log/*.log                        

          示例中创建了一个采集配置,格式为aliyun_logs_{key},对应的{key}log-varlog

          • aliyun_logs_log-varlog:该env表示创建一个Logstore名为log-varlog,日志采集路径为/var/log/*.log的配置,对应的日志服务采集配置名称也是log-varlog,目的是将容器的/var/log/*.log文件内容采集到log-varlog这个Logstore中。

        • 创建自定义Tag的规则如下:

          - name: aliyun_logs_mytag1_tags
            value: tag1=v1                       

          配置Tag后,当采集到该容器的日志时,会自动附加对应的字段到日志服务。其中mytag1任意不包含'_'的名称

      2. 如果您的采集配置中指定了非stdout的采集路径,需要在此部分创建相应的volumeMounts

        示例中采集配置添加了对/var/log/*.log的采集,因此相应地添加了/var/logvolumeMounts

    5. YAML编写完成后,单击创建,即可将相应的配置交由Kubernetes集群执行。

  2. 配置环境变量的高级参数。

    通过容器环境变量配置采集支持多种配置参数。您可以根据实际需求设置高级参数,以满足日志采集的特殊需求。

    重要

    通过容器环境变量配置采集日志的方式不适用于边缘场景。

    字段

    说明

    示例

    注意事项

    aliyun_logs_{key}

    • 必选项。{key}只能包含小写字母、数字和-。

    • 若不存在aliyun_logs_{key}_logstore,则默认创建并采集到名为{key}的logstore。

    • 当值为stdout时表示采集容器的标准输出;其他值为容器内的日志路径。

    • - name: aliyun_logs_catalina
      
        value: stdout
    • - name: aliyun_logs_access-log
      
        value: /var/log/nginx/access.log
    • 默认采集方式为极简模式。如需解析日志内容,建议使用日志服务控制台,或者CRD进行配置。

    • {key}表示日志服务中Logtail采集配置的名称,需保持在K8s集群内唯一。

    aliyun_logs_{key}_tags

    可选。值为{tag-key}={tag-value}类型,用于对日志进行标识。

    - name: aliyun_logs_catalina_tags
    
      value: app=catalina

    不涉及。

    aliyun_logs_{key}_project

    可选。值为指定的日志服务Project。当不存在该环境变量时,为您安装时所选的Project。

    - name: aliyun_logs_catalina_project
    
      value: my-k8s-project

    Project需与您的Logtail工作所在的Region一致。

    aliyun_logs_{key}_logstore

    可选。值为指定的日志服务Logstore。当不存在该环境变量时,Logstore和{key}一致。

    - name: aliyun_logs_catalina_logstore
    
      value: my-logstore

    不涉及。

    aliyun_logs_{key}_shard

    可选。值为创建Logstore时的shard数,取值范围为[1 , 10]。当不存在该环境变量时,值为2。

    说明

    logstore已经存在,则该参数不生效。

    - name: aliyun_logs_catalina_shard
    
      value: '4'

    不涉及。

    aliyun_logs_{key}_ttl

    可选。值为指定的日志保存时间,取值范围为[1 , 3650]。

    • 当取值为3650时,指定日志的保存时间为永久保存。

    • 当不存在该环境变量时,默认指定日志的保存时间为90天。

    说明

    Logstore已经存在,则该参数不生效。

    - name: aliyun_logs_catalina_ttl
    
      value: '3650'

    不涉及。

    aliyun_logs_{key}_machinegroup

    可选。值为应用的机器组。当不存在该环境变量时与安装Logtail的默认机器组一致。关于该参数的详细使用方法,请参见下文的定制需求2:将不同应用数据采集到不同的Project

    - name: aliyun_logs_catalina_machinegroup
    
      value: my-machine-group

    不涉及。

    aliyun_logs_{key}_logstoremode

    可选。值为指定的日志服务Logstore的类型,不指定该参数的话,默认值为standard,取值:

    说明

    Logstore已经存在,则该参数不生效。

    • standard:支持日志服务一站式数据分析功能,适用于实时监控、交互式分析以及构建完整的可观测性系统等场景。

    • query:支持高性能查询,索引流量费用约为standard的一半,但不支持SQL分析,适用于数据量大、存储周期长(周、月级别以上)、无日志分析的场景。

    • - name: aliyun_logs_catalina_logstoremode
        value: standard 
    • - name: aliyun_logs_catalina_logstoremode
        value: query 

    该参数需要logtail-ds镜像版本>=1.3.1。

    • 定制需求1:将多个应用数据采集到同一Logstore

      如果您需要将多个应用数据采集到同一Logstore,可以设置 aliyun_logs_{key}_logstore参数,例如以下配置将2个应用的stdout采集到stdout-logstore中。

      示例中应用1{key}app1-stdout,应用2{key}app2-stdout

      应用1设置的环境变量为:

      # 配置环境变量
          - name: aliyun_logs_app1-stdout
            value: stdout
          - name: aliyun_logs_app1-stdout_logstore
            value: stdout-logstore

      应用2设置的环境变量为:

      # 配置环境变量
          - name: aliyun_logs_app2-stdout
            value: stdout
          - name: aliyun_logs_app2-stdout_logstore
            value: stdout-logstore
    • 定制需求2:将不同应用数据采集到不同的Project

      如果您需要将不同应用的数据采集到多个Project中,您需要进行以下操作:

      1. 在每个Project中创建一个机器组,选择自定义标识,标识名为k8s-group-{cluster-id},其中{cluster-id}为您的集群ID,机器组名称可以自定义配置。

      2. 在每个应用的环境变量中配置project、logstore、machinegroup信息,其中机器组名称为您在上一步创建的机器组名称。

        如下示例中应用1{key}app1-stdout,应用2{key}app2-stdout。其中如果两个应用在同一个K8s集群中,对应的machinegroup可以使用同一个machinegroup。

        应用1设置的环境变量为:

        # 配置环境变量
            - name: aliyun_logs_app1-stdout
              value: stdout
            - name: aliyun_logs_app1-stdout_project
              value: app1-project
            - name: aliyun_logs_app1-stdout_logstore
              value: app1-logstore
            - name: aliyun_logs_app1-stdout_machinegroup
              value: app1-machine-group

        应用2设置的环境变量为:

        # 应用2 配置环境变量
            - name: aliyun_logs_app2-stdout
              value: stdout
            - name: aliyun_logs_app2-stdout_project
              value: app2-project
            - name: aliyun_logs_app2-stdout_logstore
              value: app2-logstore
            - name: aliyun_logs_app2-stdout_machinegroup
              value: app1-machine-group

步骤三:查询分析日志

  1. 登录日志服务控制台

  2. Project列表中,单击目标Project,进入对应的Project详情页面。

    image

  3. 在对应的日志库右侧的图标图标,选择查询分析,查看Kubernetes集群输出的日志。

    image

容器日志文本默认字段

每条容器文本日志默认包含的字段如下表所示。

字段名称

说明

__tag__:__hostname__

容器宿主机的名称。

__tag__:__path__

容器内日志文件的路径。

__tag__:_container_ip_

容器的IP地址。

__tag__:_image_name_

容器使用的镜像名称。

__tag__:_pod_name_

Pod的名称。

__tag__:_namespace_

Pod所属的命名空间。

__tag__:_pod_uid_

Pod的唯一标识符(UID)。

相关文档

  • 当您完成日志内容的采集后,您可以在日志服务中使用查询与分析功能,来帮助您了解日志情况,请参考查询与分析快速指引

  • 当您完成日志内容的采集后,您可以在日志服务中使用可视化功能, 来帮助您直观的统计与了解日志情况,请参考快速创建仪表盘

  • 当您完成日志内容的采集后,您可以在日志服务中使用告警功能, 来自动提醒您日志中的异常情况,请参考快速设置日志告警

  • 日志服务仅采集增量日志,历史日志文件采集请参见导入历史日志文件

  • 容器采集异常排查思路: