Kubernetes (1.20) 集群中的 Graylog

问题描述

我尝试设置 graylog
此部署有效。但我需要为 graylog 部署添加一个卷。因为我想安装插件。 当我添加卷 (hostPath) 并启动 pod 时,我的 pod 中出现错误

ERROR StatusLogger File not found in file system or classpath: /usr/share/graylog/data/config/log4j2.xml
ERROR StatusLogger Reconfiguration Failed: No configuration found for '70dea4e' at 'null' in 'null'
06:37:19.707 [main] ERROR org.graylog2.bootstrap.CmdLinetool - Couldn't load configuration: Properties file /usr/share/graylog/data/config/graylog.conf doesn't exist!

我明白了,那个 pod 批量创建目录(所有者 ID 1100:1100),但那里没有任何文件

Kubernetes 版本是 1.20 我的 kubernetes 集群中的运行时是“containerd”。

我的 Graylog 部署:

  1. 容器的卷数:

volumeMounts:
    - mountPath: /usr/share/graylog/data
      name: graylog-data
  1. 音量:

 volumes:
  - name: graylog-data
    hostPath:
      path: /mnt/k8s-storage/graylog-data
      type: DirectoryOrCreate

解决方法

hostPath 卷的概念开始,这里有几件事值得关注:

hostPath 卷从主机节点的 文件系统到您的 Pod。

具有相同配置的 Pod(例如从 PodTemplate 创建) 由于文件不同,不同节点上的行为可能不同 节点

在底层主机上创建的文件或目录只是 可通过root 写入。您要么需要以 root 身份运行您的进程 特权容器或修改主机上的文件权限 能够写入 hostPath

例如,如果您想将 hostPath 用于在 DaemonSet 中运行的日志收集器,那么它会很好,但在您描述的用例中,它可能并不理想,因为您不直接控制您的 pod 将在哪个节点上运行,因此您不能保证 pod 会实际安排在具有数据量的节点上。

但如果不是这样,您还需要注意 type: DirectoryOrCreate 在这里不是最好的,因为我看到您要加载文件。最好使用:

  • File:文件必须存在于指定路径

  • FileOrCreate:如果给定路径不存在任何内容,则会根据需要创建一个空文件,权限设置为 0644,与 Kubelet 具有相同的组和所有权。

最后,可能存在权限问题。如前所述:

在底层主机上创建的文件或目录只是 可被 root 写入。

Graylog 与 userid 1100 一起运行,这可能会导致权限被拒绝。另外,我找到了一个可能对您有帮助的 similar issue