HomeLeb的日志监管系统--序
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 79s3. 部署 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 --decode5.开"后门"
目前 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第二步:验证连接
浏览器测试:打开
https://<Debian的IP>:30561,用elastic账号和刚才那个长长的密码登录。连通性测试:在 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。而且新老引擎的字段完全不通用,混用会导致配置校验失败,进程直接“自杀”。
🕳️ 坑位三:Unraid 的“路径幻觉” (Symlinks 陷阱)
现象:权限给了,路径对了,但扫描器(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 重新开始“洗脑式”扫描。