alicloud k8s 日志接入 sls

采集原理

通过 DaemonSet 模式在每个 node 上运行 logtail client,客户端启动后加入指定 machine-group,通过 docker.sock 与 ecs 上的 docker daemon 通讯,通过检索 container 环境变量来查找符合采集规则的 container,以及定位内部文件和容器 stdout 日志,在通过监听内核 inotify 事件来进行日志文件变化监听。

Pod 日志接入模式(环境变量注入)

通过在pod中注入环境变量aliyun_logs_{key} 来接入aliyun SLS日志系统,如未指定project 则使用在DaemonSet 模式默认部署的 logtail 默认配置。

logtail-ds configMap

采集插件安装不再赘述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: v1
data:
cpu-core-limit: "2"
log-ali-uid: "163139xxxxxxxx497"
log-config-path: /etc/ilogtail/conf/cn-hangzhou/ilogtail_config.json
log-endpoint: cn-hangzhou-intranet.log.aliyuncs.com
log-machine-group: k8s-group-cbe7f0d404866409exxxxxxcefeda
log-project: k8s-log-c79a7ce35db39488xxxxxx9432e53e6
max-bytes-per-sec: "209715200"
mem-limit: "512"
send-requests-concurrency: "20"
kind: ConfigMap
metadata:
name: alibaba-log-configuration
namespace: kube-system

环境变量

支持的环境变量
aliyun_logs_{key} 必选项。{key}只能包含小写字母、数字和-。若不存在aliyun_logs_{key}_logstore,则默认创建并采集到名为{key}的logstore。当值为stdout表示采集容器的标准输出;其他值为容器内的日志路径。 默认采集方式为极简模式, {key}需保持在K8s集群内唯一。
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。 -
aliyun_logs_{key}_ttl 可选。值为指定的日志保存时间,有效值为1~3650。当取值为3650时,指定日志的保存时间为永久保存。当不存在该环境变量时,默认指定日志的保存时间为90天。 -
aliyun_logs_{key}_machinegroup 可选。值为应用的机器组。当不存在该环境变量时与安装Logtail的默认机器组一致。 -

Example

Step1

创建测试容器,并注入环境变量

1
2
3
4
5
6
7
8
9
10
11
12
template:
metadata:
creationTimestamp: null
labels:
app.kubernetes.io/instance: xiemx-training
app.kubernetes.io/name: xiemx-training
spec:
containers:
- env:
- name: aliyun_logs_xiemx-training-stdout-log
value: stdout
image: nginx:1.16.0

Step 2

此时阿里云SLS日志服务中即会创建logStore,默认 logtail 为极简模式,日志未进行解析。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"inputs": [
{
"detail": {
"IncludeEnv": {
"aliyun_logs_xiemx-training-stdout-log": "stdout"
},
"Stderr": true,
"Stdout": true
},
"type": "service_docker_stdout"
}
]
}

Step 3

进行日志拆分极细,aliyun支持多种解析插件,当前使用自定义的正则来演示,logtail 配置如下。
插件可参考:https://help.aliyun.com/document_detail/64957.html?spm=a2c4g.11186623.6.640.60a31de3orfOsD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
"inputs": [
{
"detail": {
"IncludeEnv": {
"aliyun_logs_xiemx-training-stdout-log": "stdout"
},
"Stderr": true,
"Stdout": true
},
"type": "service_docker_stdout"
}
],
"processors": [
{
"detail": {
"KeepSource": true,
"NoMatchError": true,
"Keys": [
"remote_addr",
"time",
"http_method",
"request_uri",
"status_code",
"body_bytes_sent",
"http_referer",
"user_agent",
"http_x_forwarded_for"
],
"SourceKey": "content",
"Regex": "(\\S+) \\S+ \\S+ \\[(\\S+) \\S+\\] \"([A-Z]+) (.*)\" (\\d+) (\\S+) \"(\\S+)\" \"(.*)\" \"(.*)\"",
"NoKeyError": true
},
"type": "processor_regex"
}
]
}

需要注意:当使用 regex 进行分组时,请务必不要使用 (()()) 类似嵌套表达式会导致日志解析结果和 Key 对应关系错乱,日志数据混乱。如下例子:

1
((\d+\.){3}(\d+))  --替换-> (\S+)

Step 4

此时如果正则解析无问题的情况下即可查看刀拆分后的日志,如没有查看刀拆分的日志,可点击诊断按钮查看客户端错误进行debug。