OpenShift部署Apache Ignite集群报/ignite/work目录无法创建问题
故障根因
- 路径配置不匹配:Apache Ignite官方镜像默认工作目录固定为
/ignite/work,你当前配置将工作目录卷挂载到了/tmp/work,既没有修改Ignite的工作目录指向,也没有把卷挂载到Ignite默认读取的路径,所以无论怎么调整挂载路径,Ignite都会优先找默认的/ignite/work路径,挂载自然不生效。日志开头的SLF4J提示只是日志实现缺失的警告,不是启动失败的核心原因。另外你PV配置里的权限注释是其他组件的遗留参考内容,照搬配置不适用于Ignite部署场景。 - OpenShift权限限制:OpenShift默认使用随机非root UID运行容器,官方Ignite镜像内
/ignite路径默认仅UID 1000的内置ignite用户有写入权限,随机UID没有目录操作权限,就算挂载路径正确,也会抛出无法创建目录的错误。另外你配置的hostPath类型PV如果没有提前给节点上的源目录配置开放写入权限,也会触发同类报错。
修复步骤
方案1:直接使用Ignite默认路径(配置改动最小)
- 修正卷挂载路径,将StatefulSet中work-vol的挂载点从
/tmp/work调整为/ignite/work,其余存储、WAL、归档卷如果要被Ignite识别,要么挂载到Ignite默认对应子路径,要么显式配置路径参数。 - 解决目录权限问题:
- 测试环境可直接给节点上hostPath对应的
/opt/work等存储目录执行chmod 777 目录路径开放写入权限; - 生产环境可在StatefulSet的pod spec中添加securityContext配置,指定fsGroup让容器进程对挂载卷有写入权限,参考配置:
- 测试环境可直接给节点上hostPath对应的
spec: securityContext: fsGroup: 1000 runAsUser: 1000
如果OpenShift的SCC限制不允许固定UID,可加一个initContainer在启动前提前给挂载目录授权,参考:
initContainers: - name: perm-fix image: apacheignite/ignite:2.13.0 command: ["sh", "-c", "chmod -R 777 /ignite/work /tmp/storage /tmp/wal /tmp/walarchive"] volumeMounts: - name: work-vol mountPath: /ignite/work - name: storage-vol mountPath: /tmp/storage - name: wal-vol mountPath: /tmp/wal - name: walarchive-vol mountPath: /tmp/walarchive
方案2:自定义Ignite存储路径(保留你当前的挂载路径配置)
如果不想改现有挂载点,需要显式给Ignite传入路径参数覆盖默认配置,在容器的JVM_OPTS环境变量中追加路径定义,示例:
- name: JVM_OPTS value: "-DIGNITE_WAL_MMAP=false -DIGNITE_WORK_DIR=/tmp/work -DIGNITE_STORAGE_DIR=/tmp/storage -DIGNITE_WAL_DIR=/tmp/wal -DIGNITE_WAL_ARCHIVE_DIR=/tmp/walarchive"
配置后Ignite就会读取你挂载到/tmp下的各个路径,不会再去找默认的/ignite/work,注意同样要按上面的方法配置对应目录的写入权限。
注意:如果你在
ignite-node-cfg.xml配置文件中单独配置了数据存储、WAL路径,需要保证配置的路径和实际卷挂载路径完全一致,否则配置不会生效。
内容的提问来源于stack exchange,提问作者Rameish
相关产品推荐
相关产品推荐

