采集自建K8s集群标准输出(DaemonSet方式部署Logtail)

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

前提条件

  • 已开通日志服务。具体操作,请参见开通日志服务

  • 需要集群Kubernetes 1.6及以上版本。

  • K8s集群已经安装kubectl

注意事项

操作步骤

在使用DaemonSet方式部署Logtail并采集K8s集群标准输出时,主要有三个步骤:

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

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

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

步骤一:安装Logtail

重要
  • 目前,alibaba-log-controller组件只支持Kubernetes 1.6及以上版本。

  • 请确保用于执行脚本的机器中,已安装kubectl命令。

  1. 登录日志服务控制台

  2. 创建Project。具体操作,请参见创建项目Project

    建议创建一个以k8s-log-开头的Project,例如k8s-log-${your_k8s_cluster_id}

  3. 登录您的Kubernetes集群。

  4. 执行如下命令安装Logtail及其他依赖组件。

    1. 下载安装包并解压。

      • 中国地域

        wget https://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubernetes/0.5.3/alibaba-cloud-log-all.tgz; tar xvf alibaba-cloud-log-all.tgz; chmod 744 ./alibaba-cloud-log-all/k8s-custom-install.sh
      • 海外地域

        wget https://logtail-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/kubernetes/0.5.3/alibaba-cloud-log-all.tgz; tar xvf alibaba-cloud-log-all.tgz; chmod 744 ./alibaba-cloud-log-all/k8s-custom-install.sh
    2. 修改配置文件./alibaba-cloud-log-all/values.yaml

      # ===================== 必需要补充的内容 =====================
      # 目标Project名称。
      SlsProjectName: 
      # Project所属地域。
      Region: 
      # Project所属阿里云账号ID,需使用双引号("")包裹。
      AliUid: "11**99"
      # 阿里云账号或RAM用户的AccessKey IDAccessKey Secret,需具备AliyunLogFullAccess权限。
      AccessKeyID: 
      AccessKeySercret: 
      # 自定义集群ID,命名只支持大小写,数字,短划线(-)。
      ClusterID: 
      # ==========================================================
      # 是否开启指标采集相关组件,可选参数: true、false, 默认true。
      SlsMonitoring: true
      # 网络类型,可选参数:Internet、Intranet,默认使用Internet。
      Net: Internet
      # 容器运行时是否为containerd,可选参数: true, false, 默认false。
      SLS_CONTAINERD_USED: true

      命令中各参数说明如下所示,请根据实际情况替换。

      参数

      说明

      SlsProjectName

      配置为您在上文中创建的Project名称。

      Region

      您的Project所在的地域ID。例如华东1(杭州)的地域IDcn-hangzhou。更多信息,请参见开服地域

      AliUid

      Project所属账号的阿里云账号(主账号)ID,需使用双引号包裹(""),例如AliUid: "11**99"。如何获取,请参见获取日志服务所在的阿里云账号(主账号)ID

      AccessKeyID

      Project所属账号的阿里云账号的AccessKey ID。推荐使用RAM用户的AccessKey,并授予RAM用户AliyunLogFullAccess权限。相关操作,请参见创建RAM用户及授权

      AccessKeySercret

      Project所属账号的阿里云账号的AccessKey Secret。推荐使用RAM用户的AccessKey并授予RAM用户AliyunLogFullAccess权限。相关操作,请参见创建RAM用户及授权

      ClusterID

      自定义集群ID,命名只支持大小写字母、数字、短划线(-)。该参数对应后面操作中的${your_k8s_cluster_id}

      重要

      不同的Kubernetes集群,请勿配置相同的集群ID。

      SlsMonitoring

      是否开启指标采集相关组件,可选项:

      • true(默认值):开启。

      • false:不开启。

      Net

      网络类型。可选项:

      • Internet(默认值):公网。

      • Intranet:内网。

      SLS_CONTAINERD_USED

      容器运行时是否为containerd,可选项:

      • true:开启。

      • false(默认值):不开启。

      重要

      在使用containerd作为容器运行时的自建Kubernetes集群中,若未开启相关参数,可能导致日志无法被Logtail采集。

    3. 安装Logtail及其他依赖组件。

      bash k8s-custom-install.sh; kubectl apply -R -f result

安装完成后,日志服务会自动生成名为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组件日志。

重要
  • 请勿删除名为config-operation-logLogstore。

  • 在自建Kubernetes集群上安装时,默认为Logtail授予privileged权限,主要是为避免删除其他Pod时可能出现的container text file busy错误。更多信息,请参见Bug 1468249Bug 1441737issue 34538

步骤二:创建Logtail采集配置

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

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

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

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

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

CRD-AliyunPipelineConfig(推荐)

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

重要

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

  1. 登录您的Kubernetes集群。

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

    YAML将创建名为example-k8s-fileLogtail采集配置,并对集群内名称包含app的所有容器,以多行模式采集标准输出,发送到名为k8s-log-testProject中的名为k8s-stdoutLogstore。

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

    apiVersion: telemetry.alibabacloud.com/v1alpha1
    # 创建一个 ClusterAliyunPipelineConfig
    kind: ClusterAliyunPipelineConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的Logtail采集配置名。如果名称重复则不会生效。
      name: example-k8s-file
    spec:
      # 指定目标project
      project:
        name: k8s-log-test
      # 创建用于存储日志的 Logstore
      logstores:
        - name: k8s-stdout
      # 定义Logtail采集配置
      config:
        # 日志样例(可不填写)
        sample: |
          2024-06-19 16:35:00 INFO test log
          line-1
          line-2
          end
        # 定义输入插件
        inputs:
              # 使用service_docker_stdout插件采集容器内文本日志
          - Type: service_docker_stdout
            Stdout: true
            Stderr: true
            # 配置容器信息过滤条件,多个选项之间为“且”的关系。
            # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。
            K8sNamespaceRegex: "^(default)$"
            # 指定待采集容器的名称,支持正则匹配。
            K8sContainerRegex: "^(.*app.*)$"
            # 配置多行切分配置 单行日志采集无效配置
            # 配置行首正则表达式
            BeginLineRegex: \d+-\d+-\d+.*
        # 定义输出插件
        flushers:
          # 使用flusher_sls插件输出到指定Logstore。
          - Type: flusher_sls
            # 需要确保该 Logstore 存在
            Logstore: k8s-stdout
            # 需要确保 endpoint 正确
            Endpoint: cn-hangzhou.log.aliyuncs.com
            Region: cn-hangzhou
            TelemetryType: logs
  3. 执行kubectl apply -f example.yaml,其中example.yaml替换为您创建的 YAML 文件名称,Logtail开始采集容器内的标准输出,并发送到日志服务中。

CRD-AliyunLogConfig

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

重要

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

  1. 登录您的Kubernetes集群。

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

    YAML脚本将创建名为simple-stdout-exampleLogtail采集配置,并对集群内名称开头为app的所有容器,以多行模式采集标准输出,发送到名为k8s-log-<your_cluster_id>Project中的名为k8s-stdoutLogstore。

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

    # 标准输出配置
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      # 设置资源名,在当前Kubernetes集群内唯一。
      name: simple-stdout-example
    spec:
      # 设置目标project名称(可不填写,默认为k8s-log-<your_cluster_id>)
      # project: k8s-log-test
      # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: k8s-stdout
      # 设置Logtail采集配置。
      logtailConfig:
        # 设置采集的数据源类型。采集标准输出时,需设置为plugin。
        inputType: plugin
        # 设置Logtail采集配置的名称,必须与资源名(metadata.name)相同。
        configName: simple-stdout-example
        inputDetail:
          plugin:
            inputs:
              - type: service_docker_stdout
                detail:
                  # 指定采集stdoutstderr。
                  Stdout: true
                  Stderr: true
                  # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。
                  K8sNamespaceRegex: "^(default)$"
                  # 指定待采集容器的名称,支持正则匹配。
                  K8sContainerRegex: "^(app.*)$"
                  # 配置多行切分配置
                  # 配置行首正则表达式
                  BeginLineRegex: \d+-\d+-\d+.*
                  
  3. 执行kubectl apply -f example.yaml,其中example.yaml替换为您创建的 YAML 文件名称,Logtail开始采集容器内的标准输出,并发送到日志服务中。

日志服务控制台

  1. 登录日志服务控制台

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

  3. 由于上一步骤中已为ACK集群安装Logtail组件,请单击使用现有机器组image

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

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

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

    • 全局配置

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

      image

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

步骤三:查询分析日志

  1. 登录日志服务控制台

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

    image

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

    image

容器标准输出默认字段

每条容器标准输出默认包含的字段如下表所示。

字段名称

说明

_time_

日志采集时间。

_source_

日志源类型,stdoutstderr。

_image_name_

镜像名

_container_name_

容器名

_pod_name_

Pod

_namespace_

Pod所在的命名空间

_pod_uid_

Pod的唯一标识

相关文档

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

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

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

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

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