log-pilot介绍
log-pilot解决问题:
-
每个节点只要一个log收集POD
-
能动态定制索引名称
-
能收集容器里面的日志文件,不只是stdout
log-pilot安装
kubernetes1.15以上版本
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-pilot
labels:
app: log-pilot
# 设置期望部署的namespace
namespace: kube-system
spec:
updateStrategy:
type: RollingUpdate
selector:
matchLabels:
app: log-pilot
template:
metadata:
labels:
app: log-pilot
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ''
spec:
# 是否允许部署到Master节点上
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-pilot
# 版本请参考https://github.com/AliyunContainerService/log-pilot/releases
image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.7-filebeat
resources:
limits:
memory: 500Mi
requests:
cpu: 200m
memory: 200Mi
env:
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: "LOGGING_OUTPUT"
value: "elasticsearch"
# 请确保集群到ES网络可达
- name: "ELASTICSEARCH_HOSTS"
value: "10.10.203.152:9200"
# 配置ES访问权限
#- name: "ELASTICSEARCH_USER"
# value: "{es_username}"
#- name: "ELASTICSEARCH_PASSWORD"
# value: "{es_password}"
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: root
mountPath: /host
readOnly: true
- name: varlib
mountPath: /var/lib/filebeat
- name: varlog
mountPath: /var/log/filebeat
- name: localtime
mountPath: /etc/localtime
readOnly: true
livenessProbe:
failureThreshold: 3
exec:
command:
- /pilot/healthz
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: root
hostPath:
path: /
- name: varlib
hostPath:
path: /var/lib/filebeat
type: DirectoryOrCreate
- name: varlog
hostPath:
path: /var/log/filebeat
type: DirectoryOrCreate
- name: localtime
hostPath:
path: /etc/localtime
说明 参数说明:
- {es_endpoint}:ES 集群的访问地址。
-
如果 Kubernetes 集群和部署的 ES 集群在同一个 VPC 下,则该地址为 ES 集群基本信息中的内网地址。
-
如果 Kubernetes 集群和部署的 ES 集群在不同一个 VPC 下,则该地址为 ES 集群基本信息中的公网地址。
-
{es_port}:ES 集群的访问端口,一般是9200。
-
{es_username}:访问 ES 集群的用户名。默认用户名 elastic。
-
{es_password}:访问 ES 集群的用户密码。即为创建 ES 集群时,设置的用户密码。
日志收集
应用添加环境变量
官方tomcat实例
apiVersion: v1
kind: Pod
metadata:
name: tomcat
spec:
containers:
- name: tomcat
image: "tomcat:7.0"
env:
# 1、stdout为约定关键字,表示采集标准输出日志
# 2、配置标准输出日志采集到ES的catalina索引下
- name: aliyun_logs_catalina
value: "stdout"
# 1、配置采集容器内文件日志,支持通配符
# 2、配置该日志采集到ES的access索引下
- name: aliyun_logs_access
value: "/usr/local/tomcat/logs/catalina.*.log"
# 容器内文件日志路径需要配置emptyDir
volumeMounts:
- name: tomcat-log
mountPath: /usr/local/tomcat/logs
volumes:
- name: tomcat-log
emptyDir: {}
说明 在上面的编排中,通过在 Pod 中定义环境变量的方式,动态地生成日志采集配置文件,环境变量的具体说明如下:
-
aliyun_logs_catalina=stdout表示要收集容器的 stdout 日志。
-
aliyun_logs_access=/usr/local/tomcat/logs/catalina..log 表示要收集容器内 /usr/local/tomcat/logs/ 目录下所有名字匹配 catalina..log 的文件日志。
在本方案的 Elasticsearch 场景下,环境变量中的 name即是 catalina 和 access 。
声明式日志配置
image.pngLog-Pilot 支持声明式日志配置,可以依据容器的 Label 或者 ENV 来动态地生成日志采集配置文件。这里重点说明两个变量:
- name:我们自定义的一个字符串,它在不同的场景下指代不同的含义。当我们将日志采集到 ElasticSearch 的时候, name 表示的是 Index;当我们将日志采集到 Kafka 的时候, name 表示的是 Topic;当我们将日志采集到阿里云日志服务的时候,name 表示的是 LogstoreName。
- path:它本身支持两种,一种是约定关键字 stdout,表示的是采集容器的标准输出日志,第二种是容器内部的具体文件日志路径,可以支持通配符的方式。比如我们要采集 tomcat 容器日志,那么我们通过配置标签
aliyun.logs.catalina=stdout
来采集 tomcat 标准输出日志,通过配置标签aliyun.logs.access=/usr/local/tomcat/logs/*.log
来采集 tomcat 容器内部文件日志。
自定义tag
image.pngLog-Pilot 也支持自定义Tag,我们可以在容器的标签或者环境变量里配置 aliyun.logs.$name.tags: k=v
,那么在采集日志的时候也会将k=v
采集到容器的日志输出中。
比如我们有一种场景,有一个开发环境和测试环境,应用日志都会被采集到统一的一个日志存储后端,假设是一个 ElasticSearch 集群,但是我们在 ElasticSearch 中查询日志的时候又想区分出来,具体某条日志记录到底来源于生产环境,还是测试环境。
那么我们就可以通过给测试环境的容器打上 stage=dev
的 tag,给生产环境的容器打上 stage=pro
的 tag,Log-Pilot 在采集容器日志的时候,同时会将这些 tag 随容器日志一同采集到日志存储后端中,那么当我们在查询日志的时候,就可以通过 stage=dev
或者 stage=pro
能明确地区分出某条日志是来源于生产环境的应用容器所产生,还是测试环境应用容器所产生的。另外通过自定义 tag 的方式我们还可以进行日志统计、日志路由和日志过滤。
支持自定义输出Target
image.png这里假设一种场景,我们同时有一个生产环境和一个测试环境,应用日志都需要被采集到同一套 Kafka 中,然后由不同的 consumer 去消费。
但是我们同样希望区分出来,某条日志数据是由生产环境的应用容器产生的,还是测试环境的应用容器产生的,但我们在测试环境中的应用容器已经配置了 aliyun.logs.svc=stdout
标签,那么当这些应用容器的标准输出日志被采集到 kafka 中,它最终会被路由到 topic=svc
的消息队列中,那么订阅了 topic=svc
的 consumer 就能够接收测试环境的应用容器产生的日志。
但当我们将该应用发布到生产环境时,希望它产生的日志只能交由生产环境的 consumer 来接收处理,那么我们就可以通过 target 的方式,给生产环境的应用容器额外定义一个 target=pro-svc
,那么生产环境的应用日志在被采集到 Kafka 中时,最终会被路由到 topic 为 pro-svc 的消息队列中,那么订阅了 topic =pro-svc
的 consumer 就可以正常地接收到来自于生产环境的容器产生的日志。
因此这里的 target 本身也有三种含义:
- 当我们将日志对接到ElasticeSearch时,这个 target 字符串是 Index;
- 当我们对接到Kafka时,它指代的是 topic;
- 当我们将日志对接到日志服务时,它代表的是 Logstore Name。
支持多种日志解析格式
image.pngLog-Pilot 也支持多种日志解析格式,通过 aliyun.logs.$name.format: <format>
标签就可以告诉 Log-Pilot 在采集日志的时候,同时以什么样的格式来解析日志记录。目前主要支持六种:
- none:默认格式,指不对日志记录做任何解析,整行采集出来直接输出到日志存储后端。
- json:Log-Pilot 在采集日志的时候同时会将每一行日志以 json 的方式进行解析,解析出多个 KV 对,然后输出到日志存储后端。
- csv:主要是针对csv格式的日志采集配置(需配置fluentd插件)。
- nginx:主要是针对Nginx的日志采集配置(需配置fluentd插件)。
- apache2:主要是针对Apache的日志采集配置(需配置fluentd插件)。
- regexp:用户可以通过 format 标签来自定义正则表达式,告诉 Log-Pilot 在解析日志记录的时候以什么样的拆分格式来进行解析拆分(需配置fluentd插件)。
支持多采集插件
image.png目前 Log-Pilot 支持两种采集插件:一个是CNCF社区的Fluentd插件,一个是Elastic的Filebeat插件;其同时其支持对接多种存储后端,目前 Fluentd 和 Filebeat 都支持 Elasticsearch、Kafka、File、Console 作为日志存储后端,而 Fluentd 还支持 Graylog、阿里云日志服务 以及 Mongodb 作为存储后端。
使用注意事项
验证环境
kubernetes16.3
elk6.8.4
log-pilot0.9.6/0.9.7-filebeat
只有filebeat版本能用
其实是只有filebeat版本,加容器环境变量才能用。fluentd采集不到日志。
只有配置环境变量的方式才生效
用容器标签,日志根本没有方式出去
自定义tags不起作用
不管是标签还是环境变量,都不启作用,设置tags后就发送不出日志
网友评论