有奖捉虫:行业应用 & 管理与支持文档专题 HOT
本文将介绍如何在控制台配置腾讯云容器服务(Tencent Kubernetes Engine,TKE) K8S 集群的日志采集规则并投递到 腾讯云日志服务 CLS

使用场景

TKE K8S 业务日志采集功能是为用户提供的腾讯云 TKE Kubernetes 集群内的业务日志采集工具,可以将集群内的业务日志、审计日志和事件日志发送至 腾讯云日志服务 CLS。 日志采集功能需要为集群安装日志采集组件并配置采集规则。日志采集组件安装后,日志采集 Agent 会在集群内以 DaemonSet 的形式运行,并根据用户通过日志采集规则配置的采集源、CLS 日志主题和日志解析方式,从采集源进行日志采集,将日志内容发送到日志消费端。您可根据以下操作安装并配置日志采集。

前提条件

已在 TKE控制台 创建集群。CLS 支持采集 TKE 的标准集群、弹性集群、边缘集群。

集群业务日志采集

步骤1:选择集群

2. 在左侧导航栏中,单击容器集群管理,进入容器集群管理页面。
3. 在页面右上角选中 TKE
?
?
?
4. 选择 TKE 集群所在地域, 并找到目标采集集群。
5. 若采集组件状态为未安装,点击安装,安装日志采集组件。
?
?
?
注意:
安装日志采集组件将在集群 kube-system 命名空间下,以 DaemonSet 的方式部署一个 tke-log-agent 的 pod 和一个 cls-provisioner 的 pod。 请为每个节点至少预留0.1核16Mib 以上的可用资源。
6. 若采集组件状态为最新,点击右侧新建采集配置,进入集群日志采集配置流程。
?
?
?

步骤2:配置日志主题

进入集群日志采集配置流程,在创建日志主题步骤中,您可选择已有或创建用于存储日志的日志主题。关于日志主题请参考 日志主题
?
?
?

步骤3:配置采集规则

完成日志主题的选择后,点击下一步进入采集配置即可配置采集规则,配置信息如下:
日志源配置
?
?
?
采集规则名称:您可以自定义日志采集规则名称。
采集类型:目前采集类型支持容器标准输出、容器文件路径和节点文件路径。
容器标准输出
容器文件路径
节点文件路径
支持所有容器指定工作负载指定 Pod Lables 三种方式指定容器标准输出的采集日志源。
所有容器:代表采集指定命名空间下的所有容器中的标准输出日志,如下图所示:
?
?
指定工作负载:代表采集指定命名空间下,指定工作负载中,指定容器的标准输出日志如下图所示:
?
?
指定 Pod Lables:代表采集指定命名空间下,所有带有指定Pod Label的容器中的标准输出日志,如下图所示:
?
?
注意:
“容器文件路径” 不能为软链接,否则会导致软链接的实际路径在采集器的容器内不存在,采集日志失败。
支持指定工作负载指定 Pod Lables 两种方式指定容器文件路径的采集日志源。
指定工作负载:代表采集指定命名空间下、指定工作负载中、指定容器中的容器文件路径,如下图所示:
?
?
?
指定 Pod Lables:代表采集指定命名空间下,所有带有指定 Pod Label 的容器中的容器文件路径,如下图所示:
?
?
?
容器文件路径由日志目录与文件名组成,日志目录前缀以 / 开头,文件名以非 / 开头,前缀和文件名均支持使用通配符 ? 和 *,不支持逗号。/**/代表日志采集组件将监听所填前缀目录下的所有层级匹配上的日志文件。多文件路径之间为或关系。例如:当容器文件路径为 /opt/logs/*.log,可以指定目录前缀为 /opt/logs,文件名为 *.log的日志。
注意:
仅版本1.1.12及以上的容器采集组件支持多采集路径。
仅升级至1.1.12及以上版本后创建的采集配置支持定义多采集路径。
版本1.1.12以下创建的采集配置在升级至1.1.12后不支持配置多采集路径,需重新创建采集配置。
采集路径黑名单。 开启后可在采集时忽略指定的目录路径或完整的文件路径。目录路径和文件路径可以是完全匹配,也支持通配符模式匹配。
?
?
采集黑名单分为两类过滤类型,且可以同时使用:
文件路径:采集路径下,需要忽略采集的完整文件路径,支持通配符*或?,支持**路径模糊匹配。
目录路径:采集路径下,需要忽略采集的目录前缀,支持通配符*或?,支持**路径模糊匹配。
注意:
需要容器日志采集组件1.1.2及以上版本。
采集黑名单是在采集路径下进行排除,因此无论是文件路径模式,还是目录路径模式,其指定路径要求为采集路径的子集。
?
节点文件路径由日志目录与文件名组成,日志目录前缀以 / 开头,文件名以非 / 开头,前缀和文件名均支持使用通配符 ? 和 *,不支持逗号。/**/代表日志采集组件将监听所填前缀目录下的所有层级匹配上的日志文件。多文件路径之间为或关系。例如:当节点文件路径为 /opt/logs/*.log,可以指定目录前缀为 /opt/logs,文件名为 *.log的日志。
注意:
仅版本1.1.12及以上的采集组件支持多采集路径。
仅升级至1.1.12及以上版本后创建的采集配置支持定义多采集路径。
版本1.1.12以下创建的采集配置在升级至1.1.12后不支持配置多采集路径,需重新创建采集配置。
采集路径黑名单。 开启后可在采集时忽略指定的目录路径或完整的文件路径。目录路径和文件路径可以是完全匹配,也支持通配符模式匹配。
?
?
采集黑名单分为两类过滤类型,且可以同时使用:
文件路径:采集路径下,需要忽略采集的完整文件路径,支持通配符*或?,支持**路径模糊匹配。
目录路径:采集路径下,需要忽略采集的目录前缀,支持通配符*或?,支持**路径模糊匹配。
注意:
需要容器日志采集组件1.1.2及以上版本。
采集黑名单是在采集路径下进行排除,因此无论是文件路径模式,还是目录路径模式,其指定路径要求为采集路径的子集。
?
元数据配置
?
?
除了原始的日志内容, 日志服务还会带上容器或 kubernetes 相关的元数据(例如:产生日志的容器 ID)一起上报到 CLS,方便用户查看日志时追溯来源或根据容器标识、特征(例如:容器名、labels)进行检索。您可以自行选择是否需要上报这些元数据,按需勾选上传。 容器或 kubernetes 相关的元数据请参见下方表格:
字段名
含义
container_id
日志所属的容器 ID。
container_name
日志所属的容器名称。
image_name
日志所属容器的镜像名称 IP。
namespace
日志所属 pod 的 namespace。
pod_uid
日志所属 pod 的 UID。
pod_name
日志所属 pod 的名字。
pod_ip
日志所属 pod 的 IP 地址。
pod_lable_{label name}
日志所属 pod 的 label(例如一个 pod 带有两个 label:app=nginx,env=prod,则在上传的日志会附带两个 metedata:pod_label_app:nginx,pod_label_env:prod)。
说明:
如果想采集部分 podlabel,需要手动输入想要的 label key (可以输入多个,每输入一个以回车结束),命中的话会采集。
解析规则配置
?
?
?
配置采集策略。您可以选择全量或者增量
全量:全量采集指从日志文件的开头开始采集。
增量:增量采集指只采集文件内新增的内容
编码模式:支持 UTF-8GBK
提取模式:支持多种类型的提取模式,详情如下:
单行全文格式
多行全文格式
单行-完全正则格式
多行-完全正则格式
JSON格式
分隔符
组合解析
单行全文日志是指一行日志内容为一条完整的日志。日志服务在采集的时候,将使用换行符 \\n 来作为一条日志的结束符。为了统一结构化管理,每条日志都会存在一个默认的键值__CONTENT__,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。
假设一条日志原始数据为:
Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
采集到日志服务的数据为:
__CONTENT__:Tue Jan 22 12:08:15 CST 2019 Installed: libjpeg-turbo-static-1.2.90-6.el7.x86_64
多行全文日志是指一条完整的日志数据可能跨占多行(例如 Java stacktrace)。在这种情况下,以换行符 \\n 为日志的结束标识符就显得有些不合理,为了能让日志系统明确区分开每条日志,采用首行正则的方式进行匹配,当某行日志匹配上预先设置的正则表达式,就认为是一条日志的开头,而下一个行首出现作为该条日志的结束标识符.
多行全文也会设置一个默认的键值__CONTENT__,但日志数据本身不再进行日志结构化处理,也不会提取日志字段,日志属性的时间项由日志采集的时间决定。
假设一条多行日志原始数据为:
2019-12-15 17:13:06,043 [main] ERROR com.test.logging.FooFactory:
java.lang.NullPointerException
at com.test.logging.FooFactory.createFoo(FooFactory.java:15)
at com.test.logging.FooFactoryTest.test(FooFactoryTest.java:11)
首行正则表达式为如下:
\\d{4}-\\d{2}-\\d{2}\\s\\d{2}:\\d{2}:\\d{2},\\d{3}\\s.+
采集到日志服务的数据为:
__CONTENT__:2019-12-15 17:13:06,043 [main] ERROR com.test.logging.FooFactory:\\njava.lang.NullPointerException\\n at com.test.logging.FooFactory.createFoo(FooFactory.java:15)\\n at com.test.logging.FooFactoryTest.test(FooFactoryTest.java:11)
单行完全正则格式通常用来处理结构化的日志,指将一条完整日志按正则方式提取多个 key-value 的日志解析模式。
假设一条日志原始数据为:
10.135.46.111 - - [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0" 0.354 0.354
配置的正则表达式为如下:
(\\S+)[^\\[]+(\\[[^:]+:\\d+:\\d+:\\d+\\s\\S+)\\s"(\\w+)\\s(\\S+)\\s([^"]+)"\\s(\\S+)\\s(\\d+)\\s(\\d+)\\s(\\d+)\\s"([^"]+)"\\s"([^"]+)"\\s+(\\S+)\\s(\\S+).*
采集到日志服务的数据为:
body_bytes_sent: 9703
http_host: 127.0.0.1
http_protocol: HTTP/1.1
http_referer: http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum
http_user_agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0
remote_addr: 10.135.46.111
request_length: 782
request_method: GET
request_time: 0.354
request_url: /my/course/1
status: 200
time_local: [22/Jan/2019:19:19:30 +0800]
upstream_response_time: 0.354
假设您的一条日志原始数据为:
[2018-10-01T10:30:01,000] [INFO] java.lang.Exception: exception happened
at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
行首正则表达式为:
\\[\\d+-\\d+-\\w+:\\d+:\\d+,\\d+]\\s\\[\\w+]\\s.*
配置的自定义正则表达式为:
\\[(\\d+-\\d+-\\w+:\\d+:\\d+,\\d+)\\]\\s\\[(\\w+)\\]\\s(.*)
系统根据()捕获组提取对应的 key-value 后,您可以自定义每组的 key 名称如下所示:
time: 2018-10-01T10:30:01,000`
level: INFO`
msg:java.lang.Exception: exception happened
at TestPrintStackTrace.f(TestPrintStackTrace.java:3)
at TestPrintStackTrace.g(TestPrintStackTrace.java:7)
at TestPrintStackTrace.main(TestPrintStackTrace.java:16)
假设您的一条 JSON 日志原始数据为:
{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}
经过日志服务结构化处理后,该条日志将变为如下:
agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0
body_sent: 23
http_host: 127.0.0.1
method: POST
referer: http://127.0.0.1/my/course/4
remote_ip: 10.135.46.111
request: POST /event/dispatch HTTP/1.1
response_code: 200
responsetime: 0.232
time_local: 22/Jan/2019:19:19:34 +0800
upstreamhost: unix:/tmp/php-cgi.sock
upstreamtime: 0.232
url: /event/dispatch
xff: -
假设您的一条日志原始数据为:
10.20.20.10 - ::: [Tue Jan 22 14:49:45 CST 2019 +0800] ::: GET /online/sample HTTP/1.1 ::: 127.0.0.1 ::: 200 ::: 647 ::: 35 ::: http://127.0.0.1/
当日志解析的分隔符指定为:::,该条日志会被分割成八个字段,并为这八个字段定义唯一的 key,如下所示:
IP: 10.20.20.10 -
bytes: 35
host: 127.0.0.1
length: 647
referer: http://127.0.0.1/
request: GET /online/sample HTTP/1.1
status: 200
time: [Tue Jan 22 14:49:45 CST 2019 +0800]
假设您的一条日志的原始数据为:
1571394459,http://127.0.0.1/my/course/4|10.135.46.111|200,status:DEAD,
自定义插件内容如下:
{
"processors": [
{
"type": "processor_split_delimiter",
"detail": {
"Delimiter": ",",
"ExtractKeys": [ "time", "msg1","msg2"]
},
"processors": [
{
"type": "processor_timeformat",
"detail": {
"KeepSource": true,
"TimeFormat": "%s",
"SourceKey": "time"
}
},
{
"type": "processor_split_delimiter",
"detail": {
"KeepSource": false,
"Delimiter": "|",
"SourceKey": "msg1",
"ExtractKeys": [ "submsg1","submsg2","submsg3"]
},
"processors": []
},
{
"type": "processor_split_key_value",
"detail": {
"KeepSource": false,
"Delimiter": ":",
"SourceKey": "msg2"
}
}
]
}
]
}
经过日志服务结构化处理后,该条日志将变为如下:
time: 1571394459
submsg1: http://127.0.0.1/my/course/4
submsg2: 10.135.46.111
submsg3: 200
status: DEAD
过滤器:LogListener 仅采集符合过滤器规则的日志,Key 支持完全匹配,过滤规则支持正则匹配,如仅采集 ErrorCode = 404 的日志。您可以根据需求开启过滤器并配置规则。

步骤4:配置索引

完成采集规则配置后, 点击下一步,进入索引配置,有关索引请参考 索引
并在索引配置中配置如下信息:
索引状态:确认是否开启索引, 以使用日志检索等分析功能。
全文索引:确认是否需要设置大小写敏感。全文分词符:默认为"@&()='",;:<>[]{}/ \\n\\t\\r",确认是否需要修改。
是否包含中文:确认是否开启。
键值索引:您可根据 key 名按需进行字段类型、分词符以及是否开启统计分析的配置。若您需要开启键值索引,可打开开关。
?
?
注意
检索必须开启索引配置,否则无法检索。
若需要基于日志字段检索日志,需配置键值索引。
若需要基于日志字段进行统计分析,需配置键值索引,并开启统计。
索引规则编辑后仅对新写入的日志生效,已有数据不会更新。

步骤5:检索日志

至此,即完成了 TKE K8S 集群业务日志采集的所有部署。您可以前往 CLS 控制台 > 检索分析 查看采集上来的日志。
?
?
?

集群审计/事件日志采集

说明:
集群审计日志记录了对 kube-apiserver 的访问事件,会按顺序记录每个用户、管理员或系统组件影响集群的活动。
集群事件日志记录了包括了 集群的运行和各类资源的调度情况。

步骤1:选择集群

2. 在左侧导航栏中,单击概览容器集群管理,进入概览容器集群管理页面。
3. 在页面右上角选中 TKE。
?
?
?
4. 选择 TKE 集群所在地域,并找到目标采集集群。
5. 若采集组件状态为未安装,点击安装,安装日志采集组件。
?
?
?
注意:
安装日志采集组件将在集群 kube-system 命名空间下,以 DaemonSet 的方式部署一个 tke-log-agent 的 pod 和一个 cls-provisioner 的 pod。 请为每个节点至少预留0.1核16Mib 以上的可用资源。
6. 若采集组件状态为最新,点击集群名称,进入集群详情页,并在集群详情页中找到集群审计日志集群事件日志。
?
?
?
7. 点击开启集群审计或事件日志,并进入集群审计事件日志配置流程。

步骤2:选择日志主题

进入审计或事件日志配置流程,在创建日志主题步骤中,您可选择已有或创建用于存储日志的日志主题。日志主题的相关信息请参考 日志主题
?
?
?

步骤3:索引配置

完成日志主题配置后, 点击下一步进入索引配置,索引的相关信息请参考 索引
索引配置中的配置信息如下:
索引状态:确认是否开启索引, 以使用日志检索等分析功能。
全文索引:确认是否需要设置大小写敏感。全文分词符:默认为"@&()='",;:<>[]{}/ \\n\\t\\r",确认是否需要修改。
是否包含中文:确认是否开启。
键值索引:您可根据 key 名按需进行字段类型、分词符以及是否开启统计分析的配置。若您需要开启键值索引,可打开开关。
?
?
注意
检索必须开启索引配置,否则无法检索。
若需要基于日志字段检索日志,需配置键值索引。
若需要基于日志字段进行统计分析,需配置键值索引,并开启统计。
索引规则编辑后仅对新写入的日志生效,已有数据不会更新。

步骤4:检索日志

至此, 即完成了 TKE K8S 集群审计或事件业务日志采集的所有部署。您可以前往 CLS 控制台 > 检索分析 查看采集上来的日志。
?
?
?

其他操作

管理业务日志采集配置

1. 容器集群管理页中,找到目标 TKE 集群,并点击集群名称,进入集群详情页。
2. 在集群详情页中,您可以在集群业务日志中查看并管理您的集群业务日志采集配置。
?
?
?

升级日志采集组件

容器集群管理页中,找到目标 TKE 集群,若采集组件状态显示 “可升级”,可点击升级,将日志采集组件升级至最新版本。
?
?

卸载日志采集组件

容器集群管理页中,找到目标 TKE 集群,点击操作中的更多,并在下拉框中点击卸载日志采集组件
?
?
?


http://www.vxiaotou.com