Log Pilot日志采集
概述
Log-Pilot 是一个基于 Filebeat 的 Kubernetes 日志采集工具,通过 DaemonSet 方式部署在每个节点上,自动采集容器标准输出和容器内日志文件,并转发至 Logstash、Elasticsearch 或 Kafka 等后端存储。
核心能力:
- 容器标准输出采集:通过
stdout关键字采集 Pod 的标准输出日志 - 容器内文件采集:通过环境变量指定容器内日志文件路径
- 多后端支持:支持输出到 Logstash、Elasticsearch、Kafka
- 自动发现:通过 Kubernetes API 自动发现新 Pod 并开始采集
Log-Pilot 部署
DaemonSet 配置
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-pilot
labels:
k8s-app: log-pilot
namespace: default
spec:
selector:
matchLabels:
k8s-app: log-pilot
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
k8s-app: log-pilot
spec:
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
containers:
- name: log-pilot
image: registry.cn-hangzhou.aliyuncs.com/acs/log-pilot:0.9.5-filebeat
env:
- name: "LOGGING_OUTPUT"
value: "logstash"
- name: "LOGSTASH_HOST"
value: "192.168.1.2"
- name: "LOGSTASH_PORT"
value: "5044"
- name: "LOGSTASH_LOADBALANCE"
value: "true"
- name: "NODE_NAME"
valueFrom:
fieldRef:
fieldPath: spec.nodeName
resources:
limits:
cpu: 1000m
memory: 1000Mi
requests:
cpu: 250m
memory: 128Mi
volumeMounts:
- name: sock
mountPath: /var/run/docker.sock
- name: logs
mountPath: /var/log/filebeat
- name: state
mountPath: /var/lib/filebeat
- name: root
mountPath: /host
readOnly: true
- name: localtime
mountPath: /etc/localtime
securityContext:
capabilities:
add:
- SYS_ADMIN
terminationGracePeriodSeconds: 30
volumes:
- name: sock
hostPath:
path: /var/run/docker.sock
- name: logs
hostPath:
path: /var/log/filebeat
- name: state
hostPath:
path: /var/lib/filebeat
- name: root
hostPath:
path: /
- name: localtime
hostPath:
path: /etc/localtime环境变量说明
| 变量 | 说明 |
|---|---|
LOGGING_OUTPUT |
输出目标,支持 logstash、elasticsearch、kafka |
LOGSTASH_HOST |
Logstash 服务地址 |
LOGSTASH_PORT |
Logstash 端口(Beats 协议默认 5044) |
LOGSTASH_LOADBALANCE |
是否启用负载均衡 |
NODE_NAME |
节点名称(用于标识日志来源) |
部署命令
kubectl apply -f log-pilot-daemonset.yaml查看部署状态:
kubectl get ds log-pilot -n default
kubectl get pods -n default | grep log-pilot应用日志采集配置
采集容器标准输出日志
通过环境变量 aliyun_logs_<日志名称> 设置为 stdout:
env:
- name: aliyun_logs_yace-nginx-access
value: stdout采集容器内日志文件
通过环境变量指定日志文件路径(支持通配符),同时需要挂载 emptyDir 卷用于日志文件存储:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.29.1-alpine
env:
# 采集容器内日志文件
- name: aliyun_logs_yace-nginx-error
value: /opt/log/*.log
# 采集标准输出日志
- name: aliyun_logs_yace-nginx-access
value: stdout
volumeMounts:
- mountPath: /opt/log
name: locallog
volumes:
- emptyDir: {}
name: locallog环境变量命名规则
aliyun_logs_<日志名称> = <日志路径>| 日志名称 | 说明 | 示例值 |
|---|---|---|
yace-nginx-access |
访问日志 | stdout |
yace-nginx-error |
错误日志 | /opt/log/*.log |
验证日志采集
# 查看 Log-Pilot 日志
kubectl logs -f <log-pilot-pod-name> -n default
# 查看 Filebeat 状态
kubectl exec -it <log-pilot-pod-name> -n default -- filebeat test output
# 在 Logstash 端验证是否收到日志
curl http://<logstash-host>:5044常见问题与注意事项
Log-Pilot 无法启动
- 确认节点上 Docker Socket 路径是否正确(
/var/run/docker.sock) - 检查 RBAC 权限是否充足(需访问 Kubernetes API)
日志文件采集不到
- 确认应用容器已将日志输出到挂载的 emptyDir 卷
- 检查环境变量中的日志路径是否正确
- 查看 Log-Pilot 日志排查错误:
kubectl logs -f <log-pilot-pod> -n defaultLogstash 连接失败
- 确认 Logstash 服务正常运行
- 检查
LOGSTASH_HOST和LOGSTASH_PORT是否正确 - 确认网络策略是否允许 Log-Pilot 访问 Logstash
日志采集延迟较高
调整 Filebeat 配置参数(需修改 Log-Pilot 镜像或挂载配置文件):
env:
- name: "FILEBEAT_SCAN_FREQUENCY"
value: "10s" # 扫描频率
- name: "FILEBEAT_CLOSE_TIMEOUT"
value: "5m" # 关闭空闲文件超时日志输出到 Elasticsearch
修改 Log-Pilot 环境变量:
env:
- name: "LOGGING_OUTPUT"
value: "elasticsearch"
- name: "ELASTICSEARCH_HOSTS"
value: '["http://elasticsearch:9200"]'