问题描述
我尝试设置 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 部署:
- 容器的卷数:
volumeMounts:
- mountPath: /usr/share/graylog/data
name: graylog-data
- 音量:
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。