k8s
Log Pilot日志采集

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 输出目标,支持 logstashelasticsearchkafka
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 无法启动

  1. 确认节点上 Docker Socket 路径是否正确(/var/run/docker.sock
  2. 检查 RBAC 权限是否充足(需访问 Kubernetes API)

日志文件采集不到

  1. 确认应用容器已将日志输出到挂载的 emptyDir 卷
  2. 检查环境变量中的日志路径是否正确
  3. 查看 Log-Pilot 日志排查错误:
kubectl logs -f <log-pilot-pod> -n default

Logstash 连接失败

  1. 确认 Logstash 服务正常运行
  2. 检查 LOGSTASH_HOSTLOGSTASH_PORT 是否正确
  3. 确认网络策略是否允许 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"]'

参考链接