如需采集Knative服务的容器文本日志,您可以通过DaemonSet的方式,在每个节点上自动运行一个日志代理,以提升运维效率。ACK集群已兼容日志服务SLS,支持无侵入式采集日志。您可以安装日志组件Logtail,该组件会在节点上部署一个Logtail实例,用于收集节点上所有容器的日志,便于后续的管理和分析。
工作原理
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
。
前提条件
已在集群中部署Knative,请参见部署Knative。
已创建一个Knative服务,请参见快速部署一个Knative服务。
已开通日志服务,请参见开通日志服务。
步骤一:安装Logtail组件
Logtail是SLS提供的日志采集Agent,支持无侵入式采集ACK集群中产生的日志。您无需修改应用程序代码,Logtail采集日志时不会影响您的应用程序运行。您可以在ACK集群中安装Logtail组件,安装完成后,Logtail会自动部署logtail-ds DaemonSet,用于采集节点的日志。
请确保仅使用一款日志采集工具例如Logtail,来采集并发送容器日志到SLS。同时使用这两个组件可能会导致容器日志被重复采集和发送,带来额外的费用和资源消耗。
升级Logtail、查看Logtail版本及IP地址、查看Logtail的运行日志等操作步骤,请参见安装Logtail组件(阿里云Kubernetes集群)。
创建集群时安装
登录容器服务管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面中,单击页面右上角的创建集群。
以下仅介绍开启日志服务的关键步骤。关于创建集群的具体操作,请参见创建ACK托管集群。
在组件配置配置项页中,选中使用日志服务,表示在新建的Kubernetes集群中安装日志插件。
当选中使用日志服务后,会出现创建项目(Project)的提示。关于日志服务管理日志的组织结构,请参见项目(Project)。有以下两种创建Project的方式。
单击使用已有Project,选择一个现有的Project来管理采集的日志。
单击创建新Project,自动创建一个新的Project来管理采集的日志,Project会自动命名为
k8s-log-{ClusterID}
,其中,ClusterID是您新建的Kubernetes集群的唯一标识。
配置完成后,单击右下角的创建集群,在弹出的窗口中单击确定,完成创建。
完成创建后,您可在集群列表页面查看开启了Logtail的ACK集群。
为已有集群安装
登录容器服务管理控制台。
在控制台左侧导航栏,单击集群。
在集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情。
在集群管理页左侧导航栏中,选择运维管理>组件管理,并在日志与监控区域找到logtail-ds。
在logtail-ds组件右侧,单击安装,并在安装组件对话框中单击确定。
如果您已安装的日志服务组件为旧版本,可以在logtail-ds组件右侧,单击升级。
升级logtail-ds组件后,会重置组件参数。如果您曾自定义logtail-ds或alibaba-log-controller的配置和环境变量,参数将被覆盖,请重新配置。具体操作,请参见手动升级。
步骤二:配置Logtail采集配置
建议您只选择以下一种方式配置Logtail采集配置。
CRD:可以通过Kubernetes的工具进行批量配置和版本控制,适合集中管理多个Logtail采集配置。通过CRD创建的Logtail采集配置不会同步到控制台,因此如需修改这些配置,必须直接修改CRD资源,不要直接在控制台操作,否则导致Logtail采集配置不一致。
日志服务控制台:适合少量Logtail采集配置的创建和管理,无需登录Kubernetes集群,操作步骤简单但无法批量配置,配置的优先级低于CRD。
环境变量:只支持单行文本,如果要配置多行文本或其他日志格式,必须使用CRD或在日志服务控制台配置。
Logtail采集配置项包括:是否过滤某些容器、是否忽略指定的目录或文件(采集黑名单)、是否允许文件多次采集等。
(推荐)CRD-AliyunPipelineConfig
创建Logtail采集配置
使用AliyunPipelineConfig,需要日志组件版本最低为0.5.1。
您只需要创建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采集配置,对于集群内名称包含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采集配置,以单行文本模式采集集群内所有名称开头为app
的Pod的容器内的/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 #设置容器过滤条件。 advanced: k8s: K8sPodRegex: '^(app.*)$'
执行如下命令使其iLogtail采集配置生效。iLogtail采集配置生效后,Logtail开始采集各个容器上的文本日志,并发送到日志服务中。
cube.yaml
为文件名,请根据实际情况替换。kubectl apply -f cube.yaml
重要采集到日志后,您需要先创建索引,才能在Logstore中查询和分析日志。具体操作,请参见创建索引。
日志服务控制台
登录日志服务控制台。
单击控制台右侧的快速接入数据,在接入数据区域单击Kubernetes-文件卡片。
选择目标Project和Logstore,单击下一步。选择您在安装Logtail组件时所使用的Project。Logstore为您自定义创建的Logstore。
在机器组配置页面。
根据实际场景,单击以下页签:
- 重要
不同页签的后续配置步骤不同,请根据实际需求正确选择。
确认目标机器组已在应用机器组列表中,然后单击下一步。在ACK中安装Logtail组件后,日志服务自动创建名为
k8s-group-${your_k8s_cluster_id}
的机器组,您可以直接使用该机器组。重要如果需要新建机器组,请单击创建机器组,按照右侧面板进行创建。更多信息,请参见通过控制台配置。
如果机器组心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
创建Logtail采集配置,单击下一步创建Logtail采集配置,日志服务开始采集日志。
说明Logtail采集配置生效时间最长需要3分钟,请耐心等待。
创建索引和预览数据,然后单击下一步。日志服务默认开启全文索引。您也可以根据采集到的日志,手动创建字段索引,或者单击自动生成索引,日志服务将自动生成字段索引。更多信息,请参见创建索引。
重要如果需要查询日志中的所有字段,建议使用全文索引。如果只需查询部分字段、建议使用字段索引,减少索引流量。如果需要对字段进行分析(SELECT语句),必须创建字段索引。
单击查询日志,系统将跳转至Logstore查询分析页面。
您需要等待1分钟左右,待索引生效后,才能在原始日志页签中,查看已采集到的日志。更多信息,请参见查询和分析日志。
环境变量
1. 创建服务时配置日志服务
您可以在创建Knative服务时参见下方YAML模板配置日志采集。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击服务管理页签,选择命名空间后单击使用模块创建,选择示例模板为自定义模板,按照页面指引参见以下YAML文件完成创建。
YAML模板的语法同Kubernetes语法,但是为了给容器指定采集配置,需要使用
env
来为容器增加采集配置和自定义Tag,并根据采集配置,创建对应的volumeMounts
和volumes
。以下是一个简单的Pod示例。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld-go-log spec: template: spec: containers: - name: my-demo-app image: 'registry.cn-hangzhou.aliyuncs.com/log-service/docker-log-test:latest' env: # 配置环境变量 - name: aliyun_logs_log-stdout value: stdout - name: aliyun_logs_log-varlog value: /var/demo/*.log - name: aliyun_logs_mytag1_tags value: tag1=v1 # 配置volume mount volumeMounts: - name: volumn-sls-mydemo mountPath: /var/demo # 如果Pod不断重启,启动参数可以添加sleep command: ["sh", "-c"] # 使用shell来运行命令 args: ["sleep 3600"] # 设置休眠时间为1小时(3600秒) volumes: - name: volumn-sls-mydemo emptyDir: {}
根据您的需求,按照以下顺序进行配置。
说明如果您有更多的日志采集需求,请参见(可选)2. 配置环境变量的高级参数。
通过环境变量来创建您的采集配置和自定义Tag,所有与配置相关的环境变量都采用
aliyun_logs_
作为前缀。创建采集配置的规则如下:
- name: aliyun_logs_log-stdout value: stdout - name: aliyun_logs_log-varlog value: /var/demo/*.log
示例中创建了两个采集配置,格式为
aliyun_logs_{key}
,对应的{key}
分别为log-stdout
和log-varlog
。aliyun_logs_log-stdout
:该env表示创建一个名为log-stdout
的Logstore
,日志采集路径为stdout
的配置,对应的日志服务采集配置名称也是log-stdout
,目的是将容器的标准输出采集到log-stdout
这个Logstore
中。aliyun_logs_log-varlog
:该env表示创建一个Logstore
名为log-varlog
,日志采集路径为/var/demo/*.log的配置,对应的日志服务采集配置名称也是log-varlog
,目的是将容器的/var/demo/*.log文件内容采集到log-varlog
这个Logstore
中。
创建自定义Tag的规则如下:
- name: aliyun_logs_mytag1_tags value: tag1=v1
配置Tag后,当采集到该容器的日志时,会自动附加对应的字段到日志服务。其中
mytag1
为任意不包含'_'的名称
。
如果您的采集配置中指定了非stdout的采集路径,需要在此部分创建相应的
volumeMounts
。示例中采集配置添加了对/var/demo/*.log的采集,因此相应地添加了/var/demo的
volumeMounts
。
当YAML编写完成后,单击创建,即可将相应的配置交由Kubernetes集群执行。
(可选)2. 配置环境变量的高级参数
通过容器环境变量配置采集支持多种配置参数。您可以根据实际需求设置高级参数,以满足日志采集的特殊需求。
通过容器环境变量配置采集日志的方式不适用于边缘场景。
字段 | 说明 | 示例 | 注意事项 |
aliyun_logs_{key} |
|
|
|
aliyun_logs_{key}_tags | 可选。值为{tag-key}={tag-value}类型,用于对日志进行标识。 |
| 不涉及。 |
aliyun_logs_{key}_project | 可选。值为指定的日志服务Project。当不存在该环境变量时,为您安装时所选的Project。 |
| Project需与您的Logtail工作所在的Region一致。 |
aliyun_logs_{key}_logstore | 可选。值为指定的日志服务Logstore。当不存在该环境变量时,Logstore和{key}一致。 |
| 不涉及。 |
aliyun_logs_{key}_shard | 可选。值为创建Logstore时的shard数,取值范围为[1 , 10]。当不存在该环境变量时,值为2。 说明 若logstore已经存在,则该参数不生效。 |
| 不涉及。 |
aliyun_logs_{key}_ttl | 可选。值为指定的日志保存时间,取值范围为[1 , 3650]。
说明 若Logstore已经存在,则该参数不生效。 |
| 不涉及。 |
aliyun_logs_{key}_machinegroup | 可选。值为应用的机器组。当不存在该环境变量时与安装Logtail的默认机器组一致。关于该参数的详细使用方法,请参见下文的定制需求2:将不同应用数据采集到不同的Project。 |
| 不涉及。 |
aliyun_logs_{key}_logstoremode | 可选。值为指定的日志服务Logstore的类型,不指定该参数的话,默认值为standard,取值: 说明 若Logstore已经存在,则该参数不生效。
|
| 该参数需要logtail-ds镜像版本>=1.3.1。 |
步骤三:查询分析日志
Logtail采集到的容器日志会存储在SLS Logstore中。您可以在日志服务控制台查看,也可以在ACK控制台查看。查询语法的介绍,请参见查询概述。
ACK控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在日志中心页面,单击应用日志页签,设置检索条件后单击选择日志库,查看应用容器的相关日志。
SLS控制台
安装成功后,进入日志服务控制台。
在进入控制台后,在Project列表区域选择Kubernetes集群对应的Project(默认为k8s-log-{Kubernetes集群ID}),进入日志库列表页签。
在列表中找到相应的Logstore(采集配置中指定),将鼠标悬浮在相应的Logstore名称的右侧,单击图标,并单击查询分析。
本例中,在日志查询页面,您可以查看Tomcat应用的标准输出日志和容器内文本日志,并可以发现自定义tag附加到日志字段中。
容器日志文本默认字段
每条容器文本日志默认包含的字段如下表所示。
字段名称 | 说明 |
__tag__:__hostname__ | 容器宿主机的名称。 |
__tag__:__path__ | 容器内日志文件的路径。 |
__tag__:_container_ip_ | 容器的IP地址。 |
__tag__:_image_name_ | 容器使用的镜像名称。 |
__tag__:_pod_name_ | Pod的名称。 |
__tag__:_namespace_ | Pod所属的命名空间。 |
__tag__:_pod_uid_ | Pod的唯一标识符(UID)。 |
相关文档
如过在使用SLS Logstore时遇到问题,例如如何变更日志保存天数、关闭日志采集等,请参见Logstore相关问题排查。
关于如何进行异常排查,请参见Logtail采集日志失败的排查思路。
您可以查看Knative应用的监控大盘,请参见查看Knative服务监控大盘。
您可以基于SLS实现监控告警,请参见为Knative服务开启监控告警。