将(无根)podman 容器的日志发送到 ELK?

问题描述 投票:0回答:1

我在 $ 问题上苦苦挣扎了一段时间,是时候寻求一些指导了。 我们有 10 多个容器,它们运行在通过 ansible 作为 systemd 服务部署的不同 RHEL 虚拟机上(换句话说,在安装的 podman 之上/旁边没有 cubernetes 或其他容器编排服务) 这些容器作为无根容器运行。不幸的是,docker (podman) 套接字在虚拟机上未处于活动状态(尽管我们可以将其打开)。 所有虚拟机都安装了 filebeat。 我们单独部署了一个 ELK 堆栈。 我在研究过程中发现了什么:

  • podman(此处安装)仅支持 k8s 文件和日志记录(问题#1:最简单的方法是使用 json 文件日志记录驱动程序与 docker/podman 套接字结合使用,这在这里无法实现)
  • podman 套接字属于运行这些无根容器的 podman 用户,因此对其他人来说实际上是不可见的,即使是 root 也无法在没有 podman 套接字的情况下看到正在运行的容器 – 我能够解决这个问题(所以 root 是能够列出正在运行的容器),但我不这么认为/无法相信这应该是工业标准解决方案
  • 切换到journald并使用journalbeat:这可能有效,但我不知道这可以与容器元数据收集结合起来,以便能够区分虚拟机日志和容器日志

我正在为此设置寻找一种解决方案,使集中式日志记录以最简单的方式工作。 现在,我将不胜感激有关工作概念的一些提示。

提前谢谢您。

elasticsearch logstash redhat filebeat podman
1个回答
0
投票

Filebeat 中有一个 journald input,因此您无需单独部署 Journaldbeat(已弃用)。

journald 原生支持日志中的结构化数据(您可以运行

journalctl -o json
查看日志中包含哪些字段)。因此,如果journald日志驱动程序将容器元数据传递给journald,那么Filebeat生成的事件将包含类似
container.{id,name,image.tag}
的字段(假设它遵循与Dockerjournald日志驱动程序相同的字段命名)。或者,如果它使用自定义命名约定,则 Filebeat 将生成带有
journald.custom.*
等字段的事件。

这是运行时 podman 日志在我的机器上的样子

journalctl -o json | jq -S .

{
  "CODE_FILE": "src/ctr_logging.c",
  "CODE_FUNC": "write_journald",
  "CODE_LINE": "264",
  "CONTAINER_ID": "ee059a097566",
  "CONTAINER_ID_FULL": "ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac",
  "CONTAINER_NAME": "modest_heyrovsky",
  "CONTAINER_PARTIAL_MESSAGE": "true",
  "MESSAGE": "10.0.2.100 - - [29/Aug/2023:16:46:50 +0000] \"GET / HTTP/1.1\" 200 45",
  "PRIORITY": "6",
  "SYSLOG_IDENTIFIER": "conmon",
  "_AUDIT_LOGINUID": "1000",
  "_AUDIT_SESSION": "4",
  "_BOOT_ID": "f5f4c28d95df4cfaaac4d7ec5e33eeb5",
  "_CAP_EFFECTIVE": "1ffffffffff",
  "_CMDLINE": "/usr/bin/conmon --api-version 1 -c ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac -u ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac -r /usr/bin/crun -b /home/ubuntu/.local/share/containers/storage/overlay-containers/ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac/userdata -p /run/user/1000/containers/overlay-containers/ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac/userdata/pidfile -n modest_heyrovsky --exit-dir /run/user/1000/libpod/tmp/exits --full-attach -s -l journald --log-level warning --runtime-arg --log-format=json --runtime-arg --log --runtime-arg=/run/user/1000/containers/overlay-containers/ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac/userdata/oci-log -t --conmon-pidfile /run/user/1000/containers/overlay-containers/ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac/userdata/conmon.pid --exit-command /usr/bin/podman --exit-command-arg --root --exit-command-arg /home/ubuntu/.local/share/containers/storage --exit-command-arg --runroot --exit-command-arg /run/user/1000/containers --exit-command-arg --log-level --exit-command-arg warning --exit-command-arg --cgroup-manager --exit-command-arg systemd --exit-command-arg --tmpdir --exit-command-arg /run/user/1000/libpod/tmp --exit-command-arg --runtime --exit-command-arg crun --exit-command-arg --storage-driver --exit-command-arg overlay --exit-command-arg --events-backend --exit-command-arg journald --exit-command-arg container --exit-command-arg cleanup --exit-command-arg ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac",
  "_COMM": "conmon",
  "_EXE": "/usr/bin/conmon",
  "_GID": "1000",
  "_HOSTNAME": "linux",
  "_MACHINE_ID": "0829fb9723294fceb0eddbf4c45b197b",
  "_PID": "6088",
  "_SELINUX_CONTEXT": "unconfined\n",
  "_SOURCE_REALTIME_TIMESTAMP": "1693327610600063",
  "_SYSTEMD_CGROUP": "/user.slice/user-1000.slice/[email protected]/user.slice/libpod-conmon-ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac.scope",
  "_SYSTEMD_INVOCATION_ID": "98a1d7a85cf048eaa726b6e5aadbb043",
  "_SYSTEMD_OWNER_UID": "1000",
  "_SYSTEMD_SLICE": "user-1000.slice",
  "_SYSTEMD_UNIT": "[email protected]",
  "_SYSTEMD_USER_SLICE": "user.slice",
  "_SYSTEMD_USER_UNIT": "libpod-conmon-ee059a097566fdc5ac9141bfcdfbed0c972163da891de076e0849d7b53597aac.scope",
  "_TRANSPORT": "journal",
  "_UID": "1000",
  "__CURSOR": "s=66bb92cf8741499ca3d9dd4ef84dd0a4;i=2427;b=f5f4c28d95df4cfaaac4d7ec5e33eeb5;m=18f10791ee;t=604128eb7daa0;x=41277d78955a13c3",
  "__MONOTONIC_TIMESTAMP": "107123020270",
  "__REALTIME_TIMESTAMP": "1693327610600096"
}

此外,在使用 Filebeat 日志输入时,您可能希望应用过滤器以仅从 podman 获取数据。这将产生与

journalctl _COMM=conmon
相同的数据。

filebeat.inputs:
- type: journald
  id: podman-container-logs
  include_matches.match:
    - _COMM=conmon
© www.soinside.com 2019 - 2024. All rights reserved.