如果需要只使用一个Logtail实例收集Kubernetes节点上所有容器的日志,可以使用DaemonSet方式在Kubernetes集群上部署Logtail。本文介绍DaemonSet方式采集容器文本日志的工作原理、使用限制、前提条件、操作步骤等信息。
工作原理
DaemonSet模式
在DaemonSet模式中,Kubernetes集群确保每个节点(Node)只运行一个Logtail容器,用于采集当前节点内所有容器(Containers)的日志。
当新节点加入集群时,Kubernetes集群会自动在新节点上创建Logtail容器;当节点退出集群时,Kubernetes集群会自动销毁当前节点上的Logtail容器。通过DaemonSet的自动扩缩容机制以及标识型机器组,无需您手动管理Logtail实例。
容器发现
Logtail容器采集其他容器的日志,必须发现和确定哪些容器正在运行,这个过程称为容器发现。在容器发现阶段,Logtail容器不与Kubernetes集群的kube-apiserver进行通信,而是直接和节点上的容器运行时守护进程(Container Runtime Daemon)进行通信,从而获取当前节点上的所有容器信息,避免容器发现对集群kube-apiserver产生压力。
Logtail支持通过Namespace名称、Pod名称、Pod标签、容器环境变量等条件指定或排除采集相应容器的日志。
容器文件路径映射
在Kubernetes集群中,因为Pod之间资源隔离,所以Logtail容器无法直接访问其他Pod中的容器的文件。但是,容器内的文件系统都是由宿主机的文件系统挂载形成,通过将宿主机根目录所在的文件系统挂载到Logtail容器,就可以访问宿主机上的任意文件,从而间接采集业务容器文件系统的文件。容器内文件路径与宿主机文件路径之间的关系被称为文件路径映射。
日志文件在当前容器内的路径是/log/app.log
,假设映射后的宿主机路径是/var/lib/docker/containers/<container-id>/log/app.log
。Logtail默认将宿主机根目录所在的文件系统挂载到自身的/logtail_host
目录下,因此Logtail实际采集的文件路径为/logtail_host/var/lib/docker/containers/<container-id>/log/app.log
。
使用限制
容器运行时:Logtail只支持Docker和Containerd两种容器引擎。对于Docker只支持overlay、overlay2这两种存储驱动,其他存储驱动需将日志所在目录通过数据卷挂载为临时目录。
存储卷挂载方式:如果NAS以PVC的方式挂载到数据目录,不支持使用DaemonSet方式部署Logtail,建议使用Sidecar方式或Deployment方式部署Logtail并完成日志采集。具体操作,请参见通过Sidecar方式采集Kubernetes容器文本日志。
日志文件路径:
容器内文件路径暂不支持存在软链接,请按实际路径配置采集目录。
如果业务容器的数据目录通过数据卷(Volume)挂载,则填写的文件路径不能短于挂载点路径。例如
/var/log/service
目录是数据卷挂载的路径,则设置采集目录为/var/log
将无法采集该目录下的日志,因为采集目录比挂载路径短。必须设置采集目录为/var/log/service
或更深的目录。
日志文件采集停止:
docker:当容器被停止时,Logtail会立刻释放容器文件句柄,容器可正常退出。如果在容器停止前,出现因网络延迟、资源占用多等原因导致的采集延时,可能会丢失容器停止前的部分日志。
containerd:当容器被停止时,Logtail会持续持有容器内文件的句柄(即保持对日志文件的打开状态),直至所有日志文件内容发送完毕。因此,当出现网络延迟、资源占用多等原因导致的采集延时时,可能会导致业务容器不能及时销毁。
前提条件
已安装Logtail组件。具体操作,请参见安装Logtail组件(阿里云Kubernetes集群)。
安装Logtail的主机需开放80(HTTP)端口和443(HTTPS)端口。ECS实例的端口由安全组规则控制,添加安全组规则的步骤请参见添加安全组规则。
目标容器持续新增日志。Logtail只采集增量日志。如果下发logtail采集配置后,日志文件无更新,则Logtail不会采集该文件中的日志。更多信息,请参见读取日志。
对于不同容器引擎,必须确认对应的UNIX域套接字存在,而且确保Logtail有相应UNIX域套接字的访问权限。
Docker:
/run/docker.sock
。Containerd:
/run/containerd/containerd.sock
。
创建Logtail采集配置
通过CRD方式创建的配置,在控制台上对其修改不会同步到CRD中。因此,如需修改由CRD创建的配置内容,只能修改CRD资源,不要直接在控制台操作,避免iLogtail采集配置不一致。
日志服务控制台
登录日志服务控制台。
单击控制台右侧的快速接入数据,在接入数据区域单击Kubernetes-文件卡片。
选择目标Project和Logstore,单击下一步。选择您在安装Logtail组件时所使用的Project。Logstore为您自定义创建的Logstore。
在机器组配置页面。
根据实际场景,单击以下页签:
- 重要
不同页签的后续配置步骤不同,请根据实际需求正确选择。
确认目标机器组已在应用机器组列表中,然后单击下一步。在ACK中安装Logtail组件后,日志服务自动创建名为
k8s-group-${your_k8s_cluster_id}
的机器组,您可以直接使用该机器组。重要如果需要新建机器组,请单击创建机器组,按照右侧面板进行创建。更多信息,请参见通过控制台向导创建应用并配置日志服务。
如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
创建Logtail采集配置,单击下一步创Logtail采集配置,日志服务开始采集日志。
说明Logtail采集配置生效时间最长需要3分钟,请耐心等待。
创建索引和预览数据,然后单击下一步。日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引。
重要如果需要查询日志中的所有字段,建议使用全文索引。如果只需查询部分字段、建议使用字段索引,减少索引流量。如果需要对字段进行分析(SELECT语句),必须创建字段索引。
单击查询日志,系统将跳转至Logstore查询分析页面。
您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志。
(推荐)CRD-AliyunPipelineConfig
创建Logtail采集配置
目前仅安装Logtail组件(自建Kubernetes集群)方式安装的0.5.1及以上版本的Logtail组件支持AliyunPipelineConfig。容器服务ACK目前不支持AliyunPipelineConfig。
您只需要创建AliyunPipelineConfig CR即可创建iLogtail采集配置,创建完成后自动生效。对于通过CR创建的iLogtail采集配置,其修改只能通过更新相应的CR来实现。
执行如下命令创建一个YAML文件。
cube.yaml
为文件名,请根据实际情况替换。vim cube.yaml
在YAML文件输入如下脚本,并根据实际情况设置其中的参数。
重要请确保
configName
字段值在安装Logtail组件的Project中唯一。每个iLogtail采集配置必须单独设置一个对应的CR,如果多个CR关联同一个Logtail配置,后配置的CR将不会生效。
AliyunPipelineConfig
的参数,请参见【推荐】使用AliyunPipelineConfig管理采集配置。本文的iLogtail采集配置样例包含基础的文本日志采集功能,参数说明参见CreateLogtailPipelineConfig - 创建Logtail流水线配置。请确保config.flushers.Logstore参数配置的Logstore已存在,可以通过配置spec.logstore参数自动创建Logstore。
采集所有容器内的单行文本日志
创建名为
example-k8s-file
的iLogtail采集配置,以单行文本模式采集集群内所有容器内的/data/logs/app_1
路径下的test.LOG
文件,直接发送到名称为k8s-file
的Logstore,该Logstore属于名称为k8s-log-test
的Project。apiVersion: telemetry.alibabacloud.com/v1alpha1 # 创建一个 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名 name: example-k8s-file spec: # 指定目标project project: name: k8s-log-test # 创建用于存储日志的 Logstore logstores: - name: k8s-file # 定义iLogtail采集配置 config: # 定义输入插件 inputs: # 使用input_file插件采集容器内文本日志 - Type: input_file # 容器内的文件路径 FilePaths: - /data/logs/app_1/**/test.LOG # 启用容器发现功能。 EnableContainerDiscovery: true # 定义输出插件 flushers: # 使用flusher_sls插件输出到指定Logstore。 - Type: flusher_sls # 需要确保该 Logstore 存在 Logstore: k8s-file # 需要确保 endpoint 正确 Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
采集指定容器内的单行文本日志
创建名为
example-k8s-file
的iLogtail采集配置,对于集群内名称包含app
的所有容器,以单行文本模式采集/data/logs/app_1
路径下的test.LOG
文件,直接发送到名称为
k8s-file
的Logstore,该Logstore属于名称为k8s-log-test
的Project。apiVersion: telemetry.alibabacloud.com/v1alpha1 # 创建一个 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名 name: example-k8s-file spec: # 指定目标project project: name: k8s-log-test # 创建用于存储日志的 Logstore logstores: - name: k8s-file # 定义iLogtail采集配置 config: # 定义输入插件 inputs: # 使用input_file插件采集容器内文本日志 - Type: input_file # 容器内的文件路径 FilePaths: - /data/logs/app_1/**/test.LOG # 启用容器发现功能。 EnableContainerDiscovery: true # 添加容器信息过滤条件,多个选项之间为“且”的关系。 ContainerFilters: # 指定待采集容器所在 Pod 所属的命名空间,支持正则匹配。 K8sNamespaceRegex: default # 指定待采集容器的名称,支持正则匹配。 K8sContainerRegex: ^(.*app.*)$ # 定义输出插件 flushers: # 使用flusher_sls插件输出到指定Logstore。 - Type: flusher_sls # 需要确保该 Logstore 存在 Logstore: k8s-file # 需要确保 endpoint 正确 Endpoint: cn-hangzhou.log.aliyuncs.com Region: cn-hangzhou TelemetryType: logs
采集所有容器内的多行文本日志并正则解析
创建名为
example-k8s-file
的iLogtail采集配置,以多行文本模式采集集群内所有容器内的/data/logs/app_1
路径下的test.LOG
文件,对采集到的数据进行JSON解析,直接发送到名称为k8s-file
的Logstore,该Logstore属于名称为k8s-log-test
的Project。下面样例中的日志原文通过input_file插件读取后格式为
{"content": "2024-06-19 16:35:00 INFO test log\nline-1\nline-2\nend"}
,会被正则解析插件解析为{"time": "2024-06-19 16:35:00", "level": "INFO", "msg": "test log\nline-1\nline-2\nend"}
apiVersion: telemetry.alibabacloud.com/v1alpha1 # 创建一个 ClusterAliyunPipelineConfig kind: ClusterAliyunPipelineConfig metadata: # 设置资源名,在当前Kubernetes集群内唯一。该名称也是创建出的iLogtail采集配置名 name: example-k8s-file spec: # 指定目标project project: name: k8s-log-test # 创建用于存储日志的 Logstore logstores: - name: k8s-file # 定义iLogtail采集配置 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 # 开启多行能力 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
执行如下命令使iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的文本日志,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
CRD-AliyunLogConfig
您只需要创建AliyunLogConfig CR即可创建iLogtail采集配置,创建完成后自动生效。对于通过CR创建的iLogtail采集配置,其修改只能通过更新相应的CR来实现。
执行如下命令创建一个YAML文件。
cube.yaml
为文件名,请根据实际情况替换。vim cube.yaml
在YAML文件输入如下脚本,并根据实际情况设置其中的参数。
重要请确保
configName
字段值在安装Logtail组件的Project中唯一。如果多个CR关联同一个iLogtail采集配置,则删除或修改任意一个CR均会影响到该iLogtail采集配置,导致其他关联该iLogtail采集配置的CR状态与日志服务中iLogtail采集配置的状态不一致。
CR字段的格式请参见使用AliyunLogConfig管理采集配置。本文的iLogtail采集配置样例包含基础的文本日志采集功能,具体参数参见CreateConfig - 创建Logtail采集配置。
采集所有容器内的单行文本日志
创建名为
example-k8s-file
的iLogtail采集配置,以单行文本模式采集集群内所有容器内的/data/logs/app_1
路径下的test.LOG
文件,直接发送到名称为k8s-file
的Logstore,该Logstore属于名称为k8s-log-test
的Project。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 # 设置iLogtail采集配置。 logtailConfig: # 设置采集的数据源类型。采集文本日志时,需设置为file。 inputType: file # 设置iLogtail采集配置的名称。 configName: example-k8s-file inputDetail: # 指定通过极简模式采集文本日志。 logType: common_reg_log # 设置日志文件所在路径。 logPath: /data/logs/app_1 # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。 filePattern: test.LOG # 采集容器的文本日志时,需设置dockerFile为true。 dockerFile: true
执行如下命令使其iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的文本日志,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
查看Logtail采集配置
控制台
登录日志服务控制台。
在Project列表区域,单击目标Project。
在 页签中,单击目标日志库前面的>,依次选择 。
单击目标Logtail采集配置,查看Logtail采集配置详情。
(推荐)CRD-AliyunPipelineConfig
查看由AliyunPipelineConfig创建的Logtail采集配置
查看由AliyunPipelineConfig创建的Logtail采集配置的详细信息
CRD-AliyunLogConfig
查看由AliyunLogConfig创建的iLogtail采集配置
查看由AliyunLogConfig创建的iLogtail采集配置的详细信息
查询分析已采集的日志
在Project列表中,单击目标Project,进入对应的Project详情页面。
在对应的日志库右侧的图标,选择查询分析,查看Kubernetes集群输出的日志。
容器日志文本默认字段
每条容器文本日志默认包含的字段如下表所示。
字段名称 | 说明 |
__tag__:__hostname__ | 容器宿主机的名称。 |
__tag__:__path__ | 容器内日志文件的路径。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的镜像名称。 |
__tag__:_pod_name_ | Pod的名称。 |
__tag__:_namespace_ | Pod所属的命名空间。 |
__tag__:_pod_uid_ | Pod的唯一标识符(UID)。 |
相关文档
当您使用Logtail采集容器(标准容器、Kubernetes)日志遇到异常情况时,您可以参见如何排查容器日志采集异常进行排查。
采集Kubernetes容器标准输出的步骤,请参见通过DaemonSet方式采集Kubernetes容器标准输出。