在前面 容器日志采集利器Log-Pilot 中主要跟大家介绍了一个智能的容器日志采集利器,它采用声明式的日志采集配置方式,能自动地发现和采集应用容器的日志;它不仅能够采集容器的标准输出日志,同时还能够采集容器内部的文件日志。
本文主要跟大家分享下如何通过Log-Pilot来配置采集Kubernetes集群中Pod的日志到ElasticSearch集群中;当然Log-Pilot不仅局限于此,它还可以采集Swarm集群乃至直接通过docker run
运行的容器的日志,具体可参考Log-Pilot QuickStart。
准备工作
- 您已经成功部署了一个Kubernetes集群,也可直接通过阿里云容器服务控制台来申请Kubernetes集群。
- 配置本地通过kubectl连接Kubernetes集群,当然也可直接在Master节点上操作。
部署ElasticSearch集群
鉴于ES集群的稳定性考虑以及未来的系统维护成本,这里我们可直接通过阿里云ElasticSearch控制台创建一个ElasticSearch集群:
说明:您可依据自身实际业务的日志数据情况来选择合适的版本、集群节点数以及规格等。
开启自动创建索引
默认情况下阿里云ElasticSearch集群当新增的文档发现没有索引时,不允许自动创建索引,而Log-Pilot在自动采集容器日志时需要依据日志采集配置来自动创建文档索引,因此我们这里需要开启自动创建索引功能:
部署Log-Pilot组件
为降低节点的资源消耗,Log-Pilot组件采用的是DaemonSet方式部署到每个集群的Node节点上,YAML可参考如下:
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: log-pilot
labels:
app: log-pilot
# 设置期望部署的namespace
namespace: kube-system
spec:
updateStrategy:
type: RollingUpdate
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.6-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: "{es_endpoint}:{es_port}"
# 配置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集群在同一个VPC下,则可直接使用私网地址;
请务必确保到ES集群网络可达
。 - {es_port}:ES集群的访问端口,一般是9200。
- {es_username}:访问ES集群的用户名。
- {es_password}:访问ES集群的用户密码。
部署完成后,可通过如下命令确认是否正常运行:
~ kubectl apply -f log-pilot.yml
daemonset.extensions "log-pilot" created
~ kubectl -n kube-system get pod | grep log-pilot
log-pilot-458nj 1/1 Running 0 23s
log-pilot-8ld4n 1/1 Running 0 23s
log-pilot-b4kqv 1/1 Running 0 23s
log-pilot-gd588 1/1 Running 0 23s
log-pilot-k2ttk 1/1 Running 0 23s
采集应用日志
这里以一个Tomcat为例来说明如何配置应用的日志采集配置(配置方式同样适用Deploment和StatefulSet):
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: {}
部署成功后稍等几秒钟,我们可以看到tomcat的日志被采集到了指定的ES集群中:
注意:Log-Pilot默认采集日志到ES集群时会自动创建格式为 index-yyyy.MM.dd 的索引
因此,我们可以看到只需要通过上面简单的配置就可以很方便地将Kubernetes集群中Pod的标准输出日志和容器内文件日志采集到ElasticSearch集群中。