HomeLeb的日志监管系统--序

13.3~17.1 分钟

0.基础配置信息-这里的filesbeat用的是9.0.*

unraid配置如下

root@Tower:/mnt/user/appdata/filebeat# lscpu -e

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE

0 0 0 0 0:0:0:0 yes

1 0 0 1 1:1:1:0 yes

2 0 0 2 2:2:2:0 yes

3 0 0 3 3:3:3:0 yes

root@Tower:/mnt/user/appdata/filebeat#

root@Tower:/mnt/user/appdata/filebeat# lsblk -l

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS

loop0 7:0 0 117.9M 1 loop /lib/firmware

loop1 7:1 0 19.4M 1 loop /lib/modules

loop2 7:2 0 120G 0 loop /var/lib/docker/btrfs

/var/lib/docker

sda 8:0 1 7.3G 0 disk

sda1 8:1 1 7.3G 0 part /boot

sdb 8:16 0 500G 0 disk

sdb1 8:17 0 500G 0 part

sdc 8:32 1 3.6T 0 disk

sdc1 8:33 1 3.6T 0 part

sdd 8:48 1 3.6T 0 disk

sdd1 8:49 1 3.6T 0 part

sde 8:64 1 14.6T 0 disk

sde1 8:65 1 14.6T 0 part

sdf 8:80 0 300G 0 disk

sdf1 8:81 0 300G 0 part /mnt/cache

md1 9:1 0 500G 0 md /mnt/disk1

md2 9:2 0 14.6T 0 md /mnt/disk2

md3 9:3 0 3.6T 0 md /mnt/disk3

md4 9:4 0 3.6T 0 md /mnt/disk4

sr0 11:0 1 1024M 0 rom

root@Tower:/mnt/user/appdata/filebeat# free

total used free shared buff/cache available

Mem: 20499388 5853340 1489036 2003120 13157012 12172608

Swap: 0 0 0

Debian(K3S)配置如下

shiyi@K3s:~$ lscpu -e

CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE

0 0 0 0 0:0:0:0 yes

1 0 0 1 1:1:1:0 yes

2 0 0 2 2:2:2:0 yes

3 0 0 3 3:3:3:0 yes

shiyi@K3s:~$ lsblk -l

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS

sda 8:0 0 500G 0 disk

sda1 8:1 0 976M 0 part /boot

sda2 8:2 0 1K 0 part

sda5 8:5 0 499G 0 part

sr0 11:0 1 754M 0 rom

K3s--vg-root 254:0 0 31G 0 lvm /

K3s--vg-var 254:1 0 12.4G 0 lvm /var

K3s--vg-swap_1 254:2 0 976M 0 lvm [SWAP]

K3s--vg-srv 254:3 0 454.6G 0 lvm /srv

shiyi@K3s:~$ free

total used free shared buff/cache available

内存: 12254484 1362124 8244920 1908 2970852 10892360

交换: 999420 0 999420

#unraid跑filebeat,filebeat配置文件需要事先准备好
root@Tower:/mnt/user/appdata/filebeat# cat ./filebeat.yml
# 输入配置(9.3.1 必须全部使用 filestream)
filebeat.inputs:
  # 采集系统日志
  - type: filestream
    enabled: true
    id: syslog-input-v3
    paths:
      - /var/log/syslog
      - /var/log/auth.log
      - /app/logs/*.log

  # 采集Docker容器日志(针对 Unraid 环境)
  - type: filestream
    enabled: true
    id: docker-logs-unraid-final-V5
    paths:
      - "/var/lib/docker/containers/*/*.log"
    prospector.scanner.symlinks: true
    ignore_older: 0
    prospector.scanner.check_interval: 1s
    file_identity.native: ~
    parsers:
      - container:
          stream: all
          format: docker
    exclude_files: ['filebeat.*\.log']

# 处理器(添加元数据)
processors:
  - add_docker_metadata:
      host: "unix:///var/run/docker.sock"
  - add_host_metadata:
      when.not.contains.tags: forwarded

# 输出到Elasticsearch
output.elasticsearch:
  hosts: ["https://10.0.0.118:30920"]
  username: "elastic"
  password: "<user_password>"
  ssl.verification_mode: "none"

# 启用模块(如system、nginx等)
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: true
#我的docker启用命令是:
docker run
  -d
  --name='filebeat'
  --net='host'
  -e TZ="Asia/Shanghai"
  -e HOST_OS="Unraid"
  -e HOST_HOSTNAME="Tower"
  -e HOST_CONTAINERNAME="filebeat"
  -l net.unraid.docker.managed=dockerman
  -l '1'='1'
  -v '/mnt/user/appdata/filebeat/filebeat.yaml':'/usr/share/filebeat/filebeat.yaml':'ro'
  -v '/var/lib/docker/containers':'/var/lib/docker/containers':'ro'
  -v '/var/run/docker.sock':'/var/run/docker.sock':'ro'
  -v '/var/log':'/var/log':'ro' 'docker.elastic.co/beats/filebeat:9.3.1' 

接下来开始第二步:

1.修改宿主机参数 (重要!)

Elasticsearch 需要 vm.max_map_count 至少为 262144。因为 K3s 共享宿主机内核,你得在 Debian 宿主机上执行:

sudo sysctl -w vm.max_map_count=262144
# 永久生效
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

如果不做这一步,ES Pod 会一直 CrashLoopBackOff。

2.安装 ECK Operator

在 K3s 上执行,一键安装管理组件:

kubectl create -f https://download.elastic.co/downloads/eck/2.12.1/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.12.1/operator.yaml

检查一下:

执行这个->kubectl get pods -n elastic-system  应该出现下面的内容
NAME                 READY   STATUS    RESTARTS   AGE
elastic-operator-0   1/1     Running   0          79s

3. 部署 Elasticsearch 实例

创建一个 elasticsearch.yaml。写了一个单节点、限制内存的最小化配置:

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.12.0
  nodeSets:
  - name: default
    count: 1
    config:
      node.store.allow_mmap: false # 如果宿主机没改sysctl,可以用这个保命,但性能会差
    podTemplate:
      spec:
        containers:
        - name: elasticsearch
          resources:
            limits:
              memory: 4Gi # 限制最大内存
              cpu: 2
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi # K3s 会自动用 local-path 存储
        storageClassName: local-path
##完成之后执行kubectl apply -f ./elasticsearch.yaml启动

4. 部署 Kibana

创建一个 kibana.yaml,它会自动关联上面的 ES:

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 8.12.0
  count: 1
  elasticsearchRef:
    name: quickstart
##kubectl apply -f kibana.yaml
#检查一下,出现这些就成功了
shiyi@K3s:~/k3sapp/ES$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
quickstart-es-default-0          1/1     Running   0          111s
quickstart-kb-7cd788b56c-9bg47   1/1     Running   0          110s
uptime-kuma-69bdddb8f8-8llsn     1/1     Running   0          2d4h

到这一步,就可以开始获取ES的密码了。

kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode

5.开"后门"

目前 ES 是以 ClusterIP 运行的,外部网络(比如 Unraid 物理机)是访问不到的。我们给它开个“后门”——NodePort。

第一步:暴露 ES 和 Kibana 的端口

请在 K3s 宿主机上创建一个 expose-services.yaml,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-external
spec:
  type: NodePort
  selector:
    common.k8s.elastic.co/type: elasticsearch
    elasticsearch.k8s.elastic.co/cluster-name: quickstart
  ports:
    - name: https
      protocol: TCP
      port: 9200
      targetPort: 9200
      nodePort: 30920  # Unraid 的 Filebeat 将访问这个端口
---
apiVersion: v1
kind: Service
metadata:
  name: kibana-external
spec:
  type: NodePort
  selector:
    common.k8s.elastic.co/type: kibana
    kibana.k8s.elastic.co/name: quickstart
  ports:
    - name: https
      protocol: TCP
      port: 5601
      targetPort: 5601
      nodePort: 30561  # 浏览器访问这个端口进入控制台
## 之后执行:kubectl apply -f expose-services.yaml

第二步:验证连接

  1. 浏览器测试:打开 https://<Debian的IP>:30561,用 elastic 账号和刚才那个长长的密码登录。

  2. 连通性测试:在 Unraid 上敲一下:
    curl -u elastic:<密码> -k https://<Debian的IP>:30920
    如果返回了 ES 的版本信息 JSON,那就说明“血管”打通了!

第三步:修改 Unraid 的 Filebeat 配置

在 Unraid 的 filebeat.yml 里,把 output 指向这个新地址:

output.elasticsearch:
  hosts: ["https://<Debian的IP>:30920"]
  username: "elastic"
  password: "你的长密码"
  ssl.verification_mode: "none" # 必须加这一行,因为我们没有把 K3s 的自签证书导入 Unraid

以上就是基础设置了。

踩坑记录:

🕳️ 坑位一:身份的“隐形墙” (UID 1000 vs Root)

  • 现象:容器开了“特权模式”,物理 ls 也能看到日志,但 Filebeat 指标显示 open_files: 1

  • 真相:Filebeat 官方镜像默认以 filebeat 用户 (UID 1000) 运行。而 Unraid 宿主机的容器日志权限通常是 640 root:root

  • 教训特权模式不等于 Root 进程。在 Unraid 这种权限严苛的环境下,必须在容器启动参数里显式指定 --user root,否则它就是个“看得见、摸不着”的睁眼瞎。

🕳️ 坑位二:新旧引擎的“排他性自杀” (Log vs Filestream)

  • 现象:尝试回退到旧的 type: log 引擎时,容器启动即崩溃,ps aux 为空。

  • 真相:Filebeat 9.x 彻底废弃了 log 引擎,且严禁log 块中使用 id 字段。

  • 教训:9.x 版本是“单行道”,必须拥抱 filestream。而且新老引擎的字段完全不通用,混用会导致配置校验失败,进程直接“自杀”。

  • 现象:权限给了,路径对了,但扫描器(Scanner)依然跳过所有日志。

  • 真相:Unraid 的 FUSE 文件系统映射在 Filebeat 9.x 眼里常被识别为“符号链接(Symlinks)”。而 filestream 默认为了安全是不跟随链接的。

  • 教训:在 Unraid 下必须显式开启 prospector.scanner.symlinks: true,否则扫描器会认为这些路径是虚假的,直接过滤掉。

🕳️ 坑位四:顽固的“状态记忆” (Registry 锁死)

  • 现象:改了配置,依然不采集。

  • 真相filestream 引擎高度依赖 id。如果一个文件在某个 id 下扫描失败或 Inode 识别冲突,它会永久记录在 data/registry 里。

  • 教训换 ID + 删 Data 是唯一的重置手段。必须通过 rm -rf data/* 配合全新的 id(比如咱们最后用的 V5),才能逼迫 Filebeat 重新开始“洗脑式”扫描。